ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

UART DMA第一次发送正常,第二次就乱码?

UART DMA第一次发送正常,第二次就乱码? 在嵌入式项目中,UART使用DMA发送数据非常常见。CPU只需要准备好一块发送缓冲区,然后启动DMA:RAM发送缓冲区 ↓ DMA ↓ UART数据寄存器 ↓ TX引脚CPU不需要一个字节一个字节地搬数据,可以把大量数据搬运工作交给DMA完成。但实际开发中经常会遇到一个非常典型的问题:第一次发送完全正常,第二次发送开始出现乱码、缺字节、多字节,甚至发送的内容像是上一帧和这一帧混在了一起。更奇怪的是:发送前检查缓冲区,数据是正确的;DMA初始化参数看起来没有问题;UART波特率也正确;第一次发送正常;单步调试时甚至看不出明显异常。这种问题很容易让人怀疑:是不是DMA配置错了?实际上,很多时候DMA本身并没有配置错误。真正的问题往往是:CPU认为这块内存已经可以重新使用,而DMA认为自己仍然拥有这块内存。这本质上不是一个“DMA搬数据失败”的问题,而是一个DMA传输状态与缓冲区生命周期没有正确同步的问题。
返回列表