OpenEdv-开源电子网

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

DMA双缓存串口发数据有乱码

[复制链接]

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-1-26
在线时间
58 小时
发表于 2016-12-22 16:24:57 | 显示全部楼层 |阅读模式
1金钱
我用的是原子F407开发板,我的DMA双缓存配置如下


       

     DMA_InitTypeDef  DMA_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
        if((u32)DMA_Streamx>(u32)DMA2)
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
               
        }else
        {
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
        }
  DMA_DeInit(DMA_Streamx);
       
        while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}
       

  DMA_InitStructure.DMA_Channel = chx;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;
  DMA_InitStructure.DMA_Memory0BaseAddr = mar0;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = ndtr;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA_Streamx, &DMA_InitStructure);
               
        /*DMA double buffer mode*///
        DMA_DoubleBufferModeConfig(DMA_Streamx,(uint32_t)&mar1,DMA_Memory_0);
        DMA_DoubleBufferModeCmd(DMA_Streamx,ENABLE);

发送的双缓存为和发送的数据数量为
#define SEND_BUF_SIZE 8

u8 SendBuff[]={0x01,0x02,0x03,0x04};       
u8 SendBuff1[]={0x09,0x0a,0x0b,0x0c};       

我在主函数中
                                                               
                    while(1)
                  {                                                               
                        if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)
                        {
                                DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);                                       
                                                                                        break;
                        }
                                               
                }       
现象:
1:当我使能DMA传输时
        MYDMA_Enable(DMA2_Stream7,SEND_BUF_SIZE);
       串口不停的循环收到
      01 02 03 04 09 0A 0B 0C 10 00 00 00 08 00 00 00
      应该只收到01 02 03 04 09 0A 0B 0C才对呀
     为什么会有10 00 00 00 08 00 00 00这些数据呀?
2:当我在传输完成时关掉DMA也就是只传一次的时候
                        if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)
                        {
                               
                               MYDMA_Disable(DMA2_Stream7);       
                              DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);                               
                                                                                        break;
                        }
    数据是正确的,即01 02 03 04 09 0A 0B 0C没有乱码。


求助:拜托各位大神指点下,怎么循环发送,没有乱码。谢谢啦!

       

最佳答案

查看完整内容[请看2#楼]

SEND_BUF_SIZE,应该改为4
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-12-22 16:24:58 | 显示全部楼层
回复

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-1-26
在线时间
58 小时
 楼主| 发表于 2016-12-26 16:43:52 | 显示全部楼层
SEND_BUF_SIZE 改为4就只循环发 01 02 03 04 了,不发 09 0A 0B 0C了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 05:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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