STM32中断
什么是中断?
打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续执行,就叫中断
作用:
- 实时控制
在确定时间内对相应事件作出响应,如:温度监控
- 故障处理
检测到故障,需要第一时间处理,如:
- 数据传输
不确定数据何时会来,如:串口数据接受
意义:高效处理紧急程序,不会一直占用CPU资源
以STM32F1系列为例:
- GPIO中断简图
1、NVIC
-
NVIC基本概念
-
Nested vectored interrupt controller,嵌套向量中断控制器,属于内核
-
支持256个中断(16内核 + 240外部)
-
256个优先级、允许剪裁
-
-
NVIC相关寄存器介绍
NVIC相关寄存器 | 位数 | 寄存器个数 | 备注 |
---|---|---|---|
中断使能寄存器(ISER) | 32 | 8 | 每个位控制一个中断 |
中断除能寄存器(ICER) | 32 | 8 | 每个位控制一个中断 |
应用程序中断及复位控制寄存器(AIRCR) | 32 | 1 | 位[10:8]控制优先级分组 |
中断优先级寄存器(IPR) | 8 | 240 | 8个位对应一个中断,STM32只使用高4位 |
还有:中断挂起、解挂、激活标志等非常用功能
- NVIC工作原理
-
STM32中断优先级基本概念
- 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断
- 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
- 自然优先级:即中断向量表的优先级。抢占和响应都相同的 情况下,自然优先级高的先执行
- 数值越小,优先级越高
-
STM32中断优先级分组
优先级分组 | AIRCR[10:8] | IPRx bit[7:4]分配 | 分配结果 |
---|---|---|---|
0 | 111 | None : [7:4] | 0位(0个)抢占优先级,4位(16个)响应优先级 |
1 | 110 | [7] : [6:4] | 1位(2个)抢占优先级,3位(8个)响应优先级 |
2 | 101 | [7:6] : [5:4] | 2位(4个)抢占优先级,2位(4个)响应优先级 |
3 | 100 | [7:5] : [4] | 3位(8个)抢占优先级,1位(2个)响应优先级 |
4 | 011 | [7:4] : None | 4位(16个)抢占优先级,0位(0个)响应优先级 |
一个工程中,一般只设置一次中断优先级分组
- STM32 NVIC的使用
- 设置中断分组
- AIRCR[10:8],HAL_NVIC_SetPriorityGrouping
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
- 设置中断优先级
- IPRx bit[7:4],HAL_NVIC_SetPriority
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);
- 使能中断
- ISERx,HAL_NVIC_EnableIRQ
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
- 设置中断分组
2、EXTI
-
EXTI基本概念
- External(Extended) interrupt/event Controller,外部(扩展)中断事件控制器
- 包含20个产生事件/中断请求的边沿检测器,即总共20条EXTI线(F1)
中断和事件的理解:
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC
-
EXTI主要特征
- 每条EXTI先都可以单独配置:
- 选择类型(中断或事件)
- 触发方式(上升沿,下降沿或者双边沿触发)
- 支持软件触发
- 开启/屏蔽
- 有挂起状态位
- 每条EXTI先都可以单独配置:
-
EXTI工作原理
- 边沿检测
- 软件触发
- 中断屏蔽/清除
- 事件屏蔽
-
EXTI和IO映射关系
- AFIO:Alternate Function IO,即复用功能IO,主要用于重映射和外部中断映射配置
- 调试IO配置
- AFIO_MAPR[26:24],配置JTAG/SWD的开关状态
- 重映射配置
- AFIO_MAPR,部分外设IO重映射配置
- 外部中断配置
- AFIO_EXTICR1 ~ 4,配置EXTI中断线0 ~ 15对应到哪个具体IO口
- 调试IO配置
配置AFIO寄存器前要先使能AFIO时钟
__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0
-
EXTI与IO对应关系
- EXTI(x)[3:0]位控制P(X)(x)(F1)
- P(X)(x)映射到EXTI(x)
X: A ~ G
x: 0 ~ 15
- AFIO:Alternate Function IO,即复用功能IO,主要用于重映射和外部中断映射配置
-
STM32 EXTI的配置步骤(GPIO外部中断)
- 使能GPIO时钟
- 使能GPIO时钟
- 设置GPIO输入模式
- 上/下拉/浮空输入
- 使能AFIO时钟
- 设置AFIO时钟开启寄存器
- 设置EXTI和IO对应关系
- 选择PA ~ PG到底哪组IO对应EXTI输入线,AFIO_EXTICR
- 设置EXTI屏蔽,上/下沿
- 设置EXTI对应通道的屏蔽和上升/下降沿触发,IMR、RTSR/FTSR
- 设置NVIC
- 分3步,见前面内容
- 设计中断服务函数
- 编写对应中断的中断服务函数,清中断标志
步骤2 ~ 5使用HAL_GPIO_Init函数一步到位
- 使能GPIO时钟
-
STM32 EXTI的HAL库配置步骤(GPIO外部中断)
- 使能GPIO时钟
- __HAL_RCC_GPIOx_CLK_ENABLE()
- GPIO/AFIO/EXTI
- HAL_GPIO_Init,一步到位
- 设置NVIC
- 分3步,见前面内容
- 设计中断服务函数
- EXTIx_IRQHandler,中断服务函数,清中断标志
STM32仅有:EXTI0 ~ 4、EXTI9_5、EXTI15_10,7个外部中断服务函数
- 使能GPIO时钟
-
HAL库中断回调处理机制介绍