[STM32L4] LPUART1 无法通过 HAL_UART_Transmit_IT(...) 函数以中断方式工作

[复制链接]
lvluoo 发表于 2025-8-21 11:10 | 显示全部楼层 |阅读模式
本帖最后由 lvluoo 于 2025-8-20 23:09 编辑

在用 STM32CubeIDE  和 Nucleo L4R5ZI 开发板。通过轮询方式(HAL_UART_Transmit(...))可以正常使用 lpuart1 进行传输。NVIC 中已启用中断。但切换到 HAL_UART_Transmit_IT(...) 后,开发板会卡在反复调用 HAL_UART_IRQHandler() 的状态。
/* 以下代码工作正常,串口终端有输出 */
result = HAL_UART_Transmit(&hlpuart1, (uint8_t*)"GO-1\r\n", 6, 100);
/* 以下代码***不会返回,串口终端无输出 */
result = HAL_UART_Transmit_IT(&hlpuart1, (uint8_t*)"GO-2\r\n", 6);
它之所以不返回,是因为卡在无限调用 HAL_UART_IRQHandler() 的状态。我没有修改过 HAL_UART_IRQHandler(...),只是使用了默认生成的代码。

调用堆栈显示:
HAL_UART_IRQHandler() at stm32l4xx_hal_uart.c:2,509 0x8003408
LPUART1_IRQHandler() at stm32l4xx_it.c:209 0x8000a52
<signal handler called>() at 0xfffffff9
HAL_UART_Transmit_IT() at stm32l4xx_hal_uart.c:1,301 0x8003128
main() at main.c:105 0x800053c
为了验证,我用 Nucleo-F103RB 开发板测试相同的步骤,结果工作正常。
似乎是库和/或生成的代码缺少某些内容。不确定是 lpuart1 还是 L4R5 的问题。数据没有传输,中断也没有被清除/处理。
有没有其他人遇到过这个问题?是否有解决方法?

海滨消消 发表于 2025-8-21 11:43 | 显示全部楼层
LPUART1在STM32L4系列中可能使用不同的中断标志或优先级配置,而默认生成的代码可能未完全适配。
onlycook 发表于 2025-8-21 11:44 | 显示全部楼层
HAL_UART_IRQHandler在处理发送中断(TXE/TC)时,若未正确清除中断标志或更新状态,会导致中断反复触发,形成死循环。
七毛钱 发表于 2025-8-21 11:44 | 显示全部楼层
NVIC优先级或中断向量表配置错误
海滨消消 发表于 2025-8-21 11:45 | 显示全部楼层
更新HAL库版本到最新版本了吗?
豌豆爹 发表于 2025-8-21 11:46 | 显示全部楼层
推荐用DMA替代中断。
麻花油条 发表于 2025-8-21 11:46 | 显示全部楼层
根源可能在于LPUART1的中断处理未正确适配默认HAL库逻辑,导致中断反复触发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部