硬汉嵌入式论坛

 找回密码
 立即注册
查看: 666|回复: 14
收起左侧

[有问必答] 在非循环模式下关闭DMA,在开启DMA,是否起效。

[复制链接]

35

主题

106

回帖

211

积分

高级会员

积分
211
发表于 2024-1-17 13:33:45 | 显示全部楼层 |阅读模式
123.png DMA配置为“非循环”的模式,在DMA传输完成的中断函数里面关闭了数据流DMA_Cmd(DISABLE),在清除传输完成标志位后再使能DMA_Cmd( ENABLE)。这时DMA无法启动,是不是需要重新配置源地址、目标地址和数据长度等所有的参数,还是配置一个原本的参数就可以了。

321.png DMA配置为“非循环”的模式,在DMA数据流的数据项数寄存器DMA_SxNDTR没有减到0之前。我提前关闭了DMA的数据流DMA_Cmd(DISABLE),是不是重启的话也需要再重新配置所有的参数,还是说配置一部分就可以了?


回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-17 15:42:47 | 显示全部楼层
只配置长度
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-17 16:41:23 | 显示全部楼层
不需要再配置,只需要把DMA_SxCR.EN设为1 就可以传送余下的数据。
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-18 08:16:59 | 显示全部楼层

就是在停止DMA_Cmd(DISABLE)的数据流后,如果要重启的话,只需要配置数据的多少就可以了,然后DMA就会填充之前的配置,是这样吗?如果不配置长度,则DMA_Cmd( ENABLE)不会生效是吗?
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-18 08:18:50 | 显示全部楼层
Edmund1964 发表于 2024-1-17 16:41
不需要再配置,只需要把DMA_SxCR.EN设为1 就可以传送余下的数据。

我测试了,在没有配置循环模式的情况下,提前暂停DMA的传输,直接把DMA_SxCR.EN设为1后不起作用
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-18 11:06:47 | 显示全部楼层
坚持再坚持 发表于 2024-1-18 08:16
就是在停止DMA_Cmd(DISABLE)的数据流后,如果要重启的话,只需要配置数据的多少就可以了,然后DMA就会填 ...

是的,单次传输是这样的
Snipaste_2024-01-17_15-39-06.jpg
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-18 11:23:12 | 显示全部楼层
是的,流程:先DMA_Cmd(DISABLE),然后重新设置通道长度,最后DMA_Cmd(ENABLE)
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-18 13:32:34 | 显示全部楼层
坚持再坚持 发表于 2024-1-18 08:18
我测试了,在没有配置循环模式的情况下,提前暂停DMA的传输,直接把DMA_SxCR.EN设为1后不起作用

清了完成标准位没有?
这个我之前做过, 步骤是
一 DMA_SxCR.EN = 0
二 判断 DMA_xISR.TC1FX 为1
三 ......
四 清除DMA_xISR.TC1FX
五 DMA_SxCR.EN = 1
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-19 10:59:05 | 显示全部楼层
Edmund1964 发表于 2024-1-18 13:32
清了完成标准位没有?
这个我之前做过, 步骤是
一 DMA_SxCR.EN = 0

请问,你是直接:1.DMA_Cmd(DISABLE);2.清除DMA_xISR.TC1FX;3.DMA_Cmd(ENABLE),只用了这三部,中间没有配置DMA的任何参数?和楼上的观点有些相反
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-19 11:01:22 | 显示全部楼层
xxm 发表于 2024-1-18 11:23
是的,流程:先DMA_Cmd(DISABLE),然后重新设置通道长度,最后DMA_Cmd(ENABLE)

这种问题官方的参考手册里面也没有描述清楚,面对这种问题,请问只能自己慢慢摸索测试,或者发帖询问吗?
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-19 13:02:09 | 显示全部楼层
坚持再坚持 发表于 2024-1-19 11:01
这种问题官方的参考手册里面也没有描述清楚,面对这种问题,请问只能自己慢慢摸索测试,或者发帖询问吗?

我现在才注意到这是F4,F1的流程就是上边提到的,F4的我没测试过,你可以试一试,不要停留在理论,多实践,测试下可行性
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-19 13:08:26 | 显示全部楼层
先要搞清除一点dma工作在何种模式,既然已经说了非循环模式,那么传输结束就需要手动填充长度。
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-19 15:02:47 | 显示全部楼层
xxm 发表于 2024-1-19 13:08
先要搞清除一点dma工作在何种模式,既然已经说了非循环模式,那么传输结束就需要手动填充长度。

好的,谢谢!
回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-19 23:41:27 | 显示全部楼层
坚持再坚持 发表于 2024-1-19 10:59
请问,你是直接:1.DMA_Cmd(DISABLE);2.清除DMA_xISR.TC1FX;3.DMA_Cmd(ENABLE),只用了这三部,中间没 ...

2 是判断DMA_xISR.TC1Fx
用DMA_Cmd(Disable) 后DMA传送不是马上停止的, 所以DMA_Cmd(Disable) 后要判断DMA_xISR.TC1Fx为1, DMA才是真的停止了。

你让DMA它暂停, 但又不等它完成暂停这动作, 又马上让它开始,它当然会出问题了。
回复

使用道具 举报

35

主题

106

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2024-1-25 09:44:16 | 显示全部楼层
Edmund1964 发表于 2024-1-19 23:41
2 是判断DMA_xISR.TC1Fx
用DMA_Cmd(Disable) 后DMA传送不是马上停止的, 所以DMA_Cmd(Disable) 后要判断 ...

在非循环模式下,关闭DMA_Cmd(Disable) 后,因为FIFO中没有需要刷新的数据了,所以DMA_SxCR寄存器中的EN位清0了。但是我没有清除DMA_xISR.TC1Fx完成标志位,所以再次使能DMA_Cmd(ENABLE)后不起作用。但是在配置成DMA循环模式下:在关闭DMA_Cmd(Disable) 后,好像就不需要主动清除清除DMA_xISR.TC1Fx完成标志位了,DMA自动会启动。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 10:06 , Processed in 0.220550 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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