STM32学习记录之EXTI
EXTI简介EXTIExtern 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_ModeGPIO_Mode_IPU; GPIO_InitStructure.GPIO_PinGPIO_Pin_x;//x(0~15)选中多个端口用|操作 GPIO_InitStructure.GPIO_SpeedGPIO_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_LineEXTI_Linex;//这里可以用|操作 EXTI_InitStructure.EXTI_LineCmdENABLE; EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;//选择中断触发或事件触发 这里选择中断触发 EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Falling;//选择触发方式 这里选择下降沿触发 EXTI_Init(EXTI_InitStructure);//初始化EXIT 与初始化GPIO类似 注意要对应起来 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_y);//配置优先级分组 y(0~3) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannelEXTI0_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定抢占优先级 如果只有一个外部中断 则随意设置 但要注意范围不能超过配置优先级分组的限制范围 见表1 NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//指定响应优先级 同上 NVIC_Init(NVIC_InitStructure);//初始化NVIC /*若上面有两个端口都触发外部中断 则下面代码要写两次分别对应两个端口 NVIC_InitStructure.NVIC_IRQChannelEXTI1_IRQn;//指定中断通道开启或关闭 NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;//指定中断通道使能还是失能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;//指定抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority2;//指定响应优先级 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 该函数用于判断中断标志位是否为1SET1RESET0为1则表示触发了中断EXTI_ClearITPendingBit(EXTI_Linex);清除中断标志位