电子产业一站式赋能平台

PCB联盟网

搜索
查看: 51|回复: 0
收起左侧

单片机DMA在UART中的应用案例

[复制链接]

418

主题

418

帖子

4293

积分

四级会员

Rank: 4

积分
4293
发表于 2024-9-3 11:45:00 | 显示全部楼层 |阅读模式
转自 | 瑞萨嵌入式小百科

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中的应用。

r2xfc5yrt1k64018649528.png

r2xfc5yrt1k64018649528.png


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

2ehcvyzftim64018649628.png

2ehcvyzftim64018649628.png

vypjhaaqxt564018649728.png

vypjhaaqxt564018649728.png


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

sqe2kzkkwmk64018649828.png

sqe2kzkkwmk64018649828.png


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


ij4dcjvxt0a64018649928.png

ij4dcjvxt0a64018649928.png



xkn24m3ebtb64018650028.png

xkn24m3ebtb64018650028.png


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

qct4cn2ju0264018650128.png

qct4cn2ju0264018650128.png


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

4l0jjq31dgg64018650228.png

4l0jjq31dgg64018650228.png


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

gjq2zzmgzcw64018650329.png

gjq2zzmgzcw64018650329.png


iuvpt2gxrk564018650429.png

iuvpt2gxrk564018650429.png


o43yilvszaq64018650529.png

o43yilvszaq64018650529.png


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

3ksrmpsws4a64018650629.jpg

3ksrmpsws4a64018650629.jpg

手把手教你在MCU移植CoreMark跑分源码

4hne4qjz4kr64018650729.jpg

4hne4qjz4kr64018650729.jpg

资深工程师线下分享嵌入式产品开发流程、实战经验、解决方案......

tzdulmcwo5v64018650829.jpg

tzdulmcwo5v64018650829.jpg

漫谈MCU内置LCD控制器/驱动器
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表