一. 外部中断结构体
1. EXTI_InitTypeDef 结构体
字段 | 描述 |
---|
EXTI_Line | 中断线标号 |
EXTI_Mode | 中断模式 |
EXTI_Trigger | 触发方式 |
EXTI_LineCmd | 中断线使能 |
2. 中断线标号
中断线标号 | 解释 |
---|
EXTI_Line0 ~~ EXTI_Line22 | 中断线0~~中断线22 |
中断/事件线 | 输入源 |
---|
EXTI0 | PX0(X可为A、B、C、D、E、F~~) |
EXIT1 | PX1(X可为A、B、C、D、E、F~~) |
EXTI2 | PX2(X可为A、B、C、D、E、F~~) |
EXIT3 | PX3(X可为A、B、C、D、E、F~~) |
EXTI4 | PX4(X可为A、B、C、D、E、F~~) |
EXIT5 | PX5(X可为A、B、C、D、E、F~~) |
EXTI6 | PX6(X可为A、B、C、D、E、F~~) |
EXIT7 | PX7(X可为A、B、C、D、E、F~~) |
EXTI8 | PX8(X可为A、B、C、D、E、F~~) |
EXIT9 | PX9(X可为A、B、C、D、E、F~~) |
EXTI10 | PX10(X可为A、B、C、D、E、F~~) |
EXIT11 | PX11(X可为A、B、C、D、E、F~~) |
EXTI12 | PX12(X可为A、B、C、D、E、F~~) |
EXIT13 | PX13(X可为A、B、C、D、E、F~~) |
EXTI14 | PX14(X可为A、B、C、D、E、F~~) |
EXIT15 | PX15(X可为A、B、C、D、E、F~~) |
EXTI16 | PVD输出 |
EXIT17 | RTC闹钟事件 |
EXTI18 | USB OTG FS唤醒事件 |
EXIT19 | 太网唤醒事件 |
EXTI20 | USB OTG HS(在FS中配置)唤醒事件 |
EXIT21 | 连接到RTC入侵和时间戳事件 |
EXTI22 | 连接到RTC唤醒事件 |
3. 中断模式
字段 | 解释 |
---|
EXTI_Mode_Interrupt | 中断请求 |
EXTI_Mode_Event | 事件请求 |
4. 触发方式
字段 | 解释 |
---|
EXTI_Trigger_Falling | 下降沿触发 |
EXTI_Trigger_Rising | 上升沿触发 |
EXTI_Trigger_Rising_Falling | 上升沿与下降沿触发 |
5. 中断服务函数名
字段 | 解释 |
---|
EXTI0_IRQHandler | 中断线0服务函数 |
EXTI1_IRQHandler | 中断线1服务函数 |
EXTI2_IRQHandler | 中断线2服务函数 |
EXTI3_IRQHandler | 中断线3服务函数 |
EXTI4_IRQHandler | 中断线4服务函数 |
EXTI9_5_IRQHandler | 中断线5 ~ 9服务函数 |
EXTI15_10_IRQHandler | 中断线10 ~ 15服务函数 |
二. 外部中断配置
1. 配置时钟与建立引脚与中断线联系
操作 | 调用函数/结构体 |
---|
开启SYSCFG时钟 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); |
设置IO与中断线映射关系 | SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,EXTI_PinSource0) |
2.配置GPIO为输入
详解GPIO笔记
3.配置EXTI_InitTypeDef结构体
操作 | 调用函数/结构体 |
---|
定义外部中断配置结构体 | EXTI_InitTypeDef |
配置中断线标号 | EXTI_Line |
配置中断模式 | EXTI_Mode |
配置触发方式 | EXTI_Trigger |
使能中断线 | EXTI_LineCmd |
初始化外部中断配置 | EXTI_Init(&EXTI_InitStructure); |
4. 配置NVIC中断结构体
详解NVIC笔记
5. 编写中断服务函数
操作 | 函数 |
---|
判断外部中断发生 | EXTI_GetITStatus(中断线标号) |
清除中断标志位 | EXTI_ClearITPendingBit(中断线标号); |
2. 例
配置PB14为外部中断
void exti_init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource14);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line13);
}
}