新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2012-2-9
- 在线时间
- 3 小时
|
我看了很久论坛地贴子,发现关于DMA的基本上都是发送数据,最近我要利用这个来接收串口的数据,于是思考良久。查阅资料,终于实现了。废话不说,上代码!
MYDMA_SConfig(DMA1_Channel5,(u32)&USART1->DR,(u32)&recbuff,20);//关键的语句1
LCD_ShowString(60,130,"Press KEY0 To Start!");
POINT_COLOR=BLUE;//设置字体为蓝色
i=0;
while(1)
{
//if(1)
//{
USART1->CR3=1<<6; //这一句就是使能DMA的接收 已经激活 前提 关键语句2
MYDMA_Enable(DMA1_Channel5);//开始一次DMA传输 (关键语句3) 上面在初始化的时候就已经定义,所以直接调用这个函数就会发送。
delay_ms(15);
//等待DMA传输完成,此时我们来做另外一些事,点灯
for(k=0;recbuff[m]!=0;k++)
{
m++;
}
LCD_ShowNum(60,170,m,3,16);
LCD_ShowString(60,150,recbuff); //显示接收到的语句4
// }
i++;
delay_ms(1);
if(i==200) //0.2秒
{
LED0=!LED0;//提示系统正在运行
i=0;
}
}
}
void MYDMA_SConfig(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr) //DMA1通道5,外设为串口1,存储器为recbuff,长度20
{
RCC->AHBENR|=1<<0;//开启DMA1时钟
__nop(); //等待 DMA1 时钟稳定
__nop(); //经测试最少 2 个 nop
__nop();
DMA_CHx->CPAR=cpar; //DMA1 外设地址 上一句就 已经把串口的地址赋给了Base变量
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址 buff
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量 这一句就是数据的长度
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=0<<4; //从外设读
DMA_CHx->CCR|=0<<5; //普通模式 1为循环模式
DMA_CHx->CCR|=0<<6; //外设地址增量模式
DMA_CHx->CCR|=1<<7; //不执行存储器增量模式
DMA_CHx->CCR|=0<<8; //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
}
可以实现接收,但是不是很完善,,,,,希望有高手完善。
|
|