OpenEdv-开源电子网

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

STM32 DMA 重新使能的一点心得

[复制链接]

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-4-7 16:14:08 | 显示全部楼层 |阅读模式
最近做STM32F205的DMA+USART 总线空闲中断接收不定长数据的程序,在总线空闲中断里处理DMA缓存的数据。期间一直存在问题就是DMA只能接收一次数据,之后即便在DMA停止状态下使用DMA_SetCurrDataCounter()设置待发送数据项数目,DMA也不能重新使能。查了数据手册发现,必须将DMA_LISR DMA_HISR中相关的事件标致清零才能重新配置数据流。因为我用的是USART_IT_IDLE标致的总线空闲中断处理,所以一直没注意DMA中断标志位的清除,导致出错。
另附一些USART+DMA重新使能方面的内容:
l  DMA通道disable后重新enable的时候,数据会重新从DMA_MemoryBaseAddr(DMA缓存区首地址)开始写入。
l  注意: 将EN 位置“1”以启动新传输(即调用DMA_Cmd(DMAy_Streamx, ENABLE)函数使能数据流)之前,DMA_LISR 或DMA_HISR 寄存器中与数据流相对应的事件标志(DMA_FLAG_TCIFx)必须清零。
l  如果DMA_SxNDTR(待传数据项数目)寄存器的值为零,则即使使能数据流,也无法完成任何事务。
l  如果使能了数据流,通过重置DMA_SxCR 寄存器中的 EN 位将其禁止,然后读取此位以确认没有正在进行的数据流操作。将此位写为 0 不会立即生效,因为实际上只有所有当前传输都已完成时才会将其写为 0。当所读取 EN 位的值为 0 时,才表示可以配置数据流。因此在开始任何数据流配置之前,需要等待 EN 位置 0。应将先前的数据块 DMA传输中在状态寄存器(DMA_LISR 和 DMA_HISR)中置 1 的所有数据流专用的位置 0,然后才可重新使能数据流
l  应先将EN位 置0,然后才能重新设置DMA_SxNDTR(待传数据项数目)寄存器的值,然后才能重新使能

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-4-7 18:25:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
201
金钱
201
注册时间
2017-4-5
在线时间
24 小时
发表于 2017-4-17 19:27:35 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2017-4-17
在线时间
24 小时
发表于 2017-4-26 08:48:44 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2017-2-6
在线时间
24 小时
发表于 2017-4-26 08:52:46 | 显示全部楼层
靠谱
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2018-11-10
在线时间
21 小时
发表于 2019-7-13 14:03:53 | 显示全部楼层
我也是在调一个DMA+USART 总线空闲中断接收不定长数据的程序。
之前用的F103,没啥问题。
现在F407,就不行了。。

折腾了1半天多,确定硬件没问题。最后带仿真编译了35分钟41秒,一个一个寄存器查看,发现DMA没有重新使能。
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2018-11-10
在线时间
21 小时
发表于 2019-7-13 14:41:37 | 显示全部楼层
按楼主所说,又细看了一遍。

禁止DMA后,对应的TCIF 传输完成中断标志,会置位。
清除TCIF 后,DMA才可以重新使能。

另外发现,DMA_SxNDTR如果不需要更改预设值,直接使能DMA就会自动重装。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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