发新帖我要提问
12
返回列表
打印
[STM32F1]

到底执行哪个?

[复制链接]
楼主: zwll
手机看帖
扫描二维码
随时随地手机跟帖
21
zyf部长| | 2020-7-26 13:22 | 只看该作者 回帖奖励 |倒序浏览
好像还看到有说法,dma干活时候要占用总线的,这时候cpu就不能占用总线的

使用特权

评论回复
22
zwll|  楼主 | 2020-7-26 13:28 | 只看该作者
意思dma哪怕做的事没用中断,直接操作的,而又因为它占用了总线,所以cpu虽然能运算,但是没法控制外设?

使用特权

评论回复
23
wangpe| | 2020-7-26 13:30 | 只看该作者
要等dma释放了总线才能控制外设

使用特权

评论回复
24
zwll|  楼主 | 2020-7-26 13:33 | 只看该作者
比如控制定时器改变输出的pwm?

使用特权

评论回复
25
bqyj| | 2020-7-26 13:36 | 只看该作者
DMA每次传输占用总线的时间,只有几个时钟周期而已,基本可以忽略。

使用特权

评论回复
26
songqian17| | 2020-7-26 13:41 | 只看该作者
你的理解有点问题。
以STM3210x 为例:
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。

注意,是外设请求DMA,然后DMA控制器传输数据,而不是DMA去控制外设!DMA也不是内存,里面是放不进数据的。

使用特权

评论回复
27
llljh| | 2020-7-26 13:46 | 只看该作者
假设用IIC来发送一个数组。TxBuff[10];你可以先发送第一个数据,中断后再发送第二个,再中断再发送。。直到10个数据全发完。

使用特权

评论回复
28
renyaq| | 2020-7-26 13:49 | 只看该作者
假如配置好DMA之后。只要TxE位被置位,它会自己把10个数据全发完

使用特权

评论回复
29
yinxiangh| | 2020-7-26 13:54 | 只看该作者
如果需要,全部发送完成后也可以产生中断

使用特权

评论回复
30
lium| | 2020-7-26 13:59 | 只看该作者
在DMA传送期间,CPU该干嘛干嘛。

使用特权

评论回复
31
zwll|  楼主 | 2020-7-26 14:02 | 只看该作者
看了点dma这块的介绍,感觉dma好像对我那个iic读传感器的值需要花费700us多的时间好像于事无补?

使用特权

评论回复
32
zwll|  楼主 | 2020-7-26 14:04 | 只看该作者
是不是这样,我感觉的读花费700us是因为iic的频率我只做到了360khz,然而数据特别的多,所以传感器把数值发过来在iic总线上传播的时间就有好长好长,用dma也是传感器从总线上把数据传完了,dma可以控制将iic的数据寄存器的值给某一个变量,而这个过程用cpu操作,本身也占的时间在700us里面也是很少的一部分对吧?所以用iic的dma和用cpu来操作iic,这个700us不可能有啥变化,对吗?

使用特权

评论回复
33
tian111| | 2020-7-26 14:07 | 只看该作者
如果用dma,传感器开始从总线上传数这个过程,cpu不用等待标志位,可以去干别的事情了?

使用特权

评论回复
34
zwll|  楼主 | 2020-7-26 14:20 | 只看该作者
传感器传数到iic数据寄存器受到数,这个过程花费的时间最多是这样吗?

使用特权

评论回复
35
dingy| | 2020-7-26 14:22 | 只看该作者
一直没有太明白的你的描述。
是不是这样一个情况:
你用一个传感器,这个传感器大约每700us(也可能更短)就产生一个数据,然后它通过IIC接口把数据发送给CPU。
然后你觉得CPU每700us就去操作一下IIC接口,去读这一个数据,感觉太频繁?

使用特权

评论回复
36
pengf| | 2020-7-26 14:26 | 只看该作者
你想使用DMA,让传感器传过来比如10个数据之后,你(间隔7ms)再一下子处理那10个数据?

使用特权

评论回复
37
liuzaiy| | 2020-7-26 14:29 | 只看该作者
对dma接触的不多,看看,学习学习了。。

使用特权

评论回复
38
zwll|  楼主 | 2020-7-26 14:42 | 只看该作者
不是的,是这样,可能我没说明白,不好意思,传感器每5ms产生一个数,用iic读取一次数要花费700us,就是传输传感器的数据由于数据较大,光是传输的过程就要要花费700us,也就是每次收数iic通讯维持的时间700us,而就是这个700us时间我觉得太长了,因为你看,我还有别的东西要周期性操作,有个定时器输出pwm的中断是100us一次,如果每5ms内,收这个传感器的数,iic就要占用700us,这个如果是cpu操作读数,cpu就得一直等着iic总线读完了,这700us就不能做别的事情,也就是我希望那个pwm的那个100us这个周期不被打断,不想这个700us读数的时候,其他的事情都在等待,不能做

使用特权

评论回复
39
llljh| | 2020-7-26 14:45 | 只看该作者
我曾经用过无刷直流电机,PWM是16.3KHz的,采用霍尔换向,速度3~5m/s,用的触发换相,时间间隔也就30ms左右,没事啊,还能读RFID,其他传感器也行啊,不过用的是ucosii,如果容量够大,你可以考虑一下操作系统,好处就是不在用延时了,延时的时间去做别的事情

使用特权

评论回复
40
zwll|  楼主 | 2020-7-26 14:49 | 只看该作者
用上dma了,我那个是主接收,应该是使用不了iic中断的,我现在的具体操作我是这么做的,我的那个主接收读取数据花费700us之多是放在一个触发中断里面的,是有3次单个字节的读取加上一次16和字节的读取,耗时最大的是在后面的16字节上,而前面的单个字节的读完之后后面还要cpu介入去判断条件然后去处理的,所以肯定要cpu,所以我把dma用在了后面的16个字节读取上了,现在只要进入到了后面的dma读取时候,我用while等待去等,在这个等待里面,我那个10khz的中断可以打断它,这样就不算cpu浪费了,这个10khz的中断,优先级就应该要最高才行,除了这个10k中断其他的cpu也不需要做啥事情,之间遇到的问题就是那个读三个单独字节的那个iic过程,那里如果10k的中断的持续时间过长会导致硬件iic挂掉,具体测试的是30us以上的中断打断就会工作一段时间之后挂掉,,20几us就没事。所以保持这个打断硬件iic的中断时间在30us以下,比较保险

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则