OpenEdv-开源电子网

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

DMA+USART接收数据,为什么只能接收到一次

[复制链接]

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-4-7 11:33:11 | 显示全部楼层 |阅读模式
1金钱
STM32F205 DMA+USART接收数据。按照网上的说法,总线空闲中断里已经关掉了DMA,而后设置传输次数重启,可是还是只能接收一次。之后DMA_GetCurrDataCounter(DMA1_Stream5)返回值一直都是初值。代码:
rx_len = USART2->SR;rx_len = USART2->DR;
USART_ClearITPendingBit(USART2, USART_IT_IDLE);
DMA_Cmd(DMA1_Stream5, DISABLE);
。。。。。。
。。。。。。
while(DMA1_Stream5->CR & (uint32_t)DMA_SxCR_EN);        //ÅD¶ÏS5CRμÄENλêÇ·ñÎa0
DMA_SetCurrDataCounter(DMA1_Stream5, UART_RX_LEN);
DMA_Cmd(DMA1_Stream5, ENABLE);


谁能帮忙看看是怎么回事????



最佳答案

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

STM32F2手册上写,将EN 位置“1”以启动新传输(即调用DMA_Cmd(DMAy_Streamx, ENABLE)函数使能数据流)之前,DMA_LISR 或DMA_HISR 寄存器中与数据流相对应的事件标志(DMA_FLAG_TCIFx)必须清零。重新使能DMA之前清除DMA中断的标志位,问题就解决了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-4-7 11:33:12 | 显示全部楼层
STM32F2手册上写,将EN 位置“1”以启动新传输(即调用DMA_Cmd(DMAy_Streamx, ENABLE)函数使能数据流)之前,DMA_LISR 或DMA_HISR 寄存器中与数据流相对应的事件标志(DMA_FLAG_TCIFx)必须清零。重新使能DMA之前清除DMA中断的标志位,问题就解决了
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-4-7 12:39:59 | 显示全部楼层
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-4-7 13:15:28 | 显示全部楼层
八度空间 发表于 2017-4-7 12:39
http://www.openedv.com/forum.php?mod=viewthread&tid=96254&extra=可以参考下我的做法

我现在的状况是第一次DMA接收结束之后,数据流再次使能的时候失败。需要重新初始化DMA么?
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-4-7 14:38:21 | 显示全部楼层
我最近在研究F0系列的DMA,在文档上看到这样一句话
If a DMA channel is disabled, the DMA registers are not reset. The DMA channel registers
(DMA_CCRx, DMA_CPARx and DMA_CMARx) retain the initial valuesprogrammed during
the channel configuration phase.
大意讲的是如果禁止掉DMA功能后,再使能DMA,相关DMA通道的寄存器不会被复位掉,会保留上一次执行的值
在你的程序里面,在接收完一次数据后,失能DMA通道时,DMA的CNDTR寄存器应该已经被清0了
而当你再次去使能它时,这个寄存器一直为0,所以就不会去产生接收的动作,所以你读取出来DR的值一直没有更新,就会是第一次的数值。

个人拙见。

回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-4-7 15:55:05 | 显示全部楼层
JUSTNIUB 发表于 2017-4-7 14:38
我最近在研究F0系列的DMA,在文档上看到这样一句话
If a DMA channel is disabled, the DMA registers are ...

NDTR的值已经软件重设了,不是0.我看了一下午数据手册,找到出问题的地方在于需要在重新使能DMA之前清除DMA_LISR 和 DMA_HISR中的中断标志位。因为我用的是USART的总线空闲中断,所以一直没注意DMA中断的问题
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-4-7 16:13:49 | 显示全部楼层
Owen 发表于 2017-4-7 15:55
NDTR的值已经软件重设了,不是0.我看了一下午数据手册,找到出问题的地方在于需要在重新使能DMA之前清除D ...

恩,我也有考虑过,NDTR的值不太可能是0.
不过你提到的这两个中断我在F0系列上确实没有见到过,所以给出的参考不正确。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-4-7 16:15:30 | 显示全部楼层
JUSTNIUB 发表于 2017-4-7 16:13
恩,我也有考虑过,NDTR的值不太可能是0.
不过你提到的这两个中断我在F0系列上确实没有见到过,所以给出 ...

DMA_LISR 和 DMA_HISR是存中断标致的寄存器,不是中断标致,估计F0上也会有。
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-4-7 16:25:49 | 显示全部楼层
Owen 发表于 2017-4-7 16:15
DMA_LISR 和 DMA_HISR是存中断标致的寄存器,不是中断标致,估计F0上也会有。

F0上的DMA中断只有error ,half-transfer和transfer-complete这三种,F0中断寄存器是ISR,所以还是有些不一样,有时间研究下其他系列的,看看区别。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
 楼主| 发表于 2017-4-7 16:51:32 | 显示全部楼层
JUSTNIUB 发表于 2017-4-7 16:25
F0上的DMA中断只有error ,half-transfer和transfer-complete这三种,F0中断寄存器是ISR,所以还是有些不 ...

我发现F2系列的DMA和F4的一样,数据手册上面写的基本一样,而且F4的手册有中文的
回复

使用道具 举报

7

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2017-4-6
在线时间
67 小时
发表于 2017-4-7 17:51:58 | 显示全部楼层
Owen 发表于 2017-4-7 16:51
我发现F2系列的DMA和F4的一样,数据手册上面写的基本一样,而且F4的手册有中文的

32系列应该都差不多吧
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 08:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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