转自 | 瑞萨嵌入式小百科
DMA:Direct Memory Access,直接内存访问。简单来说就是内存RAM直接和其他设备(外设)进行数据交互,而不需要CPU参与的一种控制器。
为了减少CPU长期被占用,提高运行效率,DMA就起着关键作用。目前市面上大部分处理器都带有DMA功能,因此,DMA是一种在嵌入式实时任务处理中常用的功能。
DMA它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的数据复制到缓存器,然后把它们再次写回到新的地方。在这个过程中,CPU不能做其他的工作。
DMA优点
老板想要寄送一个快递到北京,只需要一个口令安排员工即可,具体填写快递单号、物流、派送等一系列工作老板不用关心。最后快递被对方收到,通知一声老板即可。
单片机DMA在UART中的应用案例
今天结合RL78系列单片机给大家讲讲DMA在UART中的应用。

打开DMA0的配置界面如下,首先要确定DMA0的传送方向,其次选择外设SFR寄存器,以及RAM的地址和指定DMA0传送的数据长度,第三要设置DMA0的触发源。DAM1的设置和DMA0是相同的,根据应用需求,进行相应的配置。


UART的配置比较简单,在此不再累述,配置好后,点击“code generator”,生成对应的驱动代码,顺便说,自动生产的串口API函数是没有__far类型的,但是实际测试的时候,发送的数据可能是错误的,因为定义的数据buffer可能不在镜像区,这样会导致传送的地址是错误的,所以为避免类似的情况发生,建议在如下地方修改为__far类型。

定义好接收数据的uart_buf[10], 并把数据buffer的地址给到DRA0,如下,DMA0被触发后,会把在SFR接收到的数据直接送给uart_buf[10]。


通过DMA1发送数据时,也是一样,要发送数据的buffer的地址赋给DRA1,DMA1被触发后,会把RAM buffer的数据送给SFR进行发送。

在主函数main里,初始化相关的函数,如下。

连接好硬件,并把生成的.mot文件下载到MCU里,通过串口助手给MCU发送8个字符数据“12345678”,在应用程序里没有对接收的SFR数据进行处理的情况下,通过DMA0会把接收到SFR的8个数据送到指定的buffer 里,经检查结果,数据接收正确。



------------ END ------------