STM32F407中UART2与UART3无法同时触发接收中断问题求助
STM32F407 UART2/UART3接收中断异常排查点
- 中断服务函数逻辑错误
检查UART3的中断服务函数是否正确调用了对应外设的中断处理接口:如果使用HAL库,必须在USART3_IRQHandler中调用HAL_UART_IRQHandler(&huart3),如果错填为huart2的句柄,会导致UART3的中断标志位无法被正常清除,中断挂起后无法再次触发。同时确认UART3的ISR中没有遗漏RXNE标志位清除操作,标准库下读取USART_DR寄存器即可自动清除RXNE标志,也可以主动调用USART_ClearFlag(USART3, USART_FLAG_RXNE)手动清除。 - HAL库单次接收中断未重新开启
如果使用HAL库的HAL_UART_Receive_IT()接口开启接收中断,该接口仅会触发一次接收:当配置的N个字节接收完成后,会自动关闭对应UART的RXNE中断,需要在HAL_UART_RxCpltCallback()回调函数中再次调用HAL_UART_Receive_IT(&huart3, 缓存地址, 接收长度),才能开启下一次接收中断,否则UART3只会触发一次中断。 - NVIC优先级配置冲突
检查两个UART的中断优先级配置:如果UART2的抢占优先级高于UART3,且UART2频繁收到数据导致中断一直触发,会导致UART3的中断长期被抢占无法响应。另外需要确认全局NVIC分组配置统一,没有出现两个外设使用不同分组的异常情况。 - 外设控制寄存器被误修改
检查UART2的中断服务函数、以及全局代码中是否存在误操作UART3寄存器的逻辑:比如误调用__HAL_UART_DISABLE_IT(&huart3, UART_IT_RXNE)关闭了UART3的接收中断,或是改写了USART3_CR1寄存器的RE位关闭了接收功能。
内容的提问来源于stack exchange,提问作者Pankaj Verma
相关产品推荐
相关产品推荐

