STM32/STM8技术论坛
直播中

慧心的眼眸

7年用户 631经验值
私信 关注
[经验]

STM32之中断与事件---一个使用GPIO作为外部中断的示例

1.GPIO 的正确设置
[cpp] view plain copy


  • GPIO_InitTypeDef GPIO_InitStructure;  
  • /* Enable GPIOD clock */  
  • RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);  
  •   
  • /* Configure PD.03, PC.04, as input floating */  
  • GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;  
  •   
  • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  
  • GPIO_Init(GPIOD, &GPIO_InitStructure);  
  •   
  • GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); //PD3作为外部中断引脚  


其中GPIO_EXITLineConfig函数的声明如下:

[cpp] view plain copy


  • /**
  • * @Brief Selects the GPIO pin used as EXTI Line.
  • * @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
  • * This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
  • * @param GPIO_PinSource: specifies the EXTI line to be configured.
  • * This parameter can be GPIO_PinSourcex where x can be (0..15).
  • * @retval None
  • */  
  • void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)  


2.中断初始化
[cpp] view plain copy


  • EXTI_InitTypeDef EXTI_InitStructure;  
  •   
  • // Configure EXTI Line3 to generate an interrupt on falling edge  
  • EXTI_InitStructure.EXTI_Line = EXTI_Line3;  
  • EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  • EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  • EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  • EXTI_Init(&EXTI_InitStructure);  
  • GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);  
  •   
  • // Configure EXTI Line4 to generate an interrupt on falling edge  
  • EXTI_InitStructure.EXTI_Line = EXTI_Line4;  
  • EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
  • EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
  • EXTI_InitStructure.EXTI_LineCmd = ENABLE;  
  • EXTI_Init(&EXTI_InitStructure);  


3.在NVIC_Configuration 中Configures the NVIC and Vector Table base address.
[cpp] view plain copy


  • /* Configure the Priority Group to 2 bits */  
  • NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
  • /* enabling interrupt */  
  • NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;  
  • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  • NVIC_Init(&NVIC_InitStructure);  
  •   
  • /* Enable the EXTI3 Interrupt on PD.3 */  
  • NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;  
  • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
  • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  • NVIC_Init(&NVIC_InitStructure);  
  • /* Enable the EXTI4 Interrupt on PD.4 */  
  • NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQChannel;  
  • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
  • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  • NVIC_Init(&NVIC_InitStructure);  


4.在STM32f0x_it.c 中写入 中断处理函数

[cpp] view plain copy


  • /*******************************************************************************
  • * Function Name : EXTI3_IRQHandler
  • * Description : This function handles External interrupt Line 3 request.
  • * Input : None
  • * Output : None
  • * Return : None
  • *******************************************************************************/  
  • void EXTI3_IRQHandler(void)  
  • {  
  •     if(EXTI_GetITStatus(EXTI_Line3) != RESET)  
  •     {  
  •         // Led_RW_ON();  
  •         GPIO_SetBits(GPIOC, GPIO_Pin_4| GPIO_Pin_5 );  
  •   
  •   
  •         /* Clear the EXTI line 9 pending bit */  
  •         EXTI_ClearITPendingBit(EXTI_Line3);  
  •     }  
  • }  
  •   
  • /*******************************************************************************
  • * Function Name : EXTI4_IRQHandler
  • * Description : This function handles External interrupt Line 4 request.
  • * Input : None
  • * Output : None
  • * Return : None
  • *******************************************************************************/  
  • void EXTI4_IRQHandler(void)  
  • {  
  •     if(EXTI_GetITStatus(EXTI_Line4) != RESET)  
  •     {  
  •         //Led_RW_OFF();  
  •         GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5);  
  •         /* Clear the EXTI line 9 pending bit */  
  •         EXTI_ClearITPendingBit(EXTI_Line4);  
  •     }  
  • }  



另一个示例:

配置如下:


[cpp] view plain copy


  • void vcm_airbag_exti_set(void)  
  • {  
  •     EXTI_InitTypeDef EXTI_InitStructure;  
  •     NVIC_InitTypeDef NVIC_InitStructure;  
  •     GPIO_InitTypeDef GPIO_InitStructure;  
  •   
  •     /* Enable key GPIO clock */  
  •     RCC_AHB1PeriphClockCmd(AIRBAG_GPIO_RCC, ENABLE);  
  •   
  •     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;  
  •     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  •     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
  •     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  •   
  •     /* Configure  pin(PD_15): airbag gpio */  
  •     GPIO_InitStructure.GPIO_Pin = AIRBAG_GPIO_PIN;  
  •     GPIO_Init(AIRBAG_GPIO_PORT, &GPIO_InitStructure);  
  •   
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);          //´ò¿ªEXTIʱÖÓ  
  •     SYSCFG_EXTILineConfig(AIRBAG_EXTI_PORT, AIRBAG_EXTI_PIN);       //ÉèÖÃPD15ΪEXTI  
  •   
  •     /* Configure  EXTI  */  
  • //  EXTI_DeInit();  
  •     EXTI_InitStructure.EXTI_Line = AIRBAG_EXTI_LINE;    //ÉèÖÃÒý½Å  
  •     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //ÉèÖÃΪÍⲿÖжÏģʽ  
  •     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  // ÉèÖÃÉÏÉýºÍϽµÑض¼¼ì²â  
  •     EXTI_InitStructure.EXTI_LineCmd = ENABLE;                //ʹÄÜÍⲿÖжÏÐÂ״̬  
  •     EXTI_Init(&EXTI_InitStructure);                          //¸ù¾ÝEXTI_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèEXTI¼Ä´æÆ÷  
  •   
  •    
  •     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //ʹÄÜÍⲿÖжÏͨµÀ     
  •     NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  
  •     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;         //ÏÈÕ¼ÓÅÏȼ¶4λ,¹²16¼¶  
  •     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;  //ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λ  
  •     NVIC_Init(&NVIC_InitStructure);                               //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷  
  • }  




中断例程:


[cpp] view plain copy


  • void EXTI15_10_IRQHandler(void)  
  • {  
  •     rt_interrupt_enter();  
  •   
  •     /* °²È«ÆøÄÒÓ²Ïß¼ì²â´¦Àí¡¡*/  
  •     vcm_airbag_exti_check();  
  •     /* GPSÌìÏß¿ªÂ·¼ì²â´¦Àí¡¡*/  
  •     gps_exti_check();  
  •   
  •     rt_interrupt_leave();  
  • }  




[cpp] view plain copy


  • void vcm_airbag_exti_check(void)  
  • {  
  •     //¼ì²éµ±Ç°ÖжϵÄ״̬ÊÇ·ñºÏ·¨  
  •     if(EXTI_GetITStatus(AIRBAG_EXTI_LINE) != RESET)  
  •     {     
  •         //¶ÁÈ¡¹Ü½ÅµÄ״̬,ÕâÀï·µ»Ø0±íʾ°²È«ÆøÄÒ±¬¿ª  
  •         if(0 ==GPIO_ReadInputDataBit(AIRBAG_GPIO_PORT,AIRBAG_GPIO_PIN))  
  •         {   
  •             recv_frame.bus_type = BTYPE_HS_CAN;  
  •             recv_frame.id = 0x545;  
  •             recv_frame.data_buff[0] = 0x00;  
  •             recv_frame.data_buff[1] = 0x01;  
  •             recv_frame.data_buff[2] = 0x00;  
  •             recv_frame.data_buff[3] = 0x00;  
  •             recv_frame.data_buff[4] = 0x00;  
  •             recv_frame.data_buff[5] = 0x00;  
  •             recv_frame.data_buff[6] = 0x00;  
  •             recv_frame.data_buff[7] = 0x00;  
  •             VCM_DEBUG("[vcm] warning: airbag gpio interrupt rising.rn");  
  •         }  
  •         else  
  •         {  
  •             recv_frame.bus_type = BTYPE_HS_CAN;  
  •             recv_frame.id = 0x545;  
  •             recv_frame.data_buff[0] = 0x00;  
  •             recv_frame.data_buff[1] = 0x00;  
  •             recv_frame.data_buff[2] = 0x00;  
  •             recv_frame.data_buff[3] = 0x00;  
  •             recv_frame.data_buff[4] = 0x00;  
  •             recv_frame.data_buff[5] = 0x00;  
  •             recv_frame.data_buff[6] = 0x00;  
  •             recv_frame.data_buff[7] = 0x00;  
  •             VCM_DEBUG("[vcm] warning: airbag gpio interrupt falling.rn");  
  •         }  
  •         rt_mq_send(&recv_frame_mq,&recv_frame,sizeof(can_bus_frame));  
  •         //ÇåÖжϱê־λ  
  •         EXTI_ClearITPendingBit(AIRBAG_EXTI_LINE);         
  •     }     
  • }  
  • 嵌入式学习交流群:561213221       


回帖(1)

嘉o0o嘉

2018-3-27 08:49:43
是龟速诉讼费是否法阿发法阿发法法法阿发法
举报

更多回帖

发帖
×
20
完善资料,
赚取积分