本帖最后由 dffzh 于 2025-6-13 17:16 编辑
#申请原创#
@21小跑堂
在基于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 | | | Variant | | 处理器变种(大版本修订号,如 0x1 表示版本 1) | Constant | | | PartNo | | 处理器型号(如 0xC23 表示 Cortex-M3,0xC24 表示 Cortex-M4) | Revision | | |
作者用的是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 字段确认芯片的修订版本,以辅助定位硬件相关问题。 那怎么样在代码里访问呢?可以参考以下两种方式来实现: /*方式一:直接通过读取寄存器的方式*/
uint32_t cpuid = 0;
uint32_t read_cpuid(void)
{
cpuid = SCB->CPUID;
return cpuid;
}
/*方式二:间接通过读取寄存器地址的方式*/
//寄存器访问记得加上关键字volatile
uint32_t cpuid = 0;
#define CPUID (*(volatile uint32_t *)(SCB_BASE + 0x00UL))
void read_cpuid(void)
{
cpuid = CPUID;
uint8_t implementer = (cpuid >> 24) & 0xFF; // 提取厂商
uint16_t part_no = (cpuid >> 4) & 0xFFF; // 提取型号
//可以继续提取其他字段
……
}
以下是对两种代码方式的实测结果:
实测结果证实了两种读取方式都可以正常读取到CPUID寄存器的值,这样应用层就可以根据自身需要来解析和使用了。
下一篇文章作者将介绍ICSR(中断控制与状态寄存器)。 |
@21小跑堂 管理员,你好,求原创审核哦!