请阅读【嵌入式开发学习必备专栏】
文章目录
-
- OpenOCD 无法识别CPUID 问题
-
- ARM CPUID
- CPUID 特性
- CPUID 寄存器字段
OpenOCD 无法识别CPUID 问题
在使用OpenOCD 进行CPU debug的过程中有时会报出 无法识别CPUID的问题,本文将会介绍如何解决这个问题。首先我们来学习下什么是CPUID,以ARM Cortex-M 系列的Core为例进行介绍。
ARM CPUID
ARM 处理器的 CPUID 和 CPUID 基本寄存器是用于提供处理引擎(PE)识别信息的重要寄存器。这些寄存器帮助软件识别处理器的实现者、设备 ID 及其架构和版本等细节。以下是对 ARM CPUID 寄存器的详细说明。
CPUID 特性
- 功能: 提供处理引擎(PE)的识别信息,包括设备的实现者代码和设备 ID 号。
-
访问权限:
- 该寄存器只能通过特权访问。非特权访问将产生一个错误。
- 从 ARMv8.1-M 开始,当
DAUTHCTRL.UIDAPEN
(任意银行)设置时,该寄存器可通过非特权 DAP 请求访问。
-
实现与位置:
- 32 位只读寄存器,位于地址
0xE000ED00
。 - 安全软件可以通过
CPUID_NS
(位于0xE002ED00
)访问该寄存器的非安全版本。对于在非安全状态和调试器中执行的软件,地址0xE002ED00
为RES0
(读取为零)。 - 该寄存器在安全状态之间不进行切换。
- 32 位只读寄存器,位于地址
CPUID 寄存器字段
-
Implementer, bits [31:24]:
- 说明: 实现者代码。
-
值及含义:
-
0x41
: ‘A’ - ARM Limited。 - 非
0x41
: 表示非 ARM Limited 的实现者。
-
- 注意: ARM 可以分配未在手册中公布的代码。未被 ARM 分配的所有值均为保留值,不得使用。
-
Variant, bits [23:20]:
- 说明: 变体编号。实现定义的变体编号。通常用于区分不同产品变体或产品的主要修订。
- 值及含义: 作为实现定义值读取。
-
Architecture, bits [19:16]:
- 说明: 定义处理引擎实现的架构。
-
值及含义:
-
0b1100
: ARMv8-M 架构,无主扩展。 -
0b1111
: ARMv8-M 架构,带主扩展。 - 其他所有值均为保留值。
-
-
PartNo, bits [15:4]:
- 说明: 部件编号。实现定义的设备主要部件编号。
- 值及含义: 作为实现定义值读取。
-
Revision, bits [3:0]:
- 说明: 修订号。实现定义的设备修订号。
- 值及含义: 作为实现定义值读取。
在openocd/src/target/cortex_m.h
中对ARM Cortex-M 系列core 实现了CPUID的宏,如下:
#define CPUID 0xE000ED00
#define ARM_CPUID_IMPLEMENTOR_POS 24
#define ARM_CPUID_IMPLEMENTOR_MASK