第九章 STM32中断应用

一、中断概述

中断时出现某些意外需要主机干预,机器能自动停止运行的程序,转入新的处理的程序,处理完之后返回程序被暂停的程序,继续运行。

异常就是中断,中断就是异常。

异常分为:系统异常和外部中断。

二、NVIC介绍

NVIC是嵌套向量中断控制器,控制芯片中断的功能。

一般来说,使用ISER(使能中断)、ICER(失能中断)和IP(设置中断优先级)寄存器。

(不常用)

https://cdn.jsdelivr.net/gh/weixuna/MyPic/24/5/image_a55375ca0cca80086903ef6aa7ee9e07.png

三、优先级

中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级。如果抢占优先级相同,九比较子优先级,如果都相同,比较硬件中断编号,编号越小,优先级越高

https://cdn.jsdelivr.net/gh/weixuna/MyPic/24/5/image_de37c45ad3b6423601d0f44213e25f99.png

四、优先级分组

优先级分组由外设SCB的应用程序中断和复位控制寄存器AIRCR的PRIGROUP[10:8]决定,主优先级=抢占优先级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 配置中断优先级分组:抢占优先级和子优先级
* 形参如下:
* @arg NVIC_PriorityGroup_0: 0bit for 抢占优先级
* 4 bits for 子优先级
* @arg NVIC_PriorityGroup_1: 1 bit for 抢占优先级
* 3 bits for 子优先级
* @arg NVIC_PriorityGroup_2: 2 bit for 抢占优先级
* 2 bits for 子优先级
* @arg NVIC_PriorityGroup_3: 3 bit for 抢占优先级
* 1 bits for 子优先级
* @arg NVIC_PriorityGroup_4: 4 bit for 抢占优先级
* 0 bits for 子优先级
* @ 注意 如果优先级分组为 0,则抢占优先级就不存在,优先级就全部由子优先级控制
*/
void NVIC_PriorityGroupConfig(uint32_t PriorityGroup)
{
// 检查参数
assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
// 设置优先级分组
NVIC_SetPriorityGrouping(PriorityGroup);
}

https://cdn.jsdelivr.net/gh/weixuna/MyPic/24/5/image_0779d2ab9fa55ff33a7b9526a2fe24db.png

五、中断编程

配置中断一般使用三个:

1、使用 HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) 函数配置中断优先级分组。一般默认是 NVIC_PRIORITYGROUP_4 分组 4。

2、使用 HAL_NVIC_SetPriority (IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) 函数配置具体外设中断通道的抢占优先级和子优先级。

3、使用 HAL_NVIC_EnableIRQ 函数使能中断请求。