1. Cortex-M3中断与异常的基本概念
刚开始接触STM32开发时,很多人都会有一个误区:以为学习外部中断(EXTI)就是学完了中断系统的全部内容。实际上,EXTI只是STM32芯片厂商提供的一个外设,真正的中断管理系统在内核级别,由NVIC(嵌套向量中断控制器)和SCB(系统控制块)共同完成。
这里需要明确一个关键区别:中断和异常不是同一个概念。简单来说,中断是芯片外设产生的事件(比如GPIO引脚电平变化、串口接收到数据等),而异常是内核级别的事件(比如系统时钟滴答、内存访问错误等)。Cortex-M3内核设计了15个系统异常(编号1-15)和最多240个外部中断(编号16-255),但具体芯片厂商会根据实际需求进行裁剪。
我在实际项目中发现,理解NVIC和SCB的分工特别重要。NVIC负责管理所有外部中断的使能、挂起和优先级设置,但它管不了异常,甚至连中断优先级分组都无法自己完成。而SCB则负责系统级别的配置,包括优先级分组、向量表重定位等。这种分工合作的设计让Cortex-M3的中断系统既灵活又高效。
2. NVIC和SCB的协同工作机制
2.1 寄存器架构解析
NVIC和SCB都属于Cortex-M3内核的外设,它们的寄存器都位于系统控制空间(SCS,地址0xE000E000开始)中。NVIC的基地址是0xE000E100,SCB的基地址是0xE000ED00。
从编程角度看,ST的库文件core_cm3.h中定义了NVIC_Type结构体,这个结构体很好地反映了NVIC的寄存器布局:
typedef struct {
__IO uint32_t ISER[8]; // 中断使能寄存器
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; // 中断除能寄存器
uint32_t RESERVED1[24];
// ... 其他寄存器
__IO uint8_t IP[240]; // 中断优先级寄存器
} NVIC_Type;
每个ISER寄存器控制32个中断的使能,如果你用的是STM32F103系列,可能只用了前3个ISER寄存器(支持最多81个中断)。IP寄存器数组则专门用于设置每个中断的优先级,每个IP寄存器是8位的,但STM32通常只使用高4位。
SCB的结构更加复杂,其中与中断相关的最重要寄存器是AIRCR(应用程序中断及复位控制寄存器),它负责优先级分组配置。
2.2 优先级分组机制
这是最容易混淆的部分。NVIC的IP寄存器只能设置具体中断的优先级值,但如何解释这个优先级值(多少位用于抢占优先级,多少位用于子优先级)则由SCB的AIRCR寄存器决定。
AIRCR的PRIGROUP字段(bit[10:8])有3位,理论上可以支持8种分组方式,但STM32将其限制为5种实用分组:
| 分组编号 | 抢占优先级位数 |
|---|

2102

被折叠的 条评论
为什么被折叠?



