微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 调试 ARM STM32 外部中断 遇到的一个问题

调试 ARM STM32 外部中断 遇到的一个问题

时间:11-20 来源:互联网 点击:

main函数如下:

int main(void) {      RCC_Configuration();      GPIO_Configuration();      NVIC_Configuration();      EXTI_Configuration();              while (1)   { } } 

中断服务函数如下:

void EXTI9_5_IRQHandler(void) {      if (EXTI_GetITStatus(EXTI_Line5) != RESET)      {           if(led_bit3)           {                GPIO_SetBits(GPIOB,GPIO_Pin_9);                led_bit3=0;           }           else           {                GPIO_ResetBits(GPIOB,GPIO_Pin_9);                led_bit3=1;           }                EXTI_ClearFlag(EXTI_Line5);      }            if(EXTI_GetITStatus(EXTI_Line6) != RESET)      {           if(led_bit1)           {                GPIO_SetBits(GPIOE,GPIO_Pin_0);                led_bit1=0;           }           else           {                GPIO_ResetBits(GPIOE,GPIO_Pin_0);                led_bit1=1;           }           EXTI_ClearFlag(EXTI_Line6);      } }

问题描述:1. 按两个按键中的随便一个,都没反应,原因是没进入中断服务函数。

2. 只使用其中一个按键产生中断,屏蔽另一个按键,结果正常,LED可以被点亮。

也就是说,只开其中一个按键中断是可以的,同时打开两个按键中断,则不行。

问题解决:经过一定时间的纠结与不知所措,为何一个就可以,两个同时就不可以。看到EXTI_Configuration()中:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5|GPIO_PinSource6);  EXTI_InitStructure.EXTI_Line = EXTI_Line5|EXTI_Line6;

索性不使用那个或,每个都单独配置一下。于是乎:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);  EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_InitStructure.EXTI_Line = EXTI_Line6;

还是不行,经过若干次的组合尝试:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);  EXTI_InitStructure.EXTI_Line = EXTI_Line6; EXTI_InitStructure.EXTI_Line = EXTI_Line5;  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);  EXTI_InitStructure.EXTI_Line = EXTI_Line5; EXTI_InitStructure.EXTI_Line = EXTI_Line6;  ...  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource5);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);  EXTI_InitStructure.EXTI_Line = EXTI_Line5|EXTI_Line6; 

发现只拆开GPIO_EXTILineConfig()中的或,即可。

问题分析:就这样,问题被瞎猫碰到死耗子地解决了。但是还是得找找为何这样可以。

找到GPIO_EXTILineConfig()函数的定义:

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) {   uint32_t tmp = 0x00;   /* Check the parameters */   assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));   assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));      tmp = ((uint32_t)0x0F) < (0x04 * (GPIO_PinSource & (uint8_t)0x03));   AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;   AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) < (0x04 * (GPIO_PinSource & (uint8_t)0x03))); }

由于两种情况下的不同就在于GPIO_EXTILineConfig()函数的第二个参数。所以首先分析assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource)); 再找到IS_GPIO_PIN_SOURCE():

#define IS_GPIO_PIN_SOURCE(PINSOURCE) (((PINSOURCE) == GPIO_PinSource0) ||                                         ((PINSOURCE) == GPIO_PinSource1) ||                                         ((PINSOURCE) == GPIO_PinSource2) ||                                         ((PINSOURCE) == GPIO_PinSource3) ||                                         ((PINSOURCE) == GPIO_PinSource4) ||                                         ((PINSOURCE) == GPIO_PinSource5) ||                                         ((PINSOURCE) == GPIO_PinSource6) ||                                         ((PINSOURCE) == GPIO_PinSource7) ||                                         ((PINSOURCE) == GPIO_PinSource8) ||                                         ((PINSOURCE) == GPIO_PinSource9) ||                                         ((PINSOURCE) == GPIO_PinSource10) ||                                         ((PINSOURCE) == GPIO_PinSource11) ||                                         ((PINSOURCE) == GPIO_PinSource12) ||                                         ((PINSOURCE) == GPIO_PinSource13) ||                                         ((PINSOURCE) == GPIO_PinSource14) ||                                         ((PINSOURCE) == GPIO_PinSource15))
其中:
#define GPIO_PinSource0            ((uint8_t)0x00) #define GPIO_PinSource1            ((uint8_t)0x01) #define GPIO_PinSource2            ((uint8_t)0x02) #define GPIO_PinSource3            ((uint8_t)0x03) #define GPIO_PinSource4            ((uint8_t)0x04) #define GPIO_PinSource5            ((uint8_t)0x05) #define GPIO_PinSource6            ((uint8_t)0x06) #define GPIO_PinSource7            ((uint8_t)0x07) #define GPIO_PinSource8            ((uint8_t)0x08) #define GPIO_PinSource9            ((uint8_t)0x09) #define GPIO_PinSource10           ((uint8_t)0x0A) #define GPIO_PinSource11           ((uint8_t)0x0B) #define GPIO_PinSource12           ((uint8_t)0x0C) #define GPIO_PinSource13           ((uint8_t)0x0D) #define GPIO_PinSource14           ((uint8_t)0x0E) #define GPIO_PinSource15           ((uint8_t)0x0F)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top