2. Cortex-M0处理器核心:ARM Cortex-M0架构特点、寄存器组、工作模式、异常与中断向量表
ARM Cortex-M0 是 ARM 公司推出的最小、最低功耗的 32 位处理器核心,专为成本敏感和实时控制应用设计。它基于 ARMv6-M 架构,在 XMC1000 系列中作为主控核心,承担工业控制中的逻辑运算、信号采集与执行器驱动任务。理解其架构特点是掌握 XMC1000 开发的基础。
2.1 架构特点
Cortex-M0 采用冯·诺依曼架构(统一地址空间),指令总线和数据总线共享同一存储空间。其核心特性如下:
| 特性 | 描述 |
|---|---|
| 指令集 | 支持 Thumb / Thumb-2 子集,仅 56 条指令,代码密度高 |
| 流水线 | 三级流水线(取指、译码、执行),单周期多数指令 |
| 位带操作 | 支持位带区(Bit-Band),可对单个位进行原子操作 |
| 中断响应 | 内置嵌套向量中断控制器(NVIC),支持 1-32 个外部中断 |
| 低功耗 | 支持睡眠模式与深度睡眠模式,功耗可低至 1μA 以下 |
| 调试接口 | 提供 SWD(串行线调试)接口,仅需 2 根信号线 |
工业控制优势: Cortex-M0 的位带操作在控制寄存器或 I/O 引脚时非常高效,无需“读-改-写”三步操作,直接通过位带别名地址写入即可,适合实时性要求高的开关量控制。
2.2 寄存器组
Cortex-M0 提供 16 个 32 位通用寄存器(R0-R15),以及若干特殊功能寄存器。寄存器组是程序员直接操作的核心资源,理解其用途对编写高效控制代码至关重要。
| 寄存器 | 别名 | 功能描述 |
|---|---|---|
| R0-R12 | 通用寄存器 | 数据运算、地址暂存、函数参数传递(R0-R3) |
| R13 | SP(堆栈指针) | 主堆栈指针(MSP)或进程堆栈指针(PSP),用于栈操作 |
| R14 | LR(链接寄存器) | 保存子程序返回地址,异常返回时使用 EXC_RETURN |
| R15 | PC(程序计数器) | 指向当前执行指令地址,最低位为 Thumb 状态标志(必须为 1) |
| xPSR | 程序状态寄存器 | 组合了 APSR(算术标志)、IPSR(异常编号)、EPSR(执行状态) |
| PRIMASK | 中断屏蔽寄存器 | 置 1 时屏蔽所有可配置优先级的中断(除 NMI 和 HardFault) |
| CONTROL | 控制寄存器 | 选择堆栈指针(MSP/PSP)和特权级别 |
关键提示: 在 XMC1000 的工业控制编程中,R0-R3 常用于传递函数参数,R4-R11 需由被调用者保存(Callee-saved)。SP(R13)在复位后默认使用 MSP,进入异常时自动压栈 PC、LR、xPSR 等寄存器。
2.3 工作模式与特权级别
Cortex-M0 定义了两种工作模式和两种特权级别,用于隔离用户代码与系统代码,增强系统稳定性。
- 线程模式(Thread Mode): 正常程序执行模式,可运行在特权级或用户级。复位后默认进入线程模式(特权级)。
- 处理模式(Handler Mode): 异常或中断服务程序执行模式,始终运行在特权级。退出异常时自动返回线程模式。
特权级别通过 CONTROL 寄存器的 bit[0] 控制:
- 特权级(Privileged): 可访问所有寄存器、系统控制块(SCB)和 NVIC 配置。复位后默认特权级。
- 用户级(Unprivileged): 限制访问系统控制寄存器,需通过系统调用(SVC)请求特权服务。常用于 RTOS 任务隔离。
2.4 异常与中断向量表
Cortex-M0 使用向量表(Vector Table)来管理异常和中断入口地址。向量表位于存储器起始地址(默认 0x00000000),每个表项占 4 字节,存放对应异常/中断服务函数的入口地址。
2.4.1 异常类型
Cortex-M0 支持最多 32 个异常(包括系统异常和外部中断)。系统异常固定编号,外部中断编号从 16 开始。
| 异常编号 | 优先级 | 名称 | 描述 |
|---|---|---|---|
| 1 | -3(固定最高) | Reset | 系统复位,从向量表偏移 0x0004 加载 SP 和 PC |
| 2 | -2 | NMI | 不可屏蔽中断,用于紧急事件 |
| 3 | -1 | HardFault | 硬故障,处理所有不可恢复的错误 |
| 4-10 | 可配置 | 系统异常 | SVCall、PendSV、SysTick 等 |
| 16-47 | 可配置 | 外部中断 | XMC1000 外设中断(GPIO、UART、Timer 等) |
2.4.2 向量表布局
向量表的前 16 个表项为系统异常,第 16 项开始为外部中断。在 XMC1000 中,向量表默认位于 Flash 起始地址,可通过 SCB->VTOR 寄存器重定位到 SRAM。
/* XMC1000 向量表示例(简化) */
__attribute__((section(".vectors")))
void (* const g_pfnVectors[])(void) = {
(void (*)(void))((uint32_t)&__StackTop), /* 0x0000: 栈顶地址 */
Reset_Handler, /* 0x0004: 复位向量 */
NMI_Handler, /* 0x0008: NMI */
HardFault_Handler, /* 0x000C: 硬故障 */
0, 0, 0, 0, 0, 0, 0, 0, /* 保留 */
SVC_Handler, /* 0x002C: SVCall */
0, /* 保留 */
0, /* 保留 */
SysTick_Handler, /* 0x003C: SysTick */
/* 外部中断从 0x0040 开始 */
PORT0_IRQHandler, /* 外部中断 0 */
PORT1_IRQHandler, /* 外部中断 1 */
UART0_IRQHandler, /* 外部中断 2 */
/* ... 更多外设中断 */
};
注意事项: 向量表偏移 0x0000 存放的是栈顶地址(MSP 初始值),而非函数指针。复位后处理器自动从 0x0000 加载 SP,从 0x0004 加载 PC。编写启动文件时务必确保这两个表项正确。
2.4.3 中断优先级与嵌套
NVIC 支持 4 级可配置优先级(2 位优先级宽度),数值越小优先级越高。中断嵌套规则如下:
- 高优先级中断可抢占低优先级中断。
- 同级中断不互相抢占,需等待当前中断完成。
- NMI 和 HardFault 具有固定最高优先级(-2 和 -1),不可配置。
在 XMC1000 的工业控制应用中,通常将定时器中断设为最高优先级(0),确保 PWM 输出和周期采样不受其他中断干扰。
工业控制实践: 使用 PendSV(可挂起系统调用)和 SysTick(系统滴答定时器)实现 RTOS 任务调度。PendSV 优先级设为最低,避免阻塞高优先级中断响应。SysTick 用于生成固定时间片(如 1ms),驱动任务切换。