求个串口DMA方式接收数据例程..自己写的有bug

2019-03-23 20:32发布

本来觉得从发送改写成接收.应该是很简单的啊.实践了一下..基本上失败了.收到的数据保存在本地数组.然后分别在LCD显示和通过另一个串口输出.LCD会快速的显示一遍所有字符.串口输出则全部是乱码.也不知道哪里错了.用的红牛板.谢谢大家啦
完整程序在下面.贴几个自己觉得问题比较大的地方.大虾帮忙瞅瞅吧

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
        u32 DR_Base;  //做缓冲用,不知道为什么.非要不可
        RCC->AHBENR|=1<<0;//开启DMA1时钟
        DR_Base=cpar;
        DMA_CHx->CPAR=DR_Base;          //DMA1 外设地址     DMA通道 x外设地址寄存器(DMA_CPARx)
        DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址           DMA通道 x存储器地址寄存器(DMA_CmARx)
        DMA1_MEM_LEN=cndtr;      //保存DMA传输数据量
        DMA_CHx->CNDTR=cndtr;    //DMA1,传输数据量
        DMA_CHx->CCR=0X00000000;//复位
        DMA_CHx->CCR|=1<<0;  //通道开启  add
        DMA_CHx->CCR|=1<<1;  //允许传输完成中断  add
        DMA_CHx->CCR|=0<<4;  //从外设读          
        DMA_CHx->CCR|=0<<5;  //普通模式         0
        DMA_CHx->CCR|=1<<6;  //外设地址非增量模式
        DMA_CHx->CCR|=0<<7;  //存储器增量模式
        DMA_CHx->CCR|=0<<8;  //外设数据宽度为8位
        DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
        DMA_CHx->CCR|=1<<12; //中等优先级
        DMA_CHx->CCR|=0<<14; //非存储器到存储器模式        0                 
}


main:
                 MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SendBuff,10);// added
                LCD_ShowString(60,150,"Start Transimit....");
                LCD_ShowString(60,170,"   %");//显示百分号

                printf(" DMA DATA: ");
                MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SendBuff,10);// added             
            USART1->CR3=1<<6;           //使能串口1的DMA接受     
                MYDMA_Enable(DMA1_Channel5);//开始一次DMA传输! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
daicheng
1楼-- · 2019-03-24 03:08
/ 目前出现什么 BUG
astwyg
2楼-- · 2019-03-24 05:25
原帖由 daicheng 于 2011-3-28 17:32 发表
目前出现什么 BUG



已经调好了.之前是因为本地指针自增1没有打开.发个能超时的DMA收发程序.有点小白,自己写的 嘿嘿

[ 本帖最后由 astwyg 于 2011-6-14 16:23 编辑 ]

一周热门 更多>