中断
打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行.
作用
- 实时控制:如定时器中断采集温度
- 故障处理:中断及时处理问题,而不是等待程序执行到问题处理(如if)
- 数据传输:中断接收串口数据处理,而不是等待程序执行(可能已经发生完毕或者接收残缺)
外部中断
每个GPIO都可以中断
NVIC
Nestedvectored interrupt controller
,嵌套向量中断控制器,属于内核。
- 包含16个内核中断,240个外部中断支持256个优先级,允许裁剪。
F103
包含10个内核中断,60个外部中断,16个中断优先级
中断向量表
- 一块固定的内存,4字节对齐,存放各个中断函数的首地址
- 中断向量表定义在启动文件中,发生中断,CPU执行相应的中断函数(main函数优先级最低)
NVIC工作原理
嵌套向量中断控制主要用于管理中断的优先级和嵌套关系。其核心功能包括:
- 中断使能/失能:通过ISER和ICER寄存器控制中断的开启和关闭,每个中断对应1位。
- 优先级管理:通过IPR(外部中断)和SHPR(内核中断)设置中断优先级。优先级分为抢占优先级和子优先级,抢占优先级决定嵌套关系,子优先级决定同级中断的响应顺序。
- 优先级分组:通过AIRCR寄存器设置优先级分组,支持多种抢占优先级和子优先级的分配方式。
- 中断嵌套:高抢占优先级的中断可以打断低优先级的中断,实现嵌套处理。
- 中断屏蔽:通过PRIMASK和BASEPRI寄存器实现全局或优先级屏蔽。
总结:NVIC通过灵活的优先级管理和嵌套机制,保证了STM32中断的高效处理和实时性。
中断优先级
- 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断
- 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
- 抢占和响应都相同的情况下,自然优先级越高的,先执行
- 自然优先级:中断向量表的优先级
- 上方的所有优先级都满足数值越小,优先级越高
中断分组
- 中断分组决定了抢占优先级和响应优先级在优先级值中的位宽分配
- 一般一个工程只中断分组一次,否则可能出现混乱
- 每个中断,你可以设置每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0
中断优先级判断
- 抢占优先级小则一定优先,然后比较响应,自然优先级
- 也可以通过计算优先级值来判断
<<n
是左移n
位,即 注意n是响应优先级比例
案例,分组2,比例2:2。
- 优先级分别是9,12,8,12
- 但是自然优先级6<13
- 最终顺序2,4,1,3
案例分组3,抢占和响应权重为3:1
中断号 | 抢占优先级 | 响应优先级 | 优先级值(十进制) | IPR寄存器值(十六进制) |
---|---|---|---|---|
RTC | 2 | 1 | (2 << 1)+1 | 5 |
EXTI0 | 3 | 1 | (3 << 1)+1 | 7 |
EXTI1 | 2 | 0 | (2 << 1)+0 | 4 |
Systick | 3 | 0 | (3 << 1)+0 | 6 |
NVIC使用
- 创建中断分组
- 设置中断优先级
- 使能中断