|
轉(zhuǎn)自 | 瑞薩嵌入式小百科
DMA:Direct Memory Access,直接內(nèi)存訪問。簡單來說就是內(nèi)存RAM直接和其他設(shè)備(外設(shè))進行數(shù)據(jù)交互,而不需要CPU參與的一種控制器。
為了減少CPU長期被占用,提高運行效率,DMA就起著關(guān)鍵作用。目前市面上大部分處理器都帶有DMA功能,因此,DMA是一種在嵌入式實時任務(wù)處理中常用的功能。
DMA它允許不同速度的硬件裝置來溝通,而不需要依賴于 CPU 的大量中斷負載。否則,CPU 需要從來源把每一片段的數(shù)據(jù)復(fù)制到緩存器,然后把它們再次寫回到新的地方。在這個過程中,CPU不能做其他的工作。
DMA優(yōu)點
DMA在系統(tǒng)中的角色好比一個公司的員工,CPU好比是公司的老板。老板想要寄送一個快遞到北京,只需要一個口令安排員工即可,具體填寫快遞單號、物流、派送等一系列工作老板不用關(guān)心。最后快遞被對方收到,通知一聲老板即可。
回到UART發(fā)送數(shù)據(jù),同樣的道理,CPU只需要簡單的操作(“安排任務(wù)”),就可把一串數(shù)據(jù)包丟給DMA直接發(fā)送,最后發(fā)送完成,收到一個發(fā)送完成中斷,通知CPU發(fā)送完成即可。
說到這里相信大部分人都明白了,老板可以親自開車或者坐飛機送快遞,完成這件事情,但會耽擱老板很多時間。
同樣,如果我們使用UART自己發(fā)送,CPU就會不停仲裁發(fā)送結(jié)果,占據(jù)CPU大量資源。
在RTOS中,特別是有大量任務(wù)需要處理的時候,UART使用DMA發(fā)送就會帶來很大方便。使用裸機運行的相同,尤為突出。
單片機DMA在UART中的應(yīng)用案例
今天結(jié)合RL78系列單片機給大家講講DMA在UART中的應(yīng)用。
r2xfc5yrt1k64018649528.png (16.97 KB, 下載次數(shù): 0)
下載附件
保存到相冊
r2xfc5yrt1k64018649528.png
2024-9-10 19:01 上傳
打開DMA0的配置界面如下,首先要確定DMA0的傳送方向,其次選擇外設(shè)SFR寄存器,以及RAM的地址和指定DMA0傳送的數(shù)據(jù)長度,第三要設(shè)置DMA0的觸發(fā)源。DAM1的設(shè)置和DMA0是相同的,根據(jù)應(yīng)用需求,進行相應(yīng)的配置。
2ehcvyzftim64018649628.png (84.77 KB, 下載次數(shù): 0)
下載附件
保存到相冊
2ehcvyzftim64018649628.png
2024-9-10 19:01 上傳
vypjhaaqxt564018649728.png (72.84 KB, 下載次數(shù): 0)
下載附件
保存到相冊
vypjhaaqxt564018649728.png
2024-9-10 19:01 上傳
UART的配置比較簡單,在此不在累述,配置好后,點擊“code generator”,生成對應(yīng)的驅(qū)動代碼,順便說,自動生產(chǎn)的串口API函數(shù)是沒有__far類型的,但是實際測試的時候,發(fā)送的數(shù)據(jù)可能是錯誤的,因為定義的數(shù)據(jù)buffer可能不在鏡像區(qū),這樣會導(dǎo)致傳送的地址是錯誤的,所以為避免類似的情況發(fā)生,建議在如下地方修改為__far類型。
sqe2kzkkwmk64018649828.png (210.11 KB, 下載次數(shù): 0)
下載附件
保存到相冊
sqe2kzkkwmk64018649828.png
2024-9-10 19:01 上傳
定義好接收數(shù)據(jù)的uart_buf[10], 并把數(shù)據(jù)buffer的地址給到DRA0,如下,DMA0被觸發(fā)后,會把在SFR接收到的數(shù)據(jù)直接送給uart_buf[10]。
ij4dcjvxt0a64018649928.png (18.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊
ij4dcjvxt0a64018649928.png
2024-9-10 19:01 上傳
xkn24m3ebtb64018650028.png (109.65 KB, 下載次數(shù): 0)
下載附件
保存到相冊
xkn24m3ebtb64018650028.png
2024-9-10 19:01 上傳
通過DMA1發(fā)送數(shù)據(jù)時,也是一樣,要發(fā)送數(shù)據(jù)的buffer的地址賦給DRA1,DMA1被觸發(fā)后,會把RAM buffer的數(shù)據(jù)送給SFR進行發(fā)送。
qct4cn2ju0264018650128.png (109.19 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qct4cn2ju0264018650128.png
2024-9-10 19:01 上傳
在主函數(shù)main里,初始化相關(guān)的函數(shù),如下。
4l0jjq31dgg64018650228.png (25.42 KB, 下載次數(shù): 0)
下載附件
保存到相冊
4l0jjq31dgg64018650228.png
2024-9-10 19:01 上傳
連接好硬件,并把生成的.mot文件下載到MCU里,通過串口助手給MCU發(fā)送8個字符數(shù)據(jù)“12345678”,在應(yīng)用程序里沒有對接收的SFR數(shù)據(jù)進行處理的情況下,通過DMA0會把接收到SFR的8個數(shù)據(jù)送到指定的buffer 里,經(jīng)檢查結(jié)果,數(shù)據(jù)接收正確。
gjq2zzmgzcw64018650329.png (28.92 KB, 下載次數(shù): 0)
下載附件
保存到相冊
gjq2zzmgzcw64018650329.png
2024-9-10 19:01 上傳
iuvpt2gxrk564018650429.png (68.19 KB, 下載次數(shù): 0)
下載附件
保存到相冊
iuvpt2gxrk564018650429.png
2024-9-10 19:01 上傳
o43yilvszaq64018650529.png (63.62 KB, 下載次數(shù): 0)
下載附件
保存到相冊
o43yilvszaq64018650529.png
2024-9-10 19:01 上傳
------------ END ------------
3ksrmpsws4a64018650629.jpg (185.79 KB, 下載次數(shù): 0)
下載附件
保存到相冊
3ksrmpsws4a64018650629.jpg
2024-9-10 19:01 上傳
手把手教你在MCU移植CoreMark跑分源碼
4hne4qjz4kr64018650729.jpg (191.7 KB, 下載次數(shù): 0)
下載附件
保存到相冊
4hne4qjz4kr64018650729.jpg
2024-9-10 19:01 上傳
資深工程師線下分享嵌入式產(chǎn)品開發(fā)流程、實戰(zhàn)經(jīng)驗、解決方案......
tzdulmcwo5v64018650829.jpg (166.13 KB, 下載次數(shù): 0)
下載附件
保存到相冊
tzdulmcwo5v64018650829.jpg
2024-9-10 19:01 上傳
漫談MCU內(nèi)置LCD控制器/驅(qū)動器 |
|