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 中断(之前已被使能),进入中断服务程序执行代码

所以,代码里重复配置中断源,会产生中断误触。正确做法是配置一次中断源后,就不重复配置了。