打印

STM32用来做曼彻斯特码的问题

[复制链接]
楼主: kevinleez
手机看帖
扫描二维码
随时随地手机跟帖
21
放心吧,驱动TLS3001吧?我做过的,没问题。用SPI+DMA.
z_no1 发表于 2010-12-2 08:48

可否把实现方法贴出来,给兄弟参考一下。

使用特权

评论回复
22
lxyppc| | 2010-12-3 19:51 | 只看该作者
DMA搞不定这个应用
他的是单线的,相当于是只有一个D+的USB口
要求生成的信号是稳定的,DMA不能保证稳定,微观上的稳定

使用特权

评论回复
23
z_no1| | 2010-12-4 16:31 | 只看该作者
我也不清楚是否能保证微观的稳定,手册上没有这个的介绍,以前我拿这个问题问过香版,他老人家也不是全知全能的。不过测试上看还是稳定的。我把DMA调到优先最高级。

使用特权

评论回复
24
lxyppc| | 2010-12-4 18:35 | 只看该作者
这个要看STM32里面的总线抢占时是如何仲裁了

使用特权

评论回复
25
z_no1| | 2010-12-4 19:45 | 只看该作者
是啊,但查了些资料,没有关于此的详细说明。

使用特权

评论回复
26
香水城| | 2010-12-5 09:14 | 只看该作者
DMA搞不定这个应用
他的是单线的,相当于是只有一个D+的USB口
要求生成的信号是稳定的,DMA不能保证稳定,微观上的稳定
lxyppc 发表于 2010-12-3 19:51


不错,如果你要求非常准确的时序,那么使用DMA对GPIO操作确实不能保证稳定输出。

对于这样的要求,我们是使用TIM的输出完成,根据输出时序事先计算出高低电平的时间,然后把计算出来的TIM数据存在RAM缓冲区,使用DMA不断更新TIM的定时参数。因为定时器的ARR和比较寄存器有影子寄存器,弥补了总线仲裁时间不易预估的不稳定因素,结果保证了稳定输出。我们的ST-LINK就是使用的这种方案。

使用特权

评论回复
27
z_no1| | 2010-12-6 14:58 | 只看该作者
香版啊,我是用SPI发的啊,不算对GPIO操作吧?SPI发数据也是有缓冲的。架构里有无规定在何等优先级的DMA操作最大延时是多少个周期呢?不过如果要用TIM的输出来做,我还不会呢。影子寄存器,作用和SPI的缓冲类似吧?

使用特权

评论回复
28
z_no1| | 2010-12-6 15:04 | 只看该作者
换句话说,我只是想寻求一个办法,能提供不间断的SPI数据流,关键是不可中断。用最高优先级的DMA能保证么?如果不能,会是什么影响了,如何避免?比如不可屏蔽中断等等?

使用特权

评论回复
29
z_no1| | 2010-12-6 16:21 | 只看该作者
香版啊,你是不是认为我在用DMA+GPIO来传输?而不是DMA+SPI?DMA+GPIO可能么?我看手册上的DMA外设立有GPIO,但那它的传输请求是什么啊?系统怎么确定多久改变一次GPIO.类似SPI收到数就传输一次,ADC采了样就传输一次。GPIO何时传输一次?

使用特权

评论回复
30
香水城| | 2010-12-6 18:09 | 只看该作者
如果使用DMA向GPIO传输数据,则需要使用TIM定时地触发DMA。

你的要求不能使用DMA+SPI的方式,SPI每次传输8或16个位,虽然你能通过控制SPI的时钟频率控制这8(16)个位之间的时间间隔,但你不能控制每2次传输之间的间隔。

请考虑我说的使用TIM的PWM输出方案,与普通PWM输出的不同之处在于,你可能需要在每个周期都改变PWM的输出极性。

使用特权

评论回复
31
香水城| | 2010-12-6 18:11 | 只看该作者
本帖最后由 香水城 于 2010-12-6 18:13 编辑

你的编码输出实际上就是一串频率固定的方波(50:50的PWM),只不过每个周期的输出极性不同,这正好对应STM32的PWM1和PWM2模式。

前面我还没有想到这个PWM1和PWM2模式的问题,现在想明白了,原来这么简单,自我得意一下,:lol

使用特权

评论回复
32
z_no1| | 2010-12-7 08:39 | 只看该作者
这么说DMA是不能保证不丢数的啦?我的每个请求有可能不被处理?就算是我把这个DMA通道调到最高优先级别?那DMA的用处不就大减了,甚至没啥用了,ADC采样可能丢数,SPI、UART接收可能丢数,那这还有啥用啊?

使用特权

评论回复
33
z_no1| | 2010-12-7 08:47 | 只看该作者
至少应该是在保证能容忍多少个时钟周期延误的操作是不会丢失的。就像中断一样,中断太频繁就会丢失,但只要保证不超过某个频率就保证不会丢数。DMA实际就是一段并行硬件执行的程序,可以看作是和用户程序分时操作的另一个进程,要像香版的意思,DMA对任何频率的请求都有丢数的可能,那问题很大,后果很严重呢。

使用特权

评论回复
34
z_no1| | 2010-12-7 08:59 | 只看该作者
墙裂妖球香版找老外把具体的参数拿来,最高级别的优先级能保证请求被响应在多少个时钟周期之内。做GPIO是不行,做SPI,ADC等带一定缓冲的还是应该可以的。关键是最大延误到底是多少个时间周期!!!!!

使用特权

评论回复
35
香水城| | 2010-12-7 08:59 | 只看该作者
我并没有说使用DMA会丢数呀,也没有说不处理每个请求,不知道你是怎么得出这样结论的?

使用特权

评论回复
36
z_no1| | 2010-12-7 09:20 | 只看该作者
26楼"弥补了总线仲裁时间不易预估的不稳定因素,",我现在就想知道,总线仲裁的最坏情况下多久时间可以分配给优先级最高的DMA请求,这个时间太长的话,DMA这个请求还没处理,下一个请求又来了,这不就丢数了么?

使用特权

评论回复
37
McuPlayer| | 2010-12-7 09:39 | 只看该作者
DMA本身不会丢数据
楼主是系统设计的工作没做好,就开始干活了,磨刀不误砍柴工啊

做系统设计时,要考虑到DMA的buffer用完后更新需要时间
比如,可以用dual buffer来做,A buffer发送的时候,填写B buffer不会耽搁事,DMA完成触发中断,切换buffer
然后你要评估,DMA完成触发中断,相应,切换buffer需要多少个CLK,等等

使用特权

评论回复
38
香水城| | 2010-12-7 10:01 | 只看该作者
26楼"弥补了总线仲裁时间不易预估的不稳定因素,",我现在就想知道,总线仲裁的最坏情况下多久时间可以分配给优先级最高的DMA请求,这个时间太长的话,DMA这个请求还没处理,下一个请求又来了,这不就丢数了么? ...
z_no1 发表于 2010-12-7 09:20


总线仲裁时间不易预估DMA不能保证不丢数没有必然联系,你这根本是偷换概念,:Q

关于每个DMA周期的具体时间,ST早有一篇应用笔记详细地给出了计算方法,不必“墙裂妖球”,找来看看就好。下面贴图是核心部分:

STM32_DMA_Latency.GIF (38.01 KB )

STM32_DMA_Latency.GIF

AN2548 - Using the STM32F101xx and STM32F103xx DMA controller.pdf

141.81 KB

使用特权

评论回复
39
z_no1| | 2010-12-7 10:05 | 只看该作者
DMA一个数据块和DMA下一个数据块之间,用切换这个肯定考虑好了,现在的问题是我DMA一个20KB的数据块,这20KB的数据块通过SPI总线发出去,CLK是不是连续的。

使用特权

评论回复
40
z_no1| | 2010-12-7 10:18 | 只看该作者
知道了

使用特权

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

本版积分规则