0
收藏
微博
微信
复制链接

DMA传串口,第一次成功第二次翻车?

2026-06-25 09:47
6

HAL_UART_Transmit_DMA()第一次调用完美运行,第二次直接返回HAL_BUSY。这个坑,几乎每个用STM32 HAL库的人都踩过。

1、真相:DMA传完不等于串口发完

很多人以为DMA把数据搬到TDR寄存器就结束了。错。

HAL库的状态机靠UART的TC中断来判断传输是否真正完成。DMA传完只是第一步,串口把数据实际发到线路上才算完。如果TC中断没被正确处理,gState会一直卡在HAL_UART_STATE_BUSY_TX,第二次调用自然被拒。

2、四个高频杀手

杀手一:中断标志没清

回调函数里不清标志,下一次传输直接被阻塞。必须加:

1.png

杀手二:DMA通道没释放

第二次调用前,旧通道还占着。正确做法是先停再启:

2.png

杀手三:缓冲区没对齐

动态分配的内存地址可能不满足DMA对齐要求,第二次分配的地址一变,直接硬件异常。用__attribute__((aligned(4)))或memalign()。

杀手四:Cache一致性

开了DCache的芯片,DMA读的是缓存旧数据。传输前后必须调用SCB_CleanDCache_by_Addr()。


本文凡亿教育原创文章,转载请注明来源!

登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

嵌入式大杂烩

分享嵌入式电子级设计的经验、心得、程序设计架构及测试

开班信息