stm32HAL库中断处理过程(以stm32f4中串口1中断为例)

发布时间 2023-05-22 16:31:50作者: 了不起的亮亮

一、中断过程

前后台系统中,在主程序执行的过程中,中断突然发生,此时主程序停止往下执行,并将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()函数中直接编写中断服务函数。