news 2026/5/26 6:46:56

【Cortex-Mx系列的SCB关键寄存器浅谈】之一:CPUID寄存器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Cortex-Mx系列的SCB关键寄存器浅谈】之一:CPUID寄存器
在基于ARM Cortex-Mx(x>=0)的嵌入式MCU软件开发中,有时候会经常遇到让人头疼的类似HardFault硬件故障的问题,这个时候你可能就需要使用SCB的一些关键寄存器来进行问题分析了。那究竟什么是SCB?SCB又有哪些关键寄存器呢?Keil里又怎么查看SCB寄存器的值呢?后续连载文章将带大家一起来看下SCB的相关的关键寄存器,主要包括含义解释、字段说明和如何应用等方面。
什么是SCB?
SCB,即System Control Block,系统控制块,是ARM Cortex-M处理器内核中的一个关键模块,负责系统级的控制和管理功能(异常、复位、、低功耗等),具体功能主要包括:
系统异常配置与控制;
处理器特性控制;
向量表重定位;
系统复位与状态查询;
端序配置(配置大端模式和小端模式)。
而本文主要阐述系统复位与状态查询功能,即通过查看一些关键寄存器来进行异常诊断和错误分析。
SCB有哪些关键寄存器呢?
当然,不同Cortex-M版本的SCB所拥有的寄存器种类是存在差异的,因此要看具体使用的是哪个版本的Cortex-M。
连载文章将以常用的Cortex-M4为例进行介绍。 我们需要打开core_cm4.h文件,搜索SCB,就能看到一些相关的内容:



包含了SCB的相关寄存器定义及其寄存器的位定义,并且有具体解释说明。
为了让大家更好地理解,在介绍各个寄存器之前,我们先来看下怎么样在Keil里查看这些寄存器?
最直观的方式:
进入仿真,打开Watch窗口,直接在Name栏里输入“SCB”并按回车键即可看到SCB所包含的寄存器信息:

也可以通过直接输入寄存器地址信息来查看寄存器的值:
进入仿真,打开Memory窗口,输入SCB的基地址0xE000ED00按回车即可:

图中标注了第一个寄存器CPUID的值。
有了以上的数据信息后,接下来再逐一看看各个寄存器吧。
为了便于大家更好地理解,咱们循序渐进,以每篇文章仅介绍一个寄存器的方式进行,今天先介绍CPUID寄存器。
CPUID
CPU Identification Register,只读的CPU身份信息寄存器,用于读取处理器的内核版本和架构信息,具体包括:
处理器型号(如Cortex-M3/M4/M7 等);
架构版本(如ARMv7-M、ARMv8-M);
实现厂商(如ARM或其他授权厂商);
其他硬件特性(如是否支持浮点单元、调试功能等);
该寄存器的32位字段结构如下表所示:
字段名
位域
功能描述
Implementer
[31:24]
厂商编码(如 0x41 表示 ARM)
Variant
[23:20]
处理器变种(大版本修订号,如 0x1 表示版本 1)
Constant
[19:16]
固定值 0xF(表示 Cortex-M 系列)
PartNo
[15:4]
处理器型号(如 0xC23 表示 Cortex-M3,0xC24 表示 Cortex-M4)
Revision
[3:0]
小版本修订号(如 0x1 表示第一版硅片)
作者用的是ARM Cortex-M4 MCU,看仿真后的CPUID值是0x410FC241,对号入座,厂商编码0x41、大版本修订号0、系列Cortex-M、处理器型号Cortex-M4、小版本修订号1。
那这个CPUID有什么应用价值吗?当然有:
代码移植与兼容性检查:
通过读取 Implementer 和 PartNo,软件可以动态识别处理器型号,从而启用特定优化或规避硬件缺陷(例如勘误表中的问题);
功能检测:
例如,通过 PartNo 判断是否支持浮点单元(FPU)或 DSP 指令(Cortex-M3不支持,Cortex-M4/M7支持),以决定是否启用相关功能;
调试与诊断:
在调试时,通过 Revision 和 Variant 字段确认芯片的修订版本,以辅助定位硬件相关问题。
那怎么样在代码里访问呢?可以参考以下两种方式来实现:
复制
  1. /*方式一:直接通过读取寄存器的方式*/
  2. uint32_tcpuid =0
  3. uint32_tread_cpuid(void)
  4. {
  5. cpuid = SCB->CPUID;
  6. returncpuid;
  7. }
  8. /*方式二:间接通过读取寄存器地址的方式*/
  9. //寄存器访问记得加上关键字volatile
  10. uint32_tcpuid =0
  11. #define CPUID (*(volatileuint32_t*)(SCB_BASE +0x00UL))
  12. voidread_cpuid(void)
  13. {
  14. cpuid = CPUID;
  15. uint8_timplementer = (cpuid >>24) &0xFF;// 提取厂商
  16. uint16_tpart_no = (cpuid >>4) &0xFFF;// 提取型号
  17. //可以继续提取其他字段
  18. ……
  19. }
以下是对两种代码方式的实测结果:


实测结果证实了两种读取方式都可以正常读取到CPUID寄存器的值,这样应用层就可以根据自身需要来解析和使用了。
下一篇文章作者将介绍ICSR(中断控制与状态寄存器)。


---------------------
作者:dffzh
链接:https://bbs.21ic.com/icview-3461486-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。v

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 8:00:35

Meta 的DDC网络架构案例分享

转自微信号:牛逼的ITAI工作负载特有的"低熵、突发、大象流"特征,使得基于传统以太网的架构在万卡 GPU集群中遭遇严重性能瓶颈。Meta基于博通的 Jericho系列芯片研发了——DSF(Disaggregated Scheduled Fabric)无损确定性…

作者头像 李华
网站建设 2026/5/22 20:57:35

TranslucentTB安装难题:5步彻底解决任务栏透明化失败问题

TranslucentTB安装难题:5步彻底解决任务栏透明化失败问题 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB "为什么我的任务栏就是透明不了?"——这是无数Windows用户在安装TranslucentTB…

作者头像 李华
网站建设 2026/5/25 7:04:51

鸣潮工具箱WaveTools完整使用指南:从入门到精通

鸣潮工具箱WaveTools完整使用指南:从入门到精通 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 鸣潮工具箱WaveTools作为一款专为《鸣潮》游戏设计的辅助工具,为玩家提供了从游戏启…

作者头像 李华
网站建设 2026/5/22 18:39:01

Elsevier Tracker:科研投稿智能管理终极助手

Elsevier Tracker:科研投稿智能管理终极助手 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为追踪论文审稿进度而烦恼吗?Elsevier Tracker这款免费Chrome插件将彻底改变您的科研投稿体验…

作者头像 李华
网站建设 2026/5/23 11:09:13

OpenRPA终极指南:免费企业级RPA工具快速上手与完整配置

OpenRPA终极指南:免费企业级RPA工具快速上手与完整配置 【免费下载链接】openrpa Free Open Source Enterprise Grade RPA 项目地址: https://gitcode.com/gh_mirrors/op/openrpa 在数字化转型浪潮中,企业如何快速部署高效的自动化解决方案&#…

作者头像 李华