电子产业一站式赋能平台

PCB联盟网

搜索
查看: 53|回复: 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中的应用。

5vdhc2ogcox640922347.png

5vdhc2ogcox640922347.png


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

ttq1dhb5tlh640922448.png

ttq1dhb5tlh640922448.png

yfho1xnxcaf640922548.png

yfho1xnxcaf640922548.png


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

2ulvbj440bi640922648.png

2ulvbj440bi640922648.png


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


zkzygutw2dl640922748.png

zkzygutw2dl640922748.png



rezbbbvsg2n640922848.png

rezbbbvsg2n640922848.png


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

s31wyljifzx640922948.png

s31wyljifzx640922948.png


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

2m2simjnlwa640923048.png

2m2simjnlwa640923048.png


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

rthxhtdxb2g640923148.png

rthxhtdxb2g640923148.png


sfq3tpylrdp640923248.png

sfq3tpylrdp640923248.png


hreau0sg22k640923348.png

hreau0sg22k640923348.png


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

pwk4rhw0mgu640923448.jpg

pwk4rhw0mgu640923448.jpg

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

5k51kvcp3yt640923548.jpg

5k51kvcp3yt640923548.jpg

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

v0c3phbxg5f640923648.jpg

v0c3phbxg5f640923648.jpg

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

使用道具 举报

发表回复

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

本版积分规则


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