OpenEdv-开源电子网

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

DMA_GetCurrDataCounter()函数值不变!

[复制链接]

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
发表于 2012-7-22 15:07:24 | 显示全部楼层 |阅读模式
最近尝试用USART2的DMA模式来发送接收数据。接收的时候,发现DMA_GetCurrDataCounter()的值维持DMA_BufferSize的大小不变。若用while(DMA_GetFlagStatus(DMA1_FLAG_TC6)==RESET);则一直循环着。

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_USART1,ENABLE);
  //启动DMA时钟
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

void USART2_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  USART_Init(USART2, &USART_InitStructure);
  USART_Cmd(USART2, ENABLE);
  USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);
  USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
}
//接收部分
  DMA_DeInit(DMA1_Channel6);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SensorsData;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = Counts;
  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_Medium;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel6, &DMA_InitStructure);
  DMA_Cmd(DMA1_Channel6,ENABLE);
//发送正常

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-12-20 17:03:29 | 显示全部楼层
帧数据长度 = 一帧所占空间的大小 - 剩余 DMA缓存大小
业精于勤荒于嬉;行成于思毁于随!
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-22 17:47:41 | 显示全部楼层
回复【楼主位】觋-拂晓:
---------------------------------
功能正常么?
我都是用寄存器的.直接读寄存器值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-22 18:01:52 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
可以得到正确的数据。不过为什么DMA_GetCurrDataCounter()的值会不变呢?这不是代表着没传输完数据吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-22 18:10:36 | 显示全部楼层
回复【3楼】觋-拂晓:
---------------------------------
如果等于DMA_BufferSize,应该是标志已经传送完毕了.
这个可以参考我们的DMA实验,我们的里面有统计DMA发送百分比的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-22 21:15:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
哈?DMA_GetCurrDataCounter()不是求通道里剩余带传送的数据吗?另外DMA_GetFlagStatus(DMA1_FLAG_TC6)=RESET。。
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-22 21:36:38 | 显示全部楼层
回复【5楼】觋-拂晓:
---------------------------------
while(1) 
  { 
    if(DMA1->ISR&(1<<21))//等待通道6传输完成 
    { 
      DMA1->IFCR|=1<<21;//清除通道6传输完成标志 
      break; 
    } 
    remain=DMA1_Channel6->CNDTR;//得到当前还剩余多少个数据 
  }
还是不行。。。到底哪里有问题?蛋疼。。是不是要开中断。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-22 22:10:55 | 显示全部楼层
和中断无关
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-24 16:58:10 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥~我知道是什么情况了。原因是USART2_DR里没有数据。。不过我有个疑问我之前有发送数据到USART2_DR啊,难道是自动清除了?我看了一下他的参考手册,里面有说“USART_DR包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。”难道说发送跟接收是分开的??望不吝赐教。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-24 18:23:23 | 显示全部楼层
回复【8楼】觋-拂晓:
---------------------------------
USART_DR确实是由2个寄存器和在一起组成的,读写是分开的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-27 12:38:43 | 显示全部楼层
回复【9楼】正点原子:
-------------------------------
DMA接收模式为 DMA_Mode_Normal,发送过来的数据超过CNDTR时,接收就不正常了。这时会发生什么错误吗?类似溢出之类的。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-27 12:46:35 | 显示全部楼层
应该不会,接收到指定数量之后,应该DMA就停止了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-27 13:06:38 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
刚刚测了一下,会发生USART_IT_ORE这样的错误。。彻底崩溃了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-27 13:59:32 | 显示全部楼层
...
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-28 13:40:25 | 显示全部楼层
再问个问题。一步一步调试的时候发回来的数据是正常的;当我全速运行的时候,数据就错位了。


想要的结果:

DMA接收的结果:


该怎么去处理这个问题呢。。


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-7-28 14:47:55 | 显示全部楼层
你上位机一次就发送DMA接收长度的数据试试.
看看是不是DMA接收覆盖了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2012-3-18
在线时间
0 小时
 楼主| 发表于 2012-7-29 10:01:29 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
解决了。。全因读写的时机不对,导致数据丢失了。谢谢原子的耐心的解答。
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-10-31
在线时间
6 小时
发表于 2016-11-1 10:51:43 | 显示全部楼层
觋-拂晓 发表于 2012-7-28 13:40
再问个问题。一步一步调试的时候发回来的数据是正常的;当我全速运行的时候,数据就错位了。

想要的结果 ...

我也出现这个问题,你后面说因为读写时机不对,能具体点说说吗?我想我可能也是你这个原因,谢谢
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2016-10-31
在线时间
6 小时
发表于 2016-11-1 10:52:04 | 显示全部楼层
觋-拂晓 发表于 2012-7-29 10:01
回复【15楼】正点原子:
---------------------------------
解决了。。全因读写的时机不对,导致数据丢失了 ...

具体说说,谢谢
回复 支持 反对

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-10-12
在线时间
14 小时
发表于 2016-11-9 11:06:38 | 显示全部楼层
觋-拂晓 发表于 2012-7-29 10:01
回复【15楼】正点原子:
---------------------------------
解决了。。全因读写的时机不对,导致数据丢失了 ...

我是发好几次触发一次中断,而且DMA_GetCurrDataCounter()显示数值与实际发送个数不等,是你这个问题吗
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
189
金钱
189
注册时间
2015-7-22
在线时间
126 小时
发表于 2022-3-17 19:10:57 | 显示全部楼层
我也遇到了这个问题,这里回复一下,以便广大网友。我的情况是在串口DMA初始化时候,一开始就是DMA_Cmd(DMA1_Channel4, DISABLE);   然后发现DMA_GetCurrDataCounter(DMA1_Channel4)一直是设置的缓冲区长度,DMA_InitStructure.DMA_BufferSize = 4096; 即:(4096 == DMA_GetCurrDataCounter(DMA1_Channel4) )这个值一直不变。解决方法是:在串口DMA初始化时候设置:DMA_InitStructure.DMA_BufferSize = 0;DMA_Cmd(DMA1_Channel4, ENABLE); 这样设置就正常了,程序后面再读DMA_GetCurrDataCounter(DMA1_Channel4) 就是一直是0了。然后在要发送串口数据时候先DMA_Cmd(DMA1_Channel4, DISABLE);,然后重新设置DMA数据发送缓存的指针和数据长度;再DMA_Cmd(DMA1_Channel4, ENABLE);
work is work!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 00:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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