一、中断过程
前后台系统中,在主程序执行的过程中,中断突然发生,此时主程序停止往下执行,并将CPU的当前状态保持在内核栈中(即:现场保护)。
然后跳转到中断服务函数的入口,并执行中断服务函数,当中断服务函数执行完后,再将之前保存在内核栈中的状态全部进行出栈,将状态恢复到发生中断之前(即:现场恢复),此时对于CPU来说,就好像从来没有发生过中断一样
二、中断管理器
中断可能不止一个,当有多个中断响应时,需要对中断执行的顺序进行管理。
为了管理这些中断,STM32对这些中断进行了中断分组,STM32将中断分为5个组:0-4;
同时,对每个中断设置了一个抢占优先级和响应优先级。分组配置是由分组配置是由SCB->AIRCR寄存器的bit10-8来定义的。具体分配关系如下:
AIRCR中断分组设置表
|
组 |
AIRCR[10:8] |
IP bit[7:4]分配情况 |
分配结果 |
|
0 |
111 |
0:4 |
0位抢占优先级,4位响应优先级 |
|
1 |
110 |
1:3 |
1位抢占优先级,3位响应优先级 |
|
2 |
101 |
2:2 |
2位抢占优先级,2位响应优先级 |
|
3 |
100 |
3:1 |
3位抢占优先级,1位响应优先级 |
|
4 |
011 |
4:0 |
4位抢占优先级,0位响应优先级 |
其中AIRCR寄存器来确定是用哪种分组;
IP寄存器的第7-4位,是相对应于分组的抢占优先级和响应优先级的分配比例。
例如组设置成3,那么此时管理所有的82个中断的中断优先级寄存器(IP寄存器),高4位中的最高3位是抢占优先级,低1位为响应优先级。
抢占优先级的级别高于响应优先级,而数值越小所代表的的优先级越高
抢占优先级、响应优先级的区别:
1、高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
2、抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
3、抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
4、如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
除此之外:需要注意的两点是:
1、 被打断的情况只与抢占优先级有关,和响应优先级无关。
2、 一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
三、中断的配置步骤以及其中配置函数介绍(STM32f4串口1,cubemx配置,使用hal库)
(1)CubeMX进行完基础的配置之后(时钟数配置,串口1配置,NVIC使能),生成项目工程代码。
(2)对于stm32提供的外设中断,中断函数定义已经在启动文件:startup_stm32f407xx.s中命名。

当需要用到单片机某个外设并需要开启其中断时,无论是cubemx配置外设还是自己编写函数,都需要将对应的外设初始化,建立这个外设的(.c)和(.h)文件。
初始化包括时钟使能、引脚配置、中断配置(中断优先级)。
此外还需要编写中断服务程序,也就是中断发生,进入中断之后该如何进行下一步。
例如串口1:cubemx初始化串口1,生成工程。初始化相关函数在usart.c和usart.h文件中。外设的中断服务函数都在stm32f4xx_it.c文件中,因此串口1的中断服务函数USART1_IRQHandler()也是:

对于hal库,中断服务函数统一在stm32f4xx_hal_uart.c中管理:

当然也可以直接在USART1_IRQHandler()函数中直接编写中断服务函数。