STM32 DMA 重新使能的一点心得

2019-07-20 22:41发布

最近做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(待传数据项数目)寄存器的值,然后才能重新使能
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-21 02:32
谢谢分享
SHIBO
2楼-- · 2019-07-21 07:41
 精彩回答 2  元偷偷看……
jiangxinwang
3楼-- · 2019-07-21 08:04
 精彩回答 2  元偷偷看……
kiang
4楼-- · 2019-07-21 09:45
靠谱
flwjn
5楼-- · 2019-07-21 12:45
我也是在调一个DMA+USART 总线空闲中断接收不定长数据的程序。
之前用的F103,没啥问题。
现在F407,就不行了。。

折腾了1半天多,确定硬件没问题。最后带仿真编译了35分钟41秒,一个一个寄存器查看,发现DMA没有重新使能。
flwjn
6楼-- · 2019-07-21 16:45
按楼主所说,又细看了一遍。

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

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

一周热门 更多>