S3c2440A 支撑坐落体系总线和外设总线之间的4 个通道的控制器。每个DMA 控制器通道
无限制地履行体系总线上的设备或外设总线上的设备之间数据搬移。换句话说,便是每个
通道都操作一下四种状况:
(1)源和意图设备都在体系总线上
(2)源设备在体系总线上,意图设备在外设总线上
(3)源设备在外设总线上,意图设备在体系总线上
(4)源设备和意图设备都在外设总线上
DMA 的首要有点便是其传输数据不需求CPU 的干与。DMA 操作可由软件或来自内设或外
部恳求引脚来初始化。
DMA每次传送2个字节,放到FIFO中,IIS就播映,FIFO空,导致DMA被再次触发,直到传输计数器为0,发生DMA中止,CPU进入中止处理程序。在DMA传送的时分,CPU能够处理其他工作。提高了体系功率。
下面的程序运用IIS播映声响一同跑流水灯。假如不必DMA,直接用上一篇的IIS程序,会发现声响时断时续,由于IIS和流水灯一同分CPU的时刻。假如运用DMA,则IIS需求的数据由DMA担任传送,而CPU能够履行流水灯程序,相互不耽搁。当传输计数器为0时,发生DMA中止,CPU进入中止处理程序。其他时分,CPU能够履行流水灯。这样就完成了流水灯和IIS放音一同履行。
#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,数据传输形式
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);
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/254735.html