OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9061|回复: 2

DMA的接收设置

[复制链接]

2

主题

10

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-2-9
在线时间
3 小时
发表于 2012-3-15 21:59:57 | 显示全部楼层 |阅读模式
我看了很久论坛地贴子,发现关于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; //非存储器到存储器模式             
}

可以实现接收,但是不是很完善,,,,,希望有高手完善。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-15 23:33:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2012-3-19 16:47:59 | 显示全部楼层
注释有点问题,
DMA_CHx->CCR|=0<<6;  //外设地址不增量模式
DMA_CHx->CCR|=1<<7;  //执行存储器增量模式
DMA_CHx->CCR|=0<<5;  //普通模式 0为不循环模式
我觉得你可以直接改成DMA_CHx->CCR|=1<<5;  //普通模式 1为循环模式
这样你在while循环的时候,就可以一直读到数据了,而不用在20个数据读完之后,再重新开启DMA,
个人见解,谢谢,
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 04:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表