轉自 | 瑞薩嵌入式小百科
DMA:Direct Memory Access,直接內存訪問。簡單來說就是內存RAM直接和其他設備(外設)進行數據交互,而不需要CPU參與的一種控制器。
為了減少CPU長期被占用,提高運行效率,DMA就起著關鍵作用。目前市面上大部分處理器都帶有DMA功能,因此,DMA是一種在嵌入式實時任務處理中常用的功能。
DMA它允許不同速度的硬件裝置來溝通,而不需要依賴于 CPU 的大量中斷負載。否則,CPU 需要從來源把每一片段的數據復制到緩存器,然后把它們再次寫回到新的地方。在這個過程中,CPU不能做其他的工作。
DMA優點
老板想要寄送一個快遞到北京,只需要一個口令安排員工即可,具體填寫快遞單號、物流、派送等一系列工作老板不用關心。最后快遞被對方收到,通知一聲老板即可。
單片機DMA在UART中的應用案例
今天結合RL78系列單片機給大家講講DMA在UART中的應用。

打開DMA0的配置界面如下,首先要確定DMA0的傳送方向,其次選擇外設SFR寄存器,以及RAM的地址和指定DMA0傳送的數據長度,第三要設置DMA0的觸發源。DAM1的設置和DMA0是相同的,根據應用需求,進行相應的配置。


UART的配置比較簡單,在此不再累述,配置好后,點擊“code generator”,生成對應的驅動代碼,順便說,自動生產的串口API函數是沒有__far類型的,但是實際測試的時候,發送的數據可能是錯誤的,因為定義的數據buffer可能不在鏡像區,這樣會導致傳送的地址是錯誤的,所以為避免類似的情況發生,建議在如下地方修改為__far類型。

定義好接收數據的uart_buf[10], 并把數據buffer的地址給到DRA0,如下,DMA0被觸發后,會把在SFR接收到的數據直接送給uart_buf[10]。


通過DMA1發送數據時,也是一樣,要發送數據的buffer的地址賦給DRA1,DMA1被觸發后,會把RAM buffer的數據送給SFR進行發送。

在主函數main里,初始化相關的函數,如下。

連接好硬件,并把生成的.mot文件下載到MCU里,通過串口助手給MCU發送8個字符數據“12345678”,在應用程序里沒有對接收的SFR數據進行處理的情況下,通過DMA0會把接收到SFR的8個數據送到指定的buffer 里,經檢查結果,數據接收正確。



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

嵌入式項目越做越難維護? 要掌握的技術太多?

用QQ控制瑞薩開發板?基于MCU+Zephyr的Openclaw交互實戰

嵌入式AIoT的實時分析應用