×
单片机 > 单片机程序设计 > 详情

STM32F103学习笔记(五) 外部中断

发布时间:2020-08-27 发布时间:
|

首先是外部中断基本的概念:STM32 的每个 IO 都可以作为外部中断
的中断输入口,这点也是 STM32 的强大之处。 STM32F103 的中断控制器支持 19 个外部中断/
事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的
19 个外部中断为:
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。

线16~18还没有学到只看了线0~15。

每个中断线对应着7个GPIO口,形成映射关系,以线 0 为例:它对应了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、
GPIOE.0、 GPIOF.0、 GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来
决定对应的中断线配置到哪个 GPIO 上了。 下面我们看看 GPIO 跟中断线的映射关系图:

  • void EXTIX_Init(void)  
  • {  

  •    

  •     EXTI_InitTypeDef EXTI_InitStructure;  

  •     NVIC_InitTypeDef NVIC_InitStructure;  

  •   

  •     KEY_Init();  // 按键端口初始化  

  •   

  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟  

  •   

  •   //GPIOE.2 中断线以及中断初始化配置   下降沿触发  

  •     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);  

  •   

  •     EXTI_InitStructure.EXTI_Line=EXTI_Line2;    //KEY2  

  •     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寄存器  

  •   

  •  //GPIOE.3    中断线以及中断初始化配置 下降沿触发 //KEY1  

  •     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);  

  •     EXTI_InitStructure.EXTI_Line=EXTI_Line3;  

  •     EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器  

  •   

  •  //GPIOE.4    中断线以及中断初始化配置  下降沿触发   //KEY0  

  •     GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);  

  •     EXTI_InitStructure.EXTI_Line=EXTI_Line4;  

  •     EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器  

  •   

  •   

  •   //GPIOA.0   中断线以及中断初始化配置 上升沿触发 PA0  WK_UP  

  •     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);   

  •   

  •     EXTI_InitStructure.EXTI_Line=EXTI_Line0;  

  •     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  

  •     EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器  

  •   

  •   

  •     NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //使能按键WK_UP所在的外部中断通道  

  •     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2,   

  •     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                   //子优先级3  

  •     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道  

  •     NVIC_Init(&NVIC_InitStructure);   

  •   

  •     NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;            //使能按键KEY2所在的外部中断通道  

  •     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2,   

  •     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                   //子优先级2  

  •     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道  

  •     NVIC_Init(&NVIC_InitStructure);  

  •   

  •   

  •     NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;            //使能按键KEY1所在的外部中断通道  

  •     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2   

  •     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                   //子优先级1   

  •     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道  

  •     NVIC_Init(&NVIC_InitStructure);       //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器  

  •   

  •     NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;            //使能按键KEY0所在的外部中断通道  

  •     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2   

  •     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                   //子优先级0   

  •     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道  

  •     NVIC_Init(&NVIC_InitStructure);       //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器  

  •    

  • }  

  •   

  • //外部中断0服务程序   

  • void EXTI0_IRQHandler(void)  

  • {  

  •     delay_ms(10);//消抖  

  •     if(KEY3==1)      //WK_UP按键  

  •     {                  

  •         BEEP=!BEEP;   

  •     }  

  •     EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位    

  • }  

  •    

  • //外部中断2服务程序  

  • void EXTI2_IRQHandler(void)  

  • {  

  •     delay_ms(10);//消抖  

  •     if(KEY2==0)   //按键KEY2  

  •     {  

  •         LED0=!LED0;  

  •     }          

  •     EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中断标志位    

  • }  

  • //外部中断3服务程序  

  • void EXTI3_IRQHandler(void)  

  • {  

  •     delay_ms(10);//消抖  

  •     if(KEY1==0)  //按键KEY1  

  •     {                  

  •         LED1=!LED1;  

  •     }          

  •     EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位    

  • }  

  •   

  • void EXTI4_IRQHandler(void)  

  • {  

  •     delay_ms(10);//消抖  

  •     if(KEY0==0)  //按键KEY0  

  •     {  

  •         LED0=!LED0;  

  •         LED1=!LED1;   

  •     }          

  •     EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位    

  • }  


  • 关键字:STM32F103  外部中断

    『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    AVR M16实验之六 DS18B20测温