本篇博文主要介紹在MCC中如何快速使用DMA這個功能。
對於DMA,想必大家都不陌生,主要功能就是讓存儲器和外設之間進行數據傳輸,最關鍵的是不需要CPU進行干預,能有效的提供數據傳輸的吞吐率。如下圖。
目前大多數晶片都帶有DMA這個功能,值得一提的是PIC在8bit MCU裡面也有一部分晶片支持DMA,例如PIC18FxxK42和PIC18FxxK83 MCU。
首先,我們先打開MCC中DMA這個模塊,如下圖。
接下來,我們介紹DMA中,每個寄存器對應表示的含義。如下圖。
目前在8bit PIC18FxxK42中只支持兩路DMA,具體的邏輯框圖如下圖。
傳輸方向/源地址/目的地址:
DMA數據傳輸方向是固定的,即從源地址到目的地址。具體的說,DMA能將數據從源地址讀出,然後寫入目的地址。
源地址 (讀操作):flash,EEPROM,GPR(SRAM), SFR(外設寄存器);
目的地址(寫操作):GPR (SRAM),SFR(外設寄存器);
源地址起始地址寄存器,為24位,DMAxSSAU-DMAxSSAH-DMAxSSAL;
對於DMA,想必大家都不陌生,主要功能就是讓存儲器和外設之間進行數據傳輸,最關鍵的是不需要CPU進行干預,能有效的提供數據傳輸的吞吐率。如下圖。
目前大多數晶片都帶有DMA這個功能,值得一提的是PIC在8bit MCU裡面也有一部分晶片支持DMA,例如PIC18FxxK42和PIC18FxxK83 MCU。
首先,我們先打開MCC中DMA這個模塊,如下圖。
接下來,我們介紹DMA中,每個寄存器對應表示的含義。如下圖。
目前在8bit PIC18FxxK42中只支持兩路DMA,具體的邏輯框圖如下圖。
傳輸方向/源地址/目的地址:
DMA數據傳輸方向是固定的,即從源地址到目的地址。具體的說,DMA能將數據從源地址讀出,然後寫入目的地址。
源地址 (讀操作):flash,EEPROM,GPR(SRAM), SFR(外設寄存器);
目的地址(寫操作):GPR (SRAM),SFR(外設寄存器);
源地址起始地址寄存器,為24位,DMAxSSAU-DMAxSSAH-DMAxSSAL;
目的地址起始地址寄存器,為16位, DMAxDSAH-DMAxSSAL。
傳輸數據長度:
傳輸數據長度由源端數據長度和目的端數據長度決定。這兩個數據長度可以設置不同。當設置不同時,每次傳輸的長度由較小的一端決定。
傳輸數據長度由源端數據長度和目的端數據長度決定。這兩個數據長度可以設置不同。當設置不同時,每次傳輸的長度由較小的一端決定。
典型的傳輸形式舉例:
N:1 - 將N字節長度數據通過串口/SPI口傳輸出去;
N:N – 將數據塊在存儲器不同地址間搬移;
1:N – 將ADC採集到數據依次寫入到一塊預定的存儲器空間;
1:1 – 兩個通信口橋接。
N:1 - 將N字節長度數據通過串口/SPI口傳輸出去;
N:N – 將數據塊在存儲器不同地址間搬移;
1:N – 將ADC採集到數據依次寫入到一塊預定的存儲器空間;
1:1 – 兩個通信口橋接。
DMA 啟動/停止控制:
DMA數據搬移啟動可以由軟體操作,也可以由其他外設進行觸發。同樣的,停止操作也是可以由軟體操作或硬體觸發。
DMA數據搬移啟動可以由軟體操作,也可以由其他外設進行觸發。同樣的,停止操作也是可以由軟體操作或硬體觸發。
DMA與CPU資源使用仲裁:
可以設為DMA高優先級或CPU高優先級。當DMA高優先級時,DMA操作時,CPU執行暫停;當CPU高優先級時,DMA利用CPU空閒時間進行DMA傳輸。
可以設為DMA高優先級或CPU高優先級。當DMA高優先級時,DMA操作時,CPU執行暫停;當CPU高優先級時,DMA利用CPU空閒時間進行DMA傳輸。
做好相應設置後,點擊MCC生成代碼,可以找到dma1.C的文件,如下圖。
現在DMA的功能也基本介紹清楚,希望各位看官們,能在MCC上進行實際操作體驗下。
現在DMA的功能也基本介紹清楚,希望各位看官們,能在MCC上進行實際操作體驗下。
評論
陈毅滨
2020年12月21日