RT1052之NVIC中断系统
一、简介
The Nested Vectored Interrupt Controller (NVIC) collects up to 240 interrupt request, sources and provides an interface to the Cortex-M7 core.
NVIC中文名称为可嵌套向量中断控制器:
-
可嵌套:当处理器在处理一个中断时,若此时有另外一个优先级更高的中断到来,这个优先级更高的中断可以打断优先级低的中断。当处理器处理完优先级高的中断后,回重新回来处理刚刚没处理完的低优先级中断。
-
向量:向量和非向量的区别在于:
- 向量中断的情况下,每个中断源会有特定地址的函数入口,当一个中断触发了,硬件会自动跳转到相应的中断函数。
- 非向量中断的情况下,CPU要在收到中断信号后,自己去读取所有的中断标志位,自己去判断当前是哪个中断源发出的中断后,再去做相应的处理。
可见,中断向量的效率要高很多。
二、相关概念
- 中断请求,相当于一个信号,比如串口收到数据了,要发送一个中断请求信号告诉CPU,要去中断函数进行相关处理了。
- 中断号,CPU 通过中断号来区分不同的中断,有点类似于中断的学号,一个号对应一个中断,RT1052 拥有151个中断号。
- 中断优先级,在RT1052 中每个中断号拥有一个优先级,这个就类似于你在看电视,突然你刚刚烧的水烧开了,本来你想去关煤气,结果女朋友来电话了,先去关煤气,还是先接女朋友电话?这就由优先级去决定了。在Cortex-M里面,中断优先级越小,优先级越高。
- 中断优先级分组,用来分配抢占优先级和子优先级的位数。
- 中断服务函数,最终我们要把我们处理这个中断信号的过程写进这个函数内。
三、中断库
1、库函数![中断操作的库函数](https://img-blog.csdnimg.cn/20210221225936763.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAyMTY0OA==,size_16,color_FFFFFF,t_70)
2、中断号
在MIMXRT1052.h文件中有详细定义。
3、中断服务函数名称
在startup_MIMXRT1052.s启动文件内有详细定义。
/* eg: void SysTick_Handler(void) */
void xxx_Handler(void)
{
/* add your code here */
}
4、中断优先级分组
三、中断系统初始化实例
/* 步骤一:设置中断优先级分组*/
Set_NVIC_PriorityGroup(Group_4); // 只有Group_4 - Gruop_7
/* 步骤二:设置中断优先级*/
/* 获取在Group4的情况下,主优先级为0,子优先级
为0的32位编码保存到priority_code,下一步要使用 */
uint32_t priority_code = NVIC_EncodePriority (Group_4, 0, 0);
/* 传入中断号和上一步的priority_code */
NVIC_SetPriority(GPIO5_Combined_0_15_IRQn, priority_code);
/* 步骤三:使能中断 */
NVIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);
/* 步骤四:撰写中断函数 */
void GPIO5_Combined_0_15_IRQHandler(void)
{
/* 注意,在中断函数内,还需要将中断标志位
清除,否则中断会一直产生,导致CPU卡死 */
/* your code here */
}
注意,我们上面一番折腾只是打开了CPU的中断处理,但是触发中断的信号有可能还有另外在去打开,比如GPIO的上升沿触发中断或者下降沿触发中断,这就需要再去配置GPIO,以使GPIO在恰当的时候发出信号告诉CPU该去中断里面处理了。
四、参考文献
1、[野火]《i.MX RT库开发实战指南》.pdf
2、IMXRT1052RM.pdf