DMA

Direct Memory Access (DMA) controller is used to provide high-speed data transfer between peripherals and memory and between memory and memory. This improves CPU efficiency by quickly moving data through DMA without any CPU operation.

DMA(Direct Memory Access)即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过 DMA 控制器为RAM与 I/O 设备开辟一条直接传送数据的通路,这就节省了CPU的资源来做其他操作。使用DMA传输可以连续获取或发送一段信息而不占用中断或延时,在通信频繁或有大段信息要传输时非常有用。

对于串口,一般接收采用中断或DMA方式,发送采用轮询方式。

当串口接收到一批数据后会调用接收回调函数,接收回调函数会把此时缓冲区的数据大小通过消息队 列发送给等待的数据处理线程。线程获取到消息后被激活,并读取数据。一般情况下DMA接收模式会结合DMA接收完成中断和串口空闲中断完成数据接收。

一、UART使用DMA收发数据

为什么需要使用DMA 通道buf半满中断?
很多串口DMA模式接收的教程、例子,基本是使用了“空间中断”+“DMA传输完成中断”来接收数据。
实质上这是存在风险的,当DMA传输数据完成,CPU介入开始拷贝DMA通道buf数据,如果此时串口继续有数据进来,DMA继续搬运数据到buf,就有可能将数据覆盖,因为DMA数据搬运是不受CPU控制的,即使你关闭了CPU中断。
严谨的做法需要做双buf,CPU和DMA各自一块内存交替访问,即是"乒乓缓存” ,处理流程步骤应该是这样:
【1】第一步,DMA先将数据搬运到buf1,搬运完成通知CPU来拷贝buf1数据
【2】第二步,DMA将数据搬运到buf2,与CPU拷贝buf1数据不会冲突
【3】第三步,buf2数据搬运完成,通知CPU来拷贝buf2数据
【4】执行完第三步,DMA返回执行第一步,一直循环

 

使用半满中断DMA数据搬运过程UART2 DMA模式接收配置代码如下,与其他外设使用DMA的配置基本一致,留意关键配置:

  • 串口接收,DMA通道工作模式设为连续模式
  • 使能DMA通道接收buf半满中断、溢满(传输完成)中断
  • 启动DMA通道前清空相关状态标识,防止首次传输错乱数据

 为什么需要使用串口空闲中断?

串口接收一包数据,长度如果小于DMA的缓冲长度,那么久不能触发中断,只能等DMA接收满数据才会产生中断,如果下一包数据迟迟不来,那么这一包就不能被及时响应。

串口空闲中断指的是,数据传输完成后,串口监测到一段时间内没有数据进来,则触发产生的中断信号。

 

参考:

1. RT-Thread编程指南

2. STM32使用DMA接收串口数据

3. 一个严谨的STM32串口DMA发送&接收机制
posted @ 2016-08-15 22:36  yuxi_o  阅读(608)  评论(0编辑  收藏  举报