目录
外部中断简述
什么是外部中断
传统单片机与新型单片机外部中断区别
STM32外部中断请求
STM32中断线与IO口的对应
STM32 中断服务函数
外部中断与中断服务函数的对应
中断服务函数列表
STM32外部中断程序编写
常用的库函数
外部中断的一般配置步骤
外部中断简述
什么是外部中断
- 当某种外部事件发生时,单片机的中断系统将迫使 CPU 暂停正在执行的程序,从而进行中断事件的处理,中断事件处理完毕后,又返回被中断的程序处,继续执行
注:外部事件具体是指: 上升沿 、 下降沿 、 低电平 等
传统单片机与新型单片机外部中断区别
51单片机 | stm32单片机 |
两个IO口进行外部中断 | 全部IO口都可以作为外部中断 |
固定IO口 | 映射到IO端口 |
STM32外部中断请求
STM32的中断控制器支持19个外部中断/事件请求
- 线 0~15 :对应外部IO口的输入中断
- 线16 :连接到PVD输出
- 线17 :连接到RTC闹钟事件
- 线18 :连接到USB唤醒事件
STM32中断线与IO口的对应
- 每个IO口都可以对应作为中断,几个IO口为一组映射到一个中断线上
- 在同一时间,同一组中,只能有一个IO口映射到中断线
例:PB0 与 PA0 不可映射到同一中断线
STM32 中断服务函数
外部中断与中断服务函数的对应
注:上面是正点原子图,少一个EXTI0
IO口外部中断只有7个中断服务函数
- EXTI0~EXTI4 分别对应一个中断服务函数
- EXTI5~EXTI9 对应一个中断服务函数
- EXTI10~EXTI15 对应一个中断服务函数
中断服务函数列表
- EXTI0_IRQHandler
- EXTI1_IRQHandler
- EXTI2_IRQHandler
- EXTI3_IRQHandler
- EXTI4_IRQHandler
- EXTI9_5_IRQHandler
- EXTI15_10_IRQHandler
STM32外部中断程序编写
常用的库函数
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//设置IO口与中断线的映射关系
exp: GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
/******EXTI_Init函数******/
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线:触发方式等
typedef struct
{
uint32_t EXTI_Line; //指定要配置的中断线
EXTIMode_TypeDef EXTI_Mode; //模式:事件 OR中断
EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发
FunctionalState EXTI_LineCmd; //使能 OR失能
}EXTI_InitTypeDef;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/***********************/
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位
外部中断的一般配置步骤
/*初始化IO口为输入*/
GPIO_Init();
/****************/
/*开启IO口复用时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/****************/
/*设置IO口与中断线的映射关系*/
void GPIO_EXTILineConfig();
/***************/
/*初始化线上中断,设置触发条件等*/
EXTI_Init();
/***************/
/*配置中断分组(NVIC),并使能中断*/
NVIC_Init();
/***************/
/*编写中断服务函数*/
EXTIx_IRQHandler();
/***************/
/*清除中断标志位*/
EXTI_ClearITPendingBit();
/***************/