OpenEdv-开源电子网

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

检查DMA传输完成标志位有必要吗

[复制链接]

10

主题

22

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-3-9
在线时间
28 小时
发表于 2018-8-9 00:34:32 | 显示全部楼层 |阅读模式
本帖最后由 盖爷 于 2018-8-9 00:47 编辑

在论坛上看到许多大佬写的程序:
u8 DMA1_Star_SPI_TX(u8 *buffer)
{
                DMA1_Channel5->CNDTR=512;
                DMA1_Channel5->CMAR=(uint32_t)buffer;         
                DMA_Cmd(DMA1_Channel5,ENABLE);
                while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
                DMA_ClearFlag(DMA1_FLAG_TC5);
                DMA_Cmd(DMA1_Channel5,DISABLE);
}


以这个为例子,程序中有         while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));   这句话,这说明我调用这个函数时,程序会在        while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));  这个地方停止一段时间,直到标志位置位。

但是我看原子哥的程序里,并没有whlie()判断。

DMA的意思是直接内存传输,所以不占用CPU的资源,但是许多大佬加上了        while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));   这句话,这不是间接地占用了CPU资源了吗,因为当没有传输完成时,程序就一直卡在while循环里面不出来,没法执行其他的函数,所以我想知道为啥许多人写程序时要加这句话,加这句话有啥好处啊?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4524
金钱
4524
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-9 01:29:23 | 显示全部楼层
这个并没有什么可奇怪的,
CPU让外设执行一项任务,
查看结果都无外乎两种,
一种是被动中断,一种是主动查询。
并且肯定是中断的效率高,基本不影响CPU执行其它任务,所以尽量使用这种方式。
但查询的方式也不能不让人用,
查询的方式肯定耗用CPU,
但耗用多少是因程序而异的,如果CPU无事可干,可能整个DMA期间,CPU都在闲等。
但也有可能CPU比较忙,DMA完成后,CPU才来查询,
好的程序应该大致计算时间,尽量不要让CPU等时间太多或基本不等待。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-8-9 08:36:40 | 显示全部楼层

回帖奖励 +5 金钱

1.假设你数据比较多,需要花较长时间等待传输完成,如果不判断传输是否完成程序就往下走,关闭了通道,那剩下的数据就没法传了。
2.原子哥没有写上其他大神却写上了,这没有对错的问题,我觉得更多是看经验和工作过程中自己调试去完善的
没有脑袋
回复 支持 反对

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-9 08:48:54 | 显示全部楼层
我觉得是有必要的。

在实际应用的时候,往往用DMA传输的是比较多的数据,有的时候CPU完成了手中的工作,需要启动下一部分数据传输的时候就务必要判断当前的DMA通道中的数据是否传输完成。不加的话还是有一定概率出现数据没传完,DMA控制器就被重新配置了。
十六进制带我飞。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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