tq2440 的dma裸機驅動

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">	</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">DMA是一種提高CPU效率的工具。如果讓cpu去負責搬運數據,效率是十分低下的,因爲在這個過程中,cpu就只能做這麼一件事。因此DMA就應運而生。只要告訴dma,要搬運的數據源地址,以及要搬運到哪裏去的地址,何種方式,使能它,DMA就會獲取總線控制權,自動地搬運數據,從而解放cpu,提高效率。</span>

tq2440的dma裸機驅動,按以下方式進行初始化:

//初始化原地址

//初始化目的地址

//dma 控制方式初始化

//使能dma


參照2440芯片手冊,dma共有4個通道,我們選擇將字符串數據傳輸到串口上(UART0),對應通道ch-0.


each DMA channel has nine control registers.ch-0 有9個寄存器,但在本次裸機驅動中,並不需要全部用上。(用到再來細究)


首先是初始化原地址:

DISRCn 是一個source register ,需要給它傳遞數據源地址;

DISRCCn 是source control register ,通過對此register進行操作,控制某些方式。

它的[0]位爲 select the address increment ,賦值爲0,表示DISRCn在傳輸完一次之後,地址會增加,指向下一個地址單元

第[1]位爲選擇source的總線結構,我們要傳遞的數據在內存中,內存是AHB總線,故在這兒select  0.


第二步是初始化目的地址:

DIDSTn 是一個 destination register,傳遞給它的值,應該是一個地址,此處應爲我們的uart0的發送緩衝區地址,UTXH0。

DIDSTC0 ,destination control register ,控制方式用。

第[2]位,但傳送剩餘個數爲0時,發生一次中斷,因此select 0

第[1]位,uart0 處在APB總線上,因此選擇1

第[0]位,uart0的UTXH0地址應該固定住,因爲我們定向輸出到串口,所以select 1


第三步,dma控制方式初始化

DCONn control register .

[24-26]位,select DMA request source for each DMA,此處爲001,uart0

[23]  位 爲,1.

[22] ,DMA傳送完畢後就關閉,故選 1.

[20-21],默認傳送字節,byte。

[19-0],傳送的數據個數


第四步,使能dma,DMASKIRIGn,把該寄存器的第[1]位置 1 。

一下爲裸機的一些代碼。


 11 char *buf = "hello world!\n";
 12 void dma_init()
 13 {
 14     //初始化源地址
 15     DISRC0 = (unsigned int)buf;
 16     DISRCC0 = (0<<0) | (0<<1);
 17 
 18 
 19 
 20     //初始化目的地址
 21     DIDST0 = UTXH0;
 22     DIDSTC0 = (1<<0) | (1<<1) | (0<<2);
 23 
 24     DCON0 = (1<<24) | (1<<23) | (1<<22) | (13<<0);
 25 
 26 }
 27 
 28 void dma_start()
 29 {
 30     DMASKTRIG0 = (1<<1);
 31 }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章