一、中断
中断: CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。
1、EXTI
EXTI:外部中断/事件控制器
上升沿:数字电平从低电平(0)变为高电平(1),那一瞬间。
下降沿:数字电平从高电平(1)变为低电平(0),那一瞬间。
EXTI 主要特性
EXTI 控制器的主要特性如下:
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求
多达 140 个 GPIO( STM32F405xx/07xx 和 STM32F415xx/17xx)通过以下方式连接到 16 个
外部中断/事件线
另外七根 EXTI 线连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB OTG FS 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件
● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
● EXTI 线 21 连接到 RTC 入侵和时间戳事件
● EXTI 线 22 连接到 RTC 唤醒事件
- NVIC
NVIC:嵌套向量中断控制器,作用是提供中断通道及中断的优先级控制。
NVIC :嵌套向量中断控制器,用于总体管理异常
Cortex-M4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
STM32F4并没有使用Cortex-M4内核的全部东西,而是只用了它的一部分。
STM32F40xx/STM32F41xx总共有92个中断
STM32F40xx/STM32F41xx的92个中断里面,包括10个内核中断和82个可屏蔽中断。
16 个可编程优先级(使用了 4 位中断优先级 )
中断管理:
首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。分组配置是在寄存器SCB->AIRCR中配置(注意:数字越小,优先级越高)
注意:数字越小,优先级别越高
抢占优先级 & 响应优先级区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
二、按键中断程序实现步骤
中断要添加的库函数文件:stm32f4xx_exti.c和stm32f4xx_syscfg.c
1、理解按键电路原理
S1按键连接PA0
S1按键未按下,PA0为高电平
S1按键 按下,PA0为低电平
按键按下瞬间为下降沿,松开瞬间为上升沿。
2、使能SYSCFG时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
3、 初始化IO口为输入。
GPIO_Init();
4、设置IO口与中断线的映射关系。
void SYSCFG_EXTILineConfig();
5、初始化线上中断,设置触发条件等。
EXTI_Init();
- 配置中断分组(NVIC),并使能中断。要设置之前要设置分组(一个系统当中只能有一次分组)
NVIC分组函数: NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
NVIC_Init();
7、 编写中断服务函数。中断服务函数可startup_stm32f40_41xxx.s中
EXTIx_IRQHandler();
8、清除中断标志位
EXTI_ClearITPendingBit();
函数说明:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
函数功能:初始化线上中断,设置触发条件
EXTI_InitTypeDef* EXTI_InitStruct:初始化线上中断结构体
typedef struct
{
uint32_t EXTI_Line; //中断线
EXTIMode_TypeDef EXTI_Mode; //中断模式
EXTITrigger_TypeDef EXTI_Trigger; //触发边沿
FunctionalState EXTI_LineCmd; //中断线使能
}EXTI_InitTypeDef;
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
函数功能:初始化线中断通道及优先级
NVIC_InitTypeDef* NVIC_InitStruct:初始化线中断通道及优先级结构体
typedef struct
{
uint8_t NVIC_IRQChannel; //中断通道,可在stm32f4xx.h 查找
uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级
uint8_t NVIC_IRQChannelSubPriority; //响应优先级
FunctionalState NVIC_IRQChannelCmd; //通道使能
} NVIC_InitTypeDef;