转自 | 瑞萨嵌入式小百科
DMA:Direct Memory Access,直接内存访问。简单来说就是内存RAM直接和其他设备(外设)进行数据交互,而不需要CPU参与的一种控制器。
为了减少CPU长期被占用,提高运行效率,DMA就起着关键作用。目前市面上大部分处理器都带有DMA功能,因此,DMA是一种在嵌入式实时任务处理中常用的功能。
DMA它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的数据复制到缓存器,然后把它们再次写回到新的地方。在这个过程中,CPU不能做其他的工作。
DMA优点
DMA在系统中的角色好比一个公司的员工,CPU好比是公司的老板。老板想要寄送一个快递到北京,只需要一个口令安排员工即可,具体填写快递单号、物流、派送等一系列工作老板不用关心。最后快递被对方收到,通知一声老板即可。
回到UART发送数据,同样的道理,CPU只需要简单的操作(“安排任务”),就可把一串数据包丢给DMA直接发送,最后发送完成,收到一个发送完成中断,通知CPU发送完成即可。
说到这里相信大部分人都明白了,老板可以亲自开车或者坐飞机送快递,完成这件事情,但会耽搁老板很多时间。
同样,如果我们使用UART自己发送,CPU就会不停仲裁发送结果,占据CPU大量资源。
在RTOS中,特别是有大量任务需要处理的时候,UART使用DMA发送就会带来很大方便。使用裸机运行的相同,尤为突出。
单片机DMA在UART中的应用案例
今天结合RL78系列单片机给大家讲讲DMA在UART中的应用。
343mb304peb64010905555.png
打开DMA0的配置界面如下,首先要确定DMA0的传送方向,其次选择外设SFR寄存器,以及RAM的地址和指定DMA0传送的数据长度,第三要设置DMA0的触发源。DAM1的设置和DMA0是相同的,根据应用需求,进行相应的配置。
hjwncrpmm3o64010905656.png
avofl2ugujt64010905756.png
UART的配置比较简单,在此不在累述,配置好后,点击“code generator”,生成对应的驱动代码,顺便说,自动生产的串口API函数是没有__far类型的,但是实际测试的时候,发送的数据可能是错误的,因为定义的数据buffer可能不在镜像区,这样会导致传送的地址是错误的,所以为避免类似的情况发生,建议在如下地方修改为__far类型。
v3ia25xvuv364010905856.png
定义好接收数据的uart_buf[10], 并把数据buffer的地址给到DRA0,如下,DMA0被触发后,会把在SFR接收到的数据直接送给uart_buf[10]。
e1axlcpgko064010905956.png
a1hf33wgjyl64010906056.png
通过DMA1发送数据时,也是一样,要发送数据的buffer的地址赋给DRA1,DMA1被触发后,会把RAM buffer的数据送给SFR进行发送。
nf51vofgfpa64010906156.png
在主函数main里,初始化相关的函数,如下。
fviw4qjqpcs64010906256.png
连接好硬件,并把生成的.mot文件下载到MCU里,通过串口助手给MCU发送8个字符数据“12345678”,在应用程序里没有对接收的SFR数据进行处理的情况下,通过DMA0会把接收到SFR的8个数据送到指定的buffer 里,经检查结果,数据接收正确。
j3qsm31mcb564010906356.png
2pzaqsqalek64010906457.png
vltk52yxaz164010906557.png
------------ END ------------
o2dhqatpro564010906657.jpg
手把手教你在MCU移植CoreMark跑分源码
wd40wfjczgm64010906757.jpg
资深工程师线下分享嵌入式产品开发流程、实战经验、解决方案......
we44euwpgbg64010906857.jpg
漫谈MCU内置LCD控制器/驱动器 |