一、中断概念
- 中断是指CPU正在处理某个事件A,发生了另一件事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU处理事件B完成后,再回到原来的事件A(断点)继续执行,这一过程称之为中断。
- 引发中断的称为中断源
- 举例: 当你正在写作业时,做到一半又去吃饭,吃完饭后又回来接着原来的作业继续完成。
- 中断嵌套举例:当你正在写作业时,做到一半又去吃饭,突然又想上厕所,就先去上厕所,再去吃饭,吃完饭后又回来接着原来的作业继续完成。
二、NVIC介绍
- NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。M3 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。
- NVIC支持:256个中断(16个内核+240个外部);支持256个优先级。
- 但是对于ST公司来说,用不了M3内核中的所有中断以及中断优先级,进而对其进行了一定的裁剪。STM32F103中共有10个内核中断,60个外部中断,16个中断优先级;
使用的寄存器
typedef struct
{
__IO uint32_t ISER[8]; //中断使能寄存器
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; //中断清除寄存器
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; //中断设置优先级寄存器
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; //中断清除优先级寄存器
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; //中断有效位寄存器
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; //中断优先级寄存器
uint32_t RESERVED5[644];
__O uint32_t STIR; // 软触发中断寄存器
}NVIC_Type;
使用的较多的是:ISER、ICER、IP
三、中断优先级
- STM32F103支持60个可屏蔽中断,每个中断通道都具备自己的中断优先级控制字节,字节是8位,理论上每个外部中断优先级都可以设置0-255优先级等级,数字越小,优先级越高。STM32F103只用了4位(高四位)。
- 这4位被分成了两组,一组是抢占式优先级,一组是响应式优先级(亚优先级、副优先级),每个中断源都需要被指定这两种优先级,高优先级的中断事件会打断当前的主程序或者中断程序运行,俗称中断嵌套。
- 在抢占式优先级相同的情况下,通过看响应优先级来决定
- 决定优先级高低的主要是看抢占式优先级,抢占式优先级越高,也就是数值越小,优先级就越高,优先被执行。
- 当抢占式优先级和响应式优先级都相同时,就需要看位置了,位置越靠前,越优先执行
- 当有两个事件发生嵌套中断时。如果事件1,2的抢占式优先级一样,响应式优先级不同,响应式优先级高事件2的也不会打断事件1执行。
- 总结:要发生中断嵌套,首先要判断抢占式优先级,抢占式优先级越高,优先执行。抢占式优先级相同,响应式优先级的高低不会打断之前进行的中断,等之前的中断结束之后再执行下一个中断
把4位分配给抢占式优先级和响应式优先级。组号代表抢占式优先级分配的位数。例如:第3组就是3位分配了抢占式优先级,剩下的1位分配给了响应式优先级。一共五组。
NVIC_SetPriorityGrouping()
来进行抢占式优先级和响应式优先级的分配关系
四、中断配置
- 使能外设中断
- 设置中断优先级分组,确定抢占式优先级和响应式优先级的位数。初始化 NVIC_InitTypeDef 结构体
typedef struct
{
uint8_t NVIC_IRQChannel; // 中断通道
uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占式优先级
uint8_t NVIC_IRQChannelSubPriority; // 响应式优先级
FunctionalState NVIC_IRQChannelCmd; // 中断使能
} NVIC_InitTypeDef;
- 编写中断服务函数
文档信息
- 本文作者:magicianplus
- 本文链接:https://magicianplus.github.io/2024/12/28/%E7%AC%AC15%E7%AB%A0-STM32%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
Be the first person to leave a comment!