STM32的19个中断为:
- 线0~15:对应外部IO口的输入中断
- 线16:连接到PVD输出
- 线17:连接到RTC闹钟事件
- 线18:连接到USB唤醒事件
配置 GPIO 与中断线的映射关系的函数:
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
例如:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
中断初始化:
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
例如:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的
//参数初始化外设 EXTI 寄存器
以上中断结构体的成员说明:
EXTI_Line:中断线标号,取值范围为__EXTI_Line0~EXTI_Line15__;
EXTI_Mode:中断模式,取值为__EXTI_Mode_Interrupt__(中断)或__EXTI_Mode_Event__(事件);
EXTI_Trigger:触发方式,取值为__EXTI_Trigger_Falling__(下降沿)、EXTI_Trigger_Rising(上升沿)或__EXTI_Trigger_Rising_Falling__(任意电平);
EXTI_LineCmd:使能中断,取值__ENABLE__;
## 6 个 STM32 IO 口外部中断函数:
EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler //5~9 共用中断函数
EXPORT EXTI15_10_IRQHandle //10~15 共用中断函数
编写中断常使用到两个函数:
- 判断某个中断线上的中断是否发生:
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
- 清除某个中断线上的中断标志位:
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
常用的中断服务函数格式为:
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
{
中断逻辑…
EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
}
}
使用 IO 口外部中断的一般步骤:
- 初始化IO口为输入;
- 开启AFIO时钟;
- 设置IO口与中断线的映射关系;
- 初始化线上中断,设置触发条件等;
- 配置中断分组(NVIC),并使能中断;
- 编写中断服务函数;