金牌会员
 
- 积分
- 1036
- 金钱
- 1036
- 注册时间
- 2017-10-30
- 在线时间
- 163 小时
|
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); //éèÖÃ D15Î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
|
|