S3C2440-DMA
無限制地執(zhí)行系統(tǒng)總線上的設(shè)備或外設(shè)總線上的設(shè)備之間數(shù)據(jù)搬移。換句話說,就是每個
通道都操作一下四種情況:
(1)源和目的設(shè)備都在系統(tǒng)總線上
(2)源設(shè)備在系統(tǒng)總線上,目的設(shè)備在外設(shè)總線上
(3)源設(shè)備在外設(shè)總線上,目的設(shè)備在系統(tǒng)總線上
(4)源設(shè)備和目的設(shè)備都在外設(shè)總線上
DMA 的主要有點就是其傳輸數(shù)據(jù)不需要CPU 的干涉。DMA 操作可由軟件或來自內(nèi)設(shè)或外
部請求引腳來初始化。
DMA每次傳送2個字節(jié),放到FIFO中,IIS就播放,F(xiàn)IFO空,導(dǎo)致DMA被再次觸發(fā),直到傳輸計數(shù)器為0,產(chǎn)生DMA中斷,CPU進入中斷處理程序。在DMA傳送的時候,CPU可以處理其他事情。提高了系統(tǒng)效率。
下面的程序使用IIS播放聲音同時跑流水燈。如果不用DMA,直接用上一篇的IIS程序,會發(fā)現(xiàn)聲音斷斷續(xù)續(xù),因為IIS和流水燈一起分CPU的時間。如果使用DMA,則IIS需要的數(shù)據(jù)由DMA負責傳送,而CPU可以執(zhí)行流水燈程序,互相不耽誤。當傳輸計數(shù)器為0時,產(chǎn)生DMA中斷,CPU進入中斷處理程序。其他時候,CPU可以執(zhí)行流水燈。這樣就實現(xiàn)了流水燈和IIS放音同時執(zhí)行。
#include "2440addr.h"
#include "music.h"
#define L3MODE 1<<2
#define L3DATA 1<<3
#define L3CLOCK 1<<4
#define _ISR_STARTADDRESS 0x33ffff00
#define U32 unsigned int
U32 flag, result, remain;
void Delay(){
int i, j, k;
for(i = 0; i < 0xff; i++)
for(j = 0; j < 0xff; j++)
for(k = 0; k < 0xff; k++)
;
}
void Led(){
int i;
for(i = 3; i < 7; i++){
rGPFDAT &= "(1<<i);
Delay();
rGPFDAT = 0xff;
}
}
void WriteL3(unsigned char data, unsigned int mode){
//mode = 0,地址模式;mode = 1,數(shù)據(jù)傳輸模式
int i, k;
if(mode == 0){
rGPBDAT = rGPBDAT & "(L3MODE|L3DATA|L3CLOCK )|L3CLOCK;
}
else{
rGPBDAT = rGPBDAT & "(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);
}
for(k = 0; k < 5; k++)
;
for(i = 0; i < 8; i++){
if(data & 0x1){
rGPBDAT &= "L3CLOCK;
rGPBDAT |= L3DATA;
for(k = 0; k < 5; k++)
;
rGPBDAT |= L3CLOCK;
rGPBDAT |= L3DATA;
for(k = 0; k < 5; k++)
;
}
else{
rGPBDAT &= "L3CLOCK;
rGPBDAT &= "L3DATA;
for(k = 0; k < 5; k++)
;
rGPBDAT |= L3CLOCK;
rGPBDAT &= "L3DATA;
for(k = 0; k < 5; k++)
;
}
data >>= 1;
}
rGPBDAT = rGPBDAT & "(L3MODE|L3DATA|L3CLOCK)|(L3CLOCK|L3MODE);
關(guān)鍵詞:
S3C2440DMA控制
評論