STM32 中断非常强大,每个外设都可以产生中断。
异常类型
F429 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有 10 个,外部中断有 91 个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。
NVIC
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。
中断配置
在配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器,ISER 用来使能中断,ICER 用来失能中断,IP 用来设置中断优先级。
中断优先级
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx(在 F429 中,x=0…90)
在 F429 中,只使用了高 4bit,如下所示
用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。
优先级分组
优先级的分组由内核外设 SCB 的应用程序中断及复位控制寄存器 AIRCR 的PRIGROUP[10:8]位决定,F429 分为了 5 组,具体如下:主优先级=抢占优先级
设置优先级分组可调用库函数 NVIC_PriorityGroupConfig()实现
抢占优先级与响应优先级
高抢占优先级可以嵌套低抢占优先级的中断。
两者抢占优先级相同,那么无论响应优先级是什么关系,这两者都没有嵌套关系。
假如两者同时发生,且抢占优先级相同,则根据响应优先级顺序执行;加入此时他们的相应优先级也相同,则根据中断清单表排位顺序执行,序号越小,对应优先级越高!
中断编程
在配置每个中断的时候一般有 3 个编程要点:
1、使能外设某个中断,这个具体由每个外设的相关中断使能位控制。比如串口有发送,完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
2、初始化 NVIC_InitTypeDef 结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。
3、编写中断服务函数
注意:配置中断优先级分组一次后就不需要重复配置了,除非需要更改
来源:CSDN
作者:kikaku
链接:https://blog.csdn.net/qq_43607588/article/details/104172195