EXTI 重复配置两次导致误触发中断的问题
https://shequ.stmicroelectronics.cn/thread-633519-1-1.html
/**
* @brief Selects the GPIO pin used as EXTI Line.
* @param PortSource selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..D).
* @param PinSource specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
*/
void GPIO_ConfigEXTILine(uint8_t PortSource, uint8_t PinSource)
{
uint32_t port = (uint32_t)PortSource;
/* Check the parameters */
assert_param(IS_GPIO_EXTI_PORT_SOURCE(PortSource));
assert_param(IS_GPIO_PIN_SOURCE(PinSource));
//将 EXTI2 外部中断的输入源设置为 PA2(默认)
AFIO->EXTI_CFG[(PinSource >> 0x02)] &= ~(((uint32_t)0x03) << ((PinSource & (uint8_t)0x03)*4u));
//将 EXTI3 外部中断的输入源选择为 PB2
AFIO->EXTI_CFG[(PinSource >> 0x02)] |= (port << ((PinSource & (uint8_t)0x03) *4u));
}
// 配置PB2为中断源
GPIO_ConfigEXTILine(GPIOB_PORT_SOURCE, GPIO_PIN_SOURCE2);
GPIO_ConfigEXTILine 这个函数的执行流程是这样的:先将 EXTI_CFG 外部中断配置寄存器中相对应的位清零,然后再写入新值。
第一次配置时,是先配置EXIT2中断源为PB2,再去使能EXIT2 第二次配置时,因为EXIT2已经使能,在调用 GPIO_ConfigEXTILine 配置 EXTI2 中断源时,先将中断源切回至PA2;由于失去了 PB2 引脚上的高电平,在内部产生了一个下降沿,因此触发了 EXTI2 中断(之前已被使能),进入中断服务程序执行代码
所以,代码里重复配置中断源,会产生中断误触。正确做法是配置一次中断源后,就不重复配置了。