You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EXTI8_IRQHandler下降沿中断本该单次触发却多次触发问题求解

EXTI多次触发问题解决办法

根因定位

你遇到的EXTI8中断多次触发是边沿信号抖动+中断未做互锁导致的,对应解决方案如下:

1. 新增中断消抖与互锁逻辑

你当前的回调函数没有做引脚校验、中断挂起位清理、接收过程中断屏蔽,是多次触发的核心原因,修改中断回调代码如下:

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin){
   // 先校验是否为目标引脚触发的中断,避免其他EXTI中断误进入
   if(GPIO_Pin == RX_Pin) {
      // 手动清理中断挂起标志,防止重复触发
      __HAL_GPIO_EXTI_CLEAR_IT(RX_Pin);
      // 软件消抖:延时1ms后再判断电平,过滤边沿震荡
      HAL_Delay(1);
      if(HAL_GPIO_ReadPin(RX_GPIO_Port, RX_Pin) == 0)
      {
         // 接收过程中关闭EXTI8中断,避免重复触发
         HAL_NVIC_DisableIRQ(EXTI8_IRQn);
         HAL_UART_Receive_DMA(uart, (uint8_t *) &rx_data[rx_work], size_pkt);
         dbg_cnt++;
      }
   }
}

2. 接收完成后重新使能中断

在UART接收完成回调中重新打开EXTI8中断,等待下一次通信触发:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  // 保留你原有的接收处理逻辑
  dbg_save_buff[index] = dbg_cnt;
  dbg_cnt = 0;
  // 清理残留挂起标志后重新使能EXTI8
  __HAL_GPIO_EXTI_CLEAR_IT(RX_Pin);
  HAL_NVIC_EnableIRQ(EXTI8_IRQn);
}

3. 可选硬件消抖优化

如果软件消抖后仍有偶发多次触发,可以在RX端PG8引脚与GND之间焊接1个10nF~100nF的陶瓷电容,直接滤除电平边沿的高频震荡。

4. 校验TX端输出逻辑

确认发送端NUCLEO-l4p5zg的PG15拉低后,会保持低电平直到UART数据发送完成再拉高,避免短时间内多次电平跳变导致RX端多次识别到下降沿。


内容的提问来源于stack exchange,提问作者Andrea Segalla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:36:03