前言
前面提到,要想使用DMA首先要配置DMA
废话不多说,直接上代码吧
typedef struct {
//源地址高8位
unsigned char SRCADDRH;
//源地址低8位
unsigned char SRCADDRL;
//目的地址高8位
unsigned char DESTADDRH;
//目的地址低8位
unsigned char DESTADDRL;
//长度域模式选择
unsigned char VLEN :3;
//传输长度高字节
unsigned char LENH :5;
//传输长度低字节
unsigned char LENL :8;
//字节或字传输
unsigned char WORDSIZE :1;
//传输模式选择
unsigned char TMODE :2;
//触发事件选择
unsigned char TRIG :5;
//源地址增量:_1/0/1/2
unsigned char SRCINC :2;
//目的地址增量:-1/0/1/2
unsigned char DESTINC :2;
//中断屏蔽
unsigned char IRQMASK :1;
//7或8bit传输长度,仅在字节传输模式下适用
unsigned char M8 :1;
//优先级
unsigned char PRIORITY :2;
} DMA_CFG;
上面就是DMA配置安装的结构体
DMA的具体配置
void DMAtest(void)
{ char i;
char error = 0;
//源字符串
unsigned char sourceString[] = "I am the sourceString!\r\n";
//目的字符串
unsigned char destString[sizeof(sourceString)];
memset(destString,0,sizeof(destString));
// DMA配置安装——DMA参数的配置:源地址
dmaConfig.SRCADDRH=(unsigned char)((unsigned int)&sourceString >> 8);
dmaConfig.SRCADDRL=(unsigned char)((unsigned int)&sourceString );
//目的地址
dmaConfig.DESTADDRH=(unsigned char)((unsigned int)&destString >> 8);
dmaConfig.DESTADDRL=(unsigned char)((unsigned int)&destString);
//选择LEN 作为传送长度
dmaConfig.VLEN = 0x00;
//传输长度
dmaConfig.LENH = (unsigned char)((unsigned int)sizeof(sourceString)>>8);
dmaConfig.LENL = (unsigned char)((unsigned int)sizeof(sourceString));
//选择字节byte传送
dmaConfig.WORDSIZE = 0x00;
//选择块传送模式
dmaConfig.TMODE = 0x01;
//无触发,可理解为手动触发
dmaConfig.TRIG = 0;
//源地址增量为1
dmaConfig.SRCINC = 0x01;
//目的地址增量为1
dmaConfig.DESTINC =0x01;
//使能中断
dmaConfig.IRQMASK = 1;
//选择8位长的字节来传送数据
dmaConfig.M8 = 0x00;
//传送优先级为高
dmaConfig.PRIORITY = 0x02;
// DMA配置安装——DMA地址的配置:将配置结构体的首地址赋予相关SFR
DMA0CFGH = (unsigned char)((unsigned int)&dmaConfig >>8);
DMA0CFGL = (unsigned char)((unsigned int)&dmaConfig);
asm("nop");//等待加载结束
}
DMA地址的配置
DMA配置数据结构的地址是通过一组SFR来存放,通过寄存器DMAxCFGH:DMAxCFGL(高8位:低8位)送到DMA控制器
DMA0CFGH:DMA0CFGL给出DMA通道0配置数据结构的开始地址
DMA1CFGH:DMA1CFGL给出DMA通道1配置数据结构的开始地址,其后跟着通道2-4的配置数据结构。
// DMA配置安装——DMA地址的配置:将配置结构体的首地址赋予相关SFR
DMA0CFGH = (unsigned char)((unsigned int)&dmaConfig >>8);
DMA0CFGL = (unsigned char)((unsigned int)&dmaConfig);
代码有点多,希望大家能够慢慢理解,下期我们介绍怎么初始化DMA。