電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 25|回復(fù): 0
收起左側(cè)

單片機(jī)DMA在UART中的應(yīng)用案例

[復(fù)制鏈接]

314

主題

314

帖子

2570

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2570
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-3 11:45:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
轉(zhuǎn)自 | 瑞薩嵌入式小百科

DMA:Direct Memory Access,直接內(nèi)存訪問(wèn)。簡(jiǎn)單來(lái)說(shuō)就是內(nèi)存RAM直接和其他設(shè)備(外設(shè))進(jìn)行數(shù)據(jù)交互,而不需要CPU參與的一種控制器。

為了減少CPU長(zhǎng)期被占用,提高運(yùn)行效率,DMA就起著關(guān)鍵作用。目前市面上大部分處理器都帶有DMA功能,因此,DMA是一種在嵌入式實(shí)時(shí)任務(wù)處理中常用的功能。

DMA它允許不同速度的硬件裝置來(lái)溝通,而不需要依賴于 CPU 的大量中斷負(fù)載。否則,CPU 需要從來(lái)源把每一片段的數(shù)據(jù)復(fù)制到緩存器,然后把它們?cè)俅螌?xiě)回到新的地方。在這個(gè)過(guò)程中,CPU不能做其他的工作。

DMA優(yōu)點(diǎn)
DMA在系統(tǒng)中的角色好比一個(gè)公司的員工,CPU好比是公司的老板。老板想要寄送一個(gè)快遞到北京,只需要一個(gè)口令安排員工即可,具體填寫(xiě)快遞單號(hào)、物流、派送等一系列工作老板不用關(guān)心。最后快遞被對(duì)方收到,通知一聲老板即可。
回到UART發(fā)送數(shù)據(jù),同樣的道理,CPU只需要簡(jiǎn)單的操作(“安排任務(wù)”),就可把一串?dāng)?shù)據(jù)包丟給DMA直接發(fā)送,最后發(fā)送完成,收到一個(gè)發(fā)送完成中斷,通知CPU發(fā)送完成即可。
說(shuō)到這里相信大部分人都明白了,老板可以親自開(kāi)車或者坐飛機(jī)送快遞,完成這件事情,但會(huì)耽擱老板很多時(shí)間。
同樣,如果我們使用UART自己發(fā)送,CPU就會(huì)不停仲裁發(fā)送結(jié)果,占據(jù)CPU大量資源。
在RTOS中,特別是有大量任務(wù)需要處理的時(shí)候,UART使用DMA發(fā)送就會(huì)帶來(lái)很大方便。使用裸機(jī)運(yùn)行的相同,尤為突出。
單片機(jī)DMA在UART中的應(yīng)用案例
今天結(jié)合RL78系列單片機(jī)給大家講講DMA在UART中的應(yīng)用。



打開(kāi)DMA0的配置界面如下,首先要確定DMA0的傳送方向,其次選擇外設(shè)SFR寄存器,以及RAM的地址和指定DMA0傳送的數(shù)據(jù)長(zhǎng)度,第三要設(shè)置DMA0的觸發(fā)源。DAM1的設(shè)置和DMA0是相同的,根據(jù)應(yīng)用需求,進(jìn)行相應(yīng)的配置。




UART的配置比較簡(jiǎn)單,在此不在累述,配置好后,點(diǎn)擊“code generator”,生成對(duì)應(yīng)的驅(qū)動(dòng)代碼,順便說(shuō),自動(dòng)生產(chǎn)的串口API函數(shù)是沒(méi)有__far類型的,但是實(shí)際測(cè)試的時(shí)候,發(fā)送的數(shù)據(jù)可能是錯(cuò)誤的,因?yàn)槎x的數(shù)據(jù)buffer可能不在鏡像區(qū),這樣會(huì)導(dǎo)致傳送的地址是錯(cuò)誤的,所以為避免類似的情況發(fā)生,建議在如下地方修改為_(kāi)_far類型。



定義好接收數(shù)據(jù)的uart_buf[10], 并把數(shù)據(jù)buffer的地址給到DRA0,如下,DMA0被觸發(fā)后,會(huì)把在SFR接收到的數(shù)據(jù)直接送給uart_buf[10]。







通過(guò)DMA1發(fā)送數(shù)據(jù)時(shí),也是一樣,要發(fā)送數(shù)據(jù)的buffer的地址賦給DRA1,DMA1被觸發(fā)后,會(huì)把RAM buffer的數(shù)據(jù)送給SFR進(jìn)行發(fā)送。



在主函數(shù)main里,初始化相關(guān)的函數(shù),如下。


連接好硬件,并把生成的.mot文件下載到MCU里,通過(guò)串口助手給MCU發(fā)送8個(gè)字符數(shù)據(jù)“12345678”,在應(yīng)用程序里沒(méi)有對(duì)接收的SFR數(shù)據(jù)進(jìn)行處理的情況下,通過(guò)DMA0會(huì)把接收到SFR的8個(gè)數(shù)據(jù)送到指定的buffer 里,經(jīng)檢查結(jié)果,數(shù)據(jù)接收正確。







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


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


資深工程師線下分享嵌入式產(chǎn)品開(kāi)發(fā)流程、實(shí)戰(zhàn)經(jīng)驗(yàn)、解決方案......


漫談MCU內(nèi)置LCD控制器/驅(qū)動(dòng)器

發(fā)表回復(fù)

本版積分規(guī)則

關(guān)閉

站長(zhǎng)推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表