OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2691|回复: 0

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

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2018-5-24 14:16:56 | 显示全部楼层 |阅读模式
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);          //′ò¿aEXTIê±Öó  
    SYSCFG_EXTILineConfig(AIRBAG_EXTI_PORT, AIRBAG_EXTI_PIN);       //éèÖ&#195D15ÎaEXTI  
  
    /* Configure  EXTI  */  
//  EXTI_DeInit();  
    EXTI_InitStructure.EXTI_Line = AIRBAG_EXTI_LINE;    //éèÖÃòy½Å  
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //éèÖÃÎaía2¿ÖD¶Ïģ꽠 
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;  // éèÖÃéÏéyoíϽμÑØ¶¼¼ì2a  
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                //ê1Äüía2¿ÖD¶ÏDÂ×′쬠 
    EXTI_Init(&EXTI_InitStructure);                          //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷  
  
   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //ê1Äüía2¿ÖD¶Ïí¨μà     
    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;         //ÏèÕ¼óÅÏè¼¶4λ,1216¼¶  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;  //ÏèÕ¼óÅÏè¼¶0λ,′óóÅÏè¼¶4λ  
    NVIC_Init(&NVIC_InitStructure);                               //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷  
}  






中断例程:


[cpp] view plain copy


void EXTI15_10_IRQHandler(void)  
{  
    rt_interrupt_enter();  
  
    /* °2è«ÆøÄòó2Ïß¼ì2a′|àí¡¡*/  
    vcm_airbag_exti_check();  
    /* GPSììÏß¿a·¼ì2a′|àí¡¡*/  
    gps_exti_check();  
  
    rt_interrupt_leave();  
}  








[cpp] view plain copy


void vcm_airbag_exti_check(void)  
{  
    //¼ì2éμ±Ç°ÖD¶ÏμÄ×′ì¬êÇ·ñoÏ·¨  
    if(EXTI_GetITStatus(AIRBAG_EXTI_LINE) != RESET)  
    {     
        //¶áè¡1ü½ÅμÄ×′ì¬,Õaàï·μ»Ø0±íê¾°2è«ÆøÄò±¬¿a  
        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.\r\n");  
        }  
        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.\r\n");  
        }  
        rt_mq_send(&recv_frame_mq,&recv_frame,sizeof(can_bus_frame));  
        //ÇåÖD¶Ï±ê־λ  
        EXTI_ClearITPendingBit(AIRBAG_EXTI_LINE);         
    }     
}  
http://www.makeru.com.cn/emb
嵌入式学习交流群:561213221   

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表