嵌入式:ARM的DMA设计
文章目錄
- 一、DMA工作原理
- 1. S3C2410結(jié)構(gòu)框圖
- 2. DMA請求源
- 3. DMA傳輸過程
- 4. S3C2410 DMA 的基本時(shí)序
- 5. DMA的服務(wù)模式
- 6. S3C2410 DMA 的兩種控制協(xié)議
- 7. S3C2410 DMA 的三種協(xié)議類型
- 二、S3C2410A的DMA控制器
- 1. 6個(gè)DMA控制寄存器。
- 2. 3個(gè)DMA狀態(tài)寄存器
- 三、DMA編程實(shí)例
一、DMA工作原理
所謂DMA方式,即直接存儲器存取(Direct Memory Acess),在DMA控制器的控制下,不通過CPU控制,高速地和I/O設(shè)備和存儲器之間交換數(shù)據(jù)。
S3C2410具有一個(gè)4通道DMA控制器。該DMA控制器位于系統(tǒng)總線(AHB)和外設(shè)總線(APB)之間。每個(gè)DMA通道均能在系統(tǒng)總線和(或)外設(shè)總線之間執(zhí)行一次數(shù)據(jù)搬移。這樣可以有四種DMA數(shù)據(jù)搬移:
(1)源設(shè)備和目標(biāo)都在系統(tǒng)總線AHB上
(2)源設(shè)備在系統(tǒng)總線AHB,而目標(biāo)設(shè)備位于外圍總線APB
(3)源設(shè)備在外圍總線APB,而目標(biāo)設(shè)備位于系統(tǒng)總線AHB
(4)源設(shè)備和目標(biāo)都在外圍總線APB上
DMA請求可以被軟件、片內(nèi)外設(shè)請求或者外部引腳請求來發(fā)起。
1. S3C2410結(jié)構(gòu)框圖
2. DMA請求源
4通道DMA
這里nXDREQ0 和nXDREQ1表示兩個(gè)外部源, I2SSDO 和I2SSDI表示IIS 的發(fā)送和接收。
3. DMA傳輸過程
采用DMA方式進(jìn)行數(shù)據(jù)傳輸?shù)木唧w過程如下:
(1)外設(shè)向DMA控制器發(fā)出DMA請求;
(2)DMA控制器向CPU發(fā)出總線請求信號;
(3)CPU執(zhí)行完現(xiàn)行的總線周期后,向DMA控制器發(fā)出響應(yīng)請求的回答信號;
(4)CPU將控制總線、地址總線及數(shù)據(jù)總線讓出,由DMA控制器進(jìn)行控制;
(5)DMA控制器向外部設(shè)備發(fā)出DMA請求回答信號;
(6)進(jìn)行DMA傳送;
(7)數(shù)據(jù)傳送完畢,DMA控制器通過中斷請求線發(fā)出中斷信號。CPU在接收到中斷信號后,轉(zhuǎn)入中斷處理程序進(jìn)行后續(xù)處理。
(8)中斷處理結(jié)束后,CPU返回到被中斷的程序繼續(xù)執(zhí)行。CPU重新獲得總線控制權(quán)。
4. S3C2410 DMA 的基本時(shí)序
nXDREQ請求生效并經(jīng)過2CLK周期同步后,nXDACK響應(yīng)并開始生效,但至少還要經(jīng)過3CLK的周期延遲,DMA控制器才可獲得總線的控制權(quán),并開始數(shù)據(jù)傳輸。
5. DMA的服務(wù)模式
共有兩種服務(wù)模式,一種是單一服務(wù)模式(single service),另外一種是整體服務(wù)模式(whole service)。
在單一服務(wù)模式下,一次請求服務(wù)一次,服務(wù)完畢后等待DMA 請求再一次來臨才能進(jìn)行新的服務(wù)。這種模式下一次請求傳輸?shù)臄?shù)據(jù)量為:Data Size = Atomic transfer size (字節(jié))
在整體服務(wù)模式下,使用DMA 計(jì)數(shù)器(TC),每傳輸一個(gè)原子傳輸該計(jì)數(shù)器減1,直到DMA計(jì)數(shù)器的值減為零,才等待下一次DMA請求。Data Size = Atomic transfer size × TC(字節(jié))
Atomic transfer:指的是DMA的單次原子操作,它可以是Unit模式(傳輸1個(gè)data size),也可以是burst模式(傳輸4個(gè)data size)
單次原子操作期間,總線將被Hold,其它DMA請求不被響應(yīng)
6. S3C2410 DMA 的兩種控制協(xié)議
- 請求模式: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 的三種協(xié)議類型
- 單一服務(wù)請求
- 單一服務(wù)握手
- 整體服務(wù)握手:
二、S3C2410A的DMA控制器
要進(jìn)行DMA操作,首先要對S3C2410A的相關(guān)寄存器進(jìn)行正確配置。每個(gè)DMA通道有9個(gè)控制寄存器,因此對于4通道的DMA控制器來說總共有36個(gè)寄存器。其中每個(gè)DMA通道的9個(gè)控制寄存器中有6個(gè)用于控制DMA傳輸,另外3個(gè)用于監(jiān)控DMA控制器的狀態(tài)。
- DMA初始源寄存器(DISRC)
- DMA初始源控制寄存器(DISRCC)
- DMA初始目標(biāo)地址寄存器(DIDST)
- DMA初始目標(biāo)控制寄存器(DIDSTC)
- DMA控制寄存器(DCON)
- DMA屏蔽觸發(fā)寄存器(DMASKTRIG)
- DMA狀態(tài)寄存器(DSTAT)
- DMA當(dāng)前源寄存器(DCSRC)
- DMA當(dāng)前目標(biāo)寄存器(DCDST)
1. 6個(gè)DMA控制寄存器。
2. 3個(gè)DMA狀態(tài)寄存器
三、DMA編程實(shí)例
舉例:使用DMA方式實(shí)現(xiàn)從存儲器到串口0進(jìn)行數(shù)據(jù)發(fā)送。
#define SEND_DATA (*(volatile unsigned char *) 0x30200000) #define SEND_ADDR ((volatile unsigned char *) 0x30200000) //待發(fā)送數(shù)據(jù)的起始地址 void Main(void){volatile unsigned char* p = SEND_ADDR;int i;Target_Init();Delay(1000);SEND_DATA = 0x41; //初始化要發(fā)送的數(shù)據(jù)for (i = 0; i < 128; i++){*p++ = 0x41 + i;} rUCON0 = rUCON0 & 0xff3 | 0x8; //Uart設(shè)置成DMA形式rDISRC0 = (U32)(SEND_ADDR); //DMA0 初始化rDISRCC0 = (0<<1)|(0<<0); //源=AHB,傳送后地址增加rDIDST0 = (U32)UTXH0; //發(fā)送FIFO緩沖區(qū)地址rDIDSTC0 = (1<<1)|(1<<0); //目標(biāo)=APB,地址固定//設(shè)置DMA0控制寄存器:握手模式,與APB同步,使能中斷,單位傳輸,單個(gè)模式,目標(biāo)=UART0,//硬件請求模式,不自動(dòng)加載,半字,計(jì)數(shù)器初值=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); }總結(jié)
以上是生活随笔為你收集整理的嵌入式:ARM的DMA设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有序无序的变换 序号变图片 序号的各种
- 下一篇: (附源码)ssm欢欢宠物医院管理系统的设