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 引脚时非常高效,无需“读-改-写”三步操作,直接通过位带别名地址写入即可,适合实时性要求高的开关量控制。
Cortex-M0 内部架构框图 Cortex-M0 处理器核心内部架构 Cortex-M0 内核 ARMv6-M 架构 三级流水线 NVIC 嵌套向量中断控制器 1-32 外部中断 调试子系统 SWD 串行线调试 2 线接口 内部系统总线(冯·诺依曼统一地址空间) Flash 存储器 程序存储 SRAM 数据存储 外设总线 GPIO/UART/Timer 说明:Cortex-M0 通过统一总线连接 Flash、SRAM 和外设,NVIC 直接与内核耦合,实现低延迟中断响应。

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 任务隔离。
Cortex-M0 工作模式与特权级别状态转换 工作模式与特权级别状态转换 线程模式(特权级) 正常程序执行 可访问所有资源 线程模式(用户级) 受限访问 需 SVC 调用进入特权 处理模式(特权级) 异常/中断服务程序 异常/中断触发 异常返回(EXC_RETURN) 写 CONTROL[0]=1 执行 SVC 指令 说明:复位后默认线程模式特权级;异常触发后进入处理模式;用户级需通过 SVC 系统调用切换回特权级。

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),驱动任务切换。