13339|28

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

DMA接收溢出的问题 [复制链接]

请教各位高手 如果DMA接收设置为4个字节,但发了5个字节时,会吧数组前面的字节覆盖掉,等下一次在发送4个字节的时候,DMA接收数组还是串了一个字节?怎么解决呢?
此帖出自stm32/stm8论坛

最新回复

                                 1)关闭DMA和USART1USART1->CR3 &= (u16)~(USART_DMAReq_Rx | USART_DMAReq_Tx); // disable usart1 send/receive dma requestDMA_Channel4_CCR &= CCR_ENABLE_Reset;                   // disable dma chanel4DMA_Channel5_CCR &= CCR_ENABLE_Reset;                   // disable dma chanel5  USART1->CR1 &=CR1_UE_Reset;                             // disable USART1  2)初始化USART13)启动DMA和USART1  DMA_Channel4_CNDTR = xxx;         // initiate the length of the dma channel4  DMA_Channel5_CNDTR = xxx;           //initiate the length of the dma channel5  DMA_Channel4_CMAR = (u32)xxx;         // initiate the memory address of the dma channel4  DMA_Channel5_CMAR = (u32)xxx;      // initiate the memory address of the dma channel5  DMA_Channel4_CCR |= CCR_ENABLE_Set;                     // enable dma chennel4  DMA_Channel5_CCR |= CCR_ENABLE_Set;                     // enable dma chennel5    USART1->CR3 |= (u16)(USART_DMAReq_Rx | USART_DMAReq_Tx);  // enable usart1 send/receive dma request  USART1->CR1 |= CR1_UE_Set;                                // enable usart1   详情 回复 发表于 2009-4-25 09:47
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

什么芯片?

                                  
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

stm32103

                                 stm32103
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 

谢谢香主给我解答

谢谢香主给我解答
我用的DMA1_Chanel5 做的串口接收,循环模式和普通模式都试过了,重新初始化了,一旦有一次接收数据溢出,以后接收的数据都会错位
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 

不要用环形缓冲区模式

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 

用普通模式也覆盖

                                 用普通模式也覆盖
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 

用普通模式也覆盖

用普通模式也覆盖 
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 

用普通模式也覆盖?不大可能

                                 仔细检查你的程序,操作、设置不当。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 

麻烦香主帮忙看下我的程序那出了问题

 RCC_Configuration();
       
  /* NVIC configuration */
  NVIC_Configuration();

  /* Configure the GPIO ports */
  GPIO_Configuration();

  /* Configure the DMA */
  //DMA_Configuration();
  

  /* DMA Channel4 (triggered by USART1 Tx event) Config */
  DMA_DeInit(DMA1_Channel4);
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)TxBuffer1;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = TxBufferSize1;
  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_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);

  DMA_DeInit(DMA1_Channel5);  
  DMA_InitStructure1.DMA_PeripheralBaseAddr = USART1_DR_Base;
  DMA_InitStructure1.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure1.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure1.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure1.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure1.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure1.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure1.DMA_M2M = DMA_M2M_Disable;
  DMA_InitStructure1.DMA_MemoryBaseAddr = (u32)&RxBuffer[0];
  DMA_InitStructure1.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure1.DMA_BufferSize = 4;
  DMA_Init(DMA1_Channel5, &DMA_InitStructure1);
 SetupUSART();
  /* Enable USART1 DMA TX request */
  USART_DMACmd(USART1, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);
  /* Enable DMA Channel5 Transfer Complete interrupt */
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
  DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
  /* Enable the USART1 Receive Interrupt */
  //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

   /* Enable DMA Channel4 */
  //DMA_Cmd(DMA1_Channel4, ENABLE);
  /* Enable DMA Channel5 */
  DMA_Cmd(DMA1_Channel5, ENABLE);
 CurrDataCounter_End = DMA_GetCurrDataCounter(DMA1_Channel5);

  /* Wait until DMA_Channel 4 Transfer Complete */
  while(1)
  {
  ;        
  }

void DMAChannel5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC5))

        
        DMA_ClearITPendingBit(DMA1_IT_GL5);
        //CurrDataCounter_End = DMA_GetCurrDataCounter(DMA1_Channel5);
        DMA_Cmd(DMA1_Channel5, DISABLE);

        DMA_DeInit(DMA1_Channel5);  
       
        DMA_Init(DMA1_Channel5, &DMA_InitStructure1);

        /* Enable DMA Channel5 Transfer Complete interrupt */
        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
        DMA_Cmd(DMA1_Channel5, ENABLE);
        DMA_ClearITPendingBit(DMA1_IT_GL5);         
        dmaflag = 1;
        for(i=0;i<5;i++)
           RxBuffer1=0;

    }
}
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

10
 

香主帮忙看下,谢谢

                                 香主帮忙看下,谢谢
此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

11
 

你在哪里重新初始化接收通道了?

请看我在4楼的说明:多出的数据应该还在接收数据寄存器中,下次接收时,重新初始化一下接收通道即可。

你怎么知道覆盖的数据不是上次通信多出来的?
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 

进入DMA中断后初始化的

        DMA_DeInit(DMA1_Channel5);  
        DMA_Init(DMA1_Channel5, &DMA_InitStructure1);

        /* Enable DMA Channel5 Transfer Complete interrupt */
        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
        DMA_Cmd(DMA1_Channel5, ENABLE);
        DMA_ClearITPendingBit(DMA1_IT_GL5); 



        DMA_InitStructure1结构体没有重新付值因为我没有改变过结构体的值  
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 

谢谢香主

DMA_Init(DMA1_Channel5, &DMA_InitStructure1);
这个函数是初始化接收通道吧,我测试了,是上次接收的数据覆盖了这次的数据,可是怎么把上次接收到的数据清掉呢
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 

香主帮下忙

                                 您看我初始化的对不对?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 

请重新初始化你的通信通道,不是DMA通道

                                 数据是从通信通道过来的,DMA通道没有数据!
此帖出自stm32/stm8论坛
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

16
 

串口1重新初始化了

                                 串口1重新初始化了 也不行
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

17
 

没人遇到过类试的情况吗

                                 没人遇到过类试的情况吗
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 

如何重新初始化UART1?

应该Disable,然后再Enable。


如果下次操作读到了上次多出的数据,说明重新初始化操作不对,重新初始化应能够把上次多出剩余在接收寄存器中的数据。重新初始化之后,接收缓冲器应该为空。

你也可以在DMA传输结束后,通过判断接收缓冲器是否为空,来判断对方是否多发了数据,如果对方确实多发了数据,也可以通过读出数据寄存器清除多出的数据。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

19
 

是这么做的

                                 是这么做的,先Disable,然后再Enable,在开启DMA后 出现接收乱的数据
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 

看看我的代码

启动DMA
  DMA_Channel4_CNDTR = xxx;         // initiate the length of the dma channel4
  DMA_Channel5_CNDTR = xxx;           //initiate the length of the dma channel5
  DMA_Channel4_CMAR = (u32)xxx;         // initiate the memory address of the dma channel4
  DMA_Channel5_CMAR = (u32)xxx;      // initiate the memory address of the dma channel5
  DMA_Channel4_CCR |= CCR_ENABLE_Set;                     // enable dma chennel4
  DMA_Channel5_CCR |= CCR_ENABLE_Set;                     // enable dma chennel5  
  USART1->CR3 |= (u16)(USART_DMAReq_Rx | USART_DMAReq_Tx);  // enable usart1 send/receive dma request
  USART1->CR1 |= CR1_UE_Set;                                // enable usart1
  
关闭DMA

USART1->CR3 &= (u16)~(USART_DMAReq_Rx | USART_DMAReq_Tx); // disable usart1 send/receive dma request
DMA_Channel4_CCR &= CCR_ENABLE_Reset;                   // disable dma chanel4
DMA_Channel5_CCR &= CCR_ENABLE_Reset;                   // disable dma chanel5  
USART1->CR1 &=CR1_UE_Reset;                             // disable USART1  

按照以上顺序试试。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表