嵌入式:ARM的DMA设计
文章目錄
- 一、DMA工作原理
- 1. S3C2410結構框圖
- 2. DMA請求源
- 3. DMA傳輸過程
- 4. S3C2410 DMA 的基本時序
- 5. DMA的服務模式
- 6. S3C2410 DMA 的兩種控制協議
- 7. S3C2410 DMA 的三種協議類型
- 二、S3C2410A的DMA控制器
- 1. 6個DMA控制寄存器。
- 2. 3個DMA狀態寄存器
- 三、DMA編程實例
一、DMA工作原理
所謂DMA方式,即直接存儲器存取(Direct Memory Acess),在DMA控制器的控制下,不通過CPU控制,高速地和I/O設備和存儲器之間交換數據。
S3C2410具有一個4通道DMA控制器。該DMA控制器位于系統總線(AHB)和外設總線(APB)之間。每個DMA通道均能在系統總線和(或)外設總線之間執行一次數據搬移。這樣可以有四種DMA數據搬移:
(1)源設備和目標都在系統總線AHB上
(2)源設備在系統總線AHB,而目標設備位于外圍總線APB
(3)源設備在外圍總線APB,而目標設備位于系統總線AHB
(4)源設備和目標都在外圍總線APB上
DMA請求可以被軟件、片內外設請求或者外部引腳請求來發起。
1. S3C2410結構框圖
2. DMA請求源
4通道DMA
這里nXDREQ0 和nXDREQ1表示兩個外部源, I2SSDO 和I2SSDI表示IIS 的發送和接收。
3. DMA傳輸過程
采用DMA方式進行數據傳輸的具體過程如下:
(1)外設向DMA控制器發出DMA請求;
(2)DMA控制器向CPU發出總線請求信號;
(3)CPU執行完現行的總線周期后,向DMA控制器發出響應請求的回答信號;
(4)CPU將控制總線、地址總線及數據總線讓出,由DMA控制器進行控制;
(5)DMA控制器向外部設備發出DMA請求回答信號;
(6)進行DMA傳送;
(7)數據傳送完畢,DMA控制器通過中斷請求線發出中斷信號。CPU在接收到中斷信號后,轉入中斷處理程序進行后續處理。
(8)中斷處理結束后,CPU返回到被中斷的程序繼續執行。CPU重新獲得總線控制權。
4. S3C2410 DMA 的基本時序
nXDREQ請求生效并經過2CLK周期同步后,nXDACK響應并開始生效,但至少還要經過3CLK的周期延遲,DMA控制器才可獲得總線的控制權,并開始數據傳輸。
5. DMA的服務模式
共有兩種服務模式,一種是單一服務模式(single service),另外一種是整體服務模式(whole service)。
在單一服務模式下,一次請求服務一次,服務完畢后等待DMA 請求再一次來臨才能進行新的服務。這種模式下一次請求傳輸的數據量為:Data Size = Atomic transfer size (字節)
在整體服務模式下,使用DMA 計數器(TC),每傳輸一個原子傳輸該計數器減1,直到DMA計數器的值減為零,才等待下一次DMA請求。Data Size = Atomic transfer size × TC(字節)
Atomic transfer:指的是DMA的單次原子操作,它可以是Unit模式(傳輸1個data size),也可以是burst模式(傳輸4個data size)
單次原子操作期間,總線將被Hold,其它DMA請求不被響應
6. S3C2410 DMA 的兩種控制協議
- 請求模式:If XnXDREQ remains asserted, the next transfer starts immediately. Otherwise it waits for XnXDREQ to be asserted.
- 握手模式:If XnXDREQ is deasserted, DMA deasserts XnXDACK in 2cycles. Otherwise it waits until XnXDREQ is deasserted.
7. S3C2410 DMA 的三種協議類型
- 單一服務請求
- 單一服務握手
- 整體服務握手:
二、S3C2410A的DMA控制器
要進行DMA操作,首先要對S3C2410A的相關寄存器進行正確配置。每個DMA通道有9個控制寄存器,因此對于4通道的DMA控制器來說總共有36個寄存器。其中每個DMA通道的9個控制寄存器中有6個用于控制DMA傳輸,另外3個用于監控DMA控制器的狀態。
- DMA初始源寄存器(DISRC)
- DMA初始源控制寄存器(DISRCC)
- DMA初始目標地址寄存器(DIDST)
- DMA初始目標控制寄存器(DIDSTC)
- DMA控制寄存器(DCON)
- DMA屏蔽觸發寄存器(DMASKTRIG)
- DMA狀態寄存器(DSTAT)
- DMA當前源寄存器(DCSRC)
- DMA當前目標寄存器(DCDST)
1. 6個DMA控制寄存器。
2. 3個DMA狀態寄存器
三、DMA編程實例
舉例:使用DMA方式實現從存儲器到串口0進行數據發送。
#define SEND_DATA (*(volatile unsigned char *) 0x30200000) #define SEND_ADDR ((volatile unsigned char *) 0x30200000) //待發送數據的起始地址 void Main(void){volatile unsigned char* p = SEND_ADDR;int i;Target_Init();Delay(1000);SEND_DATA = 0x41; //初始化要發送的數據for (i = 0; i < 128; i++){*p++ = 0x41 + i;} rUCON0 = rUCON0 & 0xff3 | 0x8; //Uart設置成DMA形式rDISRC0 = (U32)(SEND_ADDR); //DMA0 初始化rDISRCC0 = (0<<1)|(0<<0); //源=AHB,傳送后地址增加rDIDST0 = (U32)UTXH0; //發送FIFO緩沖區地址rDIDSTC0 = (1<<1)|(1<<0); //目標=APB,地址固定//設置DMA0控制寄存器:握手模式,與APB同步,使能中斷,單位傳輸,單個模式,目標=UART0,//硬件請求模式,不自動加載,半字,計數器初值=50rDCON0=(0<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(50);rDMASKTRIG0 = (1<<1); //打開DMA通道0while(1); }總結
以上是生活随笔為你收集整理的嵌入式:ARM的DMA设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有序无序的变换 序号变图片 序号的各种
- 下一篇: 租用服务器选择大带宽租用具备哪些优势