STM32学习记录之EXTI

EXTI简介

EXTI(Extern Interrupt)外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:上升沿/下降沿/双边沿/软件出发

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断

通道数:16个GPIO Pin,外部PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:中断响应/事件响应

流程:GPIO->AFIO->EXTI->NVIC->CPU


初始化配置模板

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_x;//x=(0~15)选中多个端口用"|"操作 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIO端口 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSourcex);//配置AFIO x=(0~15)要和GPIO选中的端口对应 //GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);多个AFIO端口不能用"|"操作 EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line=EXTI_Linex;//这里可以用"|"操作 EXTI_InitStructure.EXTI_LineCmd=ENABLE; EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//选择中断触发或事件触发 这里选择中断触发 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式 这里选择下降沿触发 EXTI_Init(&EXTI_InitStructure);//初始化EXIT 与初始化GPIO类似 注意要对应起来 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_y);//配置优先级分组 y=(0~3) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//指定抢占优先级 如果只有一个外部中断 则随意设置 但要注意范围不能超过配置优先级分组的限制范围 见表1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//指定响应优先级 同上 NVIC_Init(&NVIC_InitStructure);//初始化NVIC /*若上面有两个端口都触发外部中断 则下面代码要写两次分别对应两个端口 NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//指定抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//指定响应优先级 NVIC_Init(&NVIC_InitStructure);//配置NVIC */

结构体 参数EXTI_InitStructure.EXTI_Trigger选择边缘触发方式有以下三种选择

EXTI_Trigger_Rising(上升沿触发)

EXTI_Trigger_Falling(下降沿触发)

EXTI_Trigger_Rising_Falling(双边沿触发)


EXTI中断函数

去启动文件里的startup_stm32f10x_md.s文件找到函数名为EXTIx_IRQHandler的中断函数x与选中的端口对应(STM32的10到15号端口是共用的一个中断函数 EXTI15_10_IRQHandler)

如果我们选中12号端口作为外部中断源,下面是代码示例

void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line12)==SET)//查看EXIT12的中断标志位是否为1 { EXTI_ClearITPendingBit(EXTI_Line12);//清除中断标志位 } }

其中中断标志位要由软件清零


常用函数

EXTI_GetITStatus(EXTI_Linex);

x为选中的引脚 返回SET或RESET 该函数用于判断中断标志位是否为1(SET=1,RESET=0)为1则表示触发了中断

EXTI_ClearITPendingBit(EXTI_Linex);

清除中断标志位