STM32F4外部中断里调用HAL_UART_Transmit偶发丢首字节:从TC/TXE标志时序讲起

· 行业用户 · 13 浏览

回答(4)

HAL_UART_Transmit不是可重入函数,多中断并发调用会丢数据,需加互斥或改用队列。
STM32玩家 · 2026-11-08
外部中断里做阻塞发送本身就不合理,建议用DMA+空闲中断,彻底避免时序问题。
码农小刘 · 2026-11-08
检查是否在发送前未等待TC,导致DR被过早覆盖;可先读SR再写DR,确保TC=1。
嵌入式老张 · 2026-11-08
HAL_UART_Transmit内部先等待TXE置位,再写DR。在外部中断中调用时,若中断优先级高于UART中断或系统未及时响应,可能出现:1)TXE已置位但前一次发送的TC尚未置位,此时写DR会覆盖尚未移出的数据,导致首字节丢失;2)中断嵌套使HAL_UART_Transmit被重入,破坏发送状态。建议:不要在ISR中直接调用阻塞式HAL_UART_Transmit;改用环形缓冲区+UART发送中断(或DMA),在ISR中仅将数据入队并启动发送;若必须调用,确保UART中断优先级低于外部中断,并检查TC标志后再写DR,或使用HAL_UART_Transmit_IT。
mcuku 阿沐 · 2026-11-08

🧰 配套工具

⏱️ 定时器计算器