概念:
中断、中断源、中断向量、中断优先级、中断服务函数等。
ARMCortexM3支持256个中断,包括16个内核中断和240个外设中断,拥有256个中断优先级别。
STM32中断通道可能会由多个中断源共用,某个中断服务函数入口处需要一个判断机制,辨别是哪个中断。只能判断引脚号,不能判断端口号,如下:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
}
if(GPIO_Pin==GPIO_PIN_13)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
}
}
STM32有两个优先级:抢占优先级和响应优先级,每个中断都需要指定这两种优先级。例如指定EXTI0为抢占优先级。
CortexM3内核中有一个嵌套向量中断控制器,NVIC,的设备,对中断进行统一的协调和控制。其中最主要的工作就是控制中断使能和确定中断优先级。
STM32外部中断:
STM32芯片有16个外部中断源EXTI0~EXTI15,分别对应着7个中断向量,也就是对应着7个中断服务函数。
- EXTI0、EXTI1、EXTI2、EXTI3、EXTI4属于专用外部中断源,对应入口0~入口4.
- EXTI5~EXTI9属于共用外部中断源,对应入口5。
- EXTI10~EXTI15属于共用外部中断源,对应入口6。
EXTI0的连接引脚是PA0~PG0,即每个端口组的0号引脚,其他EXTI1等以此类推。
外部中断的触发条件:
上升沿触发,下降沿触发,双边沿触发,不能使用电平触发的方式,只能采用边沿触发。
外部中断程序设计步骤:
传统的STM32外部中断设计步骤:
- 将GPIO初始化为输入端口
- 配置相关的I/O引脚与中断线的映射关系
- 设置该I/O引脚对应的中断触发条件
- 配置NVIC,并使能中断
- 编写中断服务函数
基于STM32CubeMx的外部中断设计步骤:
- 在STM32CubeMx中指定引脚为中断模式,配置中断初始化参数,包括下拉输入、对应边沿触发,使能NVIC等等
- 重写I/O引脚对应的中断回调函数,void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
外部中断跳转:在最后把回调函数重写到main.c中,多个中断只需写在一个回调函数中即可。
回调函数重写:检测到对应开关GPIO口中断则使小灯状态翻转