学习STM32F103C8T6 中断
NVIC 是 Cortex-M 内核的一部分,负责管理中断的优先级和使能。
·
1. 中断向量表(Interrupt Vector Table)
- 物理位置:位于 Flash 起始地址(0x00000000),存储各中断服务函数(ISR)的入口地址。
- 组成:
- 前两个条目为栈顶指针(MSP)和复位向量(Reset Handler)。
- 后续条目对应各类中断源(如 TIM2、USART1 等)的 ISR 地址。
- 重定位:可通过
SCB->VTOR寄存器将向量表移至 SRAM(如调试时)。
示例结构:
地址 中断类型
----------------------
0x00000000 MSP
0x00000004 Reset Handler
0x00000008 NMI
0x0000000C HardFault
...
0x00000040 EXTI0_IRQHandler
0x00000044 EXTI1_IRQHandler
...
2. NVIC(嵌套向量中断控制器)
NVIC 是 Cortex-M 内核的一部分,负责管理中断的优先级和使能。核心寄存器包括:
- ISER(中断使能寄存器):每个位对应一个中断源,置 1 使能中断。
- ICER(中断清除寄存器):置 1 禁用中断。
- IPR(中断优先级寄存器):每个中断对应 8 位,实际使用位数由芯片决定(如 STM32 通常用 4 位)。
- STIR(软件触发中断寄存器):通过写值触发指定中断。

3. 优先级分组与抢占机制
- 优先级位分配:
- STM32 将 4 位优先级分为抢占优先级和子优先级。
- 通过
NVIC_PriorityGroupConfig()配置分组方式(如NVIC_PriorityGroup_2表示 2 位抢占 + 2 位子优先级)。
![]() |
||
- 抢占规则:
- 高抢占优先级的中断可打断低抢占优先级的 ISR(嵌套)。
- 相同抢占优先级的中断按相应优先级先级排队
- 抢占优先级和响应优先级都相同,按照自然优先级进行排队
4. 中断处理流程(硬件级)
- 中断发生:外设(如 USART)置位对应中断标志位。
- NVIC 判断:检查中断是否使能且优先级高于当前执行的代码。
- 上下文保存:
- CPU 自动保存 8 个寄存器(R0-R3、R12、LR、PC、PSR)到当前栈(MSP 或 PSP)。
- 压栈后 PC 指向向量表中对应中断的 ISR 地址。
- 执行 ISR:跳转到中断服务函数。
- 上下文恢复:
- ISR 执行完毕后,通过
BX LR指令触发硬件从栈中恢复寄存器。 - LR 寄存器的特殊值(如 0xFFFFFFF9)指示 CPU 执行中断返回流程。
- ISR 执行完毕后,通过
5. 特殊寄存器详解
SCB->AIRCR(应用中断和复位控制寄存器)
- 位 [10:8]:配置中断优先级分组(PRIGROUP 位段)。
- 位 [31:16]:写入密钥(0x05FA)以修改寄存器。
NVIC->IPRx(中断优先级寄存器)
- 每个寄存器管理 4 个中断的优先级。
- 例如
NVIC->IPR[0]管理中断 0~3 的优先级,每个中断占 8 位。
EXTI 控制器(外部中断)
- IMR(中断屏蔽寄存器):使能 / 屏蔽 EXTI 线,某一位置一对应的那条线就被屏蔽
- EMR(事件屏蔽寄存器):使能 / 屏蔽事件触发,使用较少
- RTSR/FTSR(上升 / 下降沿触发选择寄存器):配置触发条件。1允许上升沿触发/下降沿触发,0禁止触发。
- PR(挂起寄存器):中断发生后置位,需软件清零。检测到中断对应的位置一。清除位,在该位写1即可清除。

位19只适用于互联型产品,对于其他产品为保留位

6. 中断与异常的区别
- 中断:由外部设备或外设触发(如 GPIO、定时器)。
- 异常:由内核内部事件触发(如复位、错误、系统调用)。
- 异常同样通过向量表处理,但优先级固定(如复位最高,为 - 3;NMI 为 - 2)。
7. 性能考量
- 中断延迟:从外设产生中断到 ISR 执行的时间,主要由上下文保存和压栈操作决定。
- 临界区:使用
__asm("CPSID I")和__asm("CPSIE I")指令关闭 / 开启全局中断,需谨慎使用以避免死锁。
8. 图片参考

9. 代码实验





更多推荐




所有评论(0)