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
相关产品推荐
相关产品推荐

