打印
[应用相关]

STM32的ADC部分的确需要注意很多

[复制链接]
32389|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
至于是不是BUG,现在没必要争论.但是至少需要ST修改文档了.
ADC与DMA合起来用有隐患!这问题,至少ST的文档中对ADC和DMA联合使用部分介绍的不足.
在压力测试中,DMA有可能出现所谓"错位"问题,例如将ad0,ad1,ad2规则转换时,可能发生丢失一次ad数据,导致数据错位.
经过测试,不仅和实验环境的电磁干扰有关.初步估计是DMA传输触发有问题或ADC的触发部分有问题.
实验单次规则转换的DMA传输会在关传输完成中断时再次初始化adc和dma时出现丢数据现象.(这里的再次初始化ADC,不是复位ADC或ADC低功耗模式)
至于什么原因,我不是芯片设计者,也只能猜.
也许是片上总线的问题,也许是DMA的原因,甚至有可能是CortexM3内核本身的问题.但可以肯定不是软件问题.
当然软件上可以解决该问题
一种解决方法是adc复位,或进入低功耗模式再启动,同时dma复位.不过这样做就降低了性能,但的确有效.
还会有种无厘头的办法是,直接不用DMA.
循环采样时DMA连续运行,如果中断,特别是其他嵌套中断发生频繁时,就会出现数据错位.这在总线低负载的小测试程序中看不出来,但复杂系统中就会出现.
这种情况也许新版本的芯片有所改善,但我手中的STM103FZET6中一直出现这种现象.
此外,虽说stm32在高电磁干扰下cortex内核工作抗干扰性能不错,但部分外设会出现问题,如计数器和IIC.当然也有可能DMA在强电磁干扰下触发不正常导致ADC数据丢失.

Cortex内核现在还不成熟就推向了市场,需要一段时间来完善,问题肯定存在.
沙发
香水城| | 2009-7-12 10:57 | 只看该作者

谢谢你的中肯意见

你是否能详细说明你的“压力测试”具体细节,这样我们可以重现你说的问题,找到具体的原因并加以改进。


另外,你说的另一种情况:循环采样时DMA连续运行,如果中断,特别是其他嵌套中断发生频繁时,就会出现数据错位.这在总线低负载的小测试程序中看不出来,但复杂系统中就会出现

一个合理的解释是:DMA的原理是总线挪用,通常是在指令执行的某个阶段点暂停指令的执行,CPU让出总线给DMA设备;而发生中断时,因为要保存断点,导致DMA的响应周期延后,如果你的ADC采样速度过快,在嵌套中断发生频繁时,如果DMA的优先级设定不好,理论上确实可能造成DAM错误。

所以请尝试把ADC通道的DMA优先级提高,并适当把某些中断优先级降低。要知道嵌套中断和DMA都是要抢占总线资源的。

使用特权

评论回复
板凳
liuxin518|  楼主 | 2009-7-12 12:04 | 只看该作者

的确有可能是内部总线丢失数据

实际运行中有可能多通道的单次规则转换dma中断一直进不去,例如
采样4通道,单次规则转换,dma计数设为4,但可能丢失第一次转换,导致dma计数一直停在1.

按照常见思路,都是在定时器中断中启动dma来进行ad采样,但显然ADC触发DMA时有问题,因为此时如果将ADC设备复位或进断电模式再退出,DMA传输将正常.

一般都是在一轮adc转换时丢第一次数据,而且现象随机,这里中断频繁但还不至于阻塞总线.当然,我的设计中也使用了多个dma通道,adc的dma方式出问题较多,总线轻载时也出同样的问题.

现象给人的感觉是似乎ADC第一次转换完成后,DMA还没有进行传输时,发生中断,或其他事件(如调试器单步)等,就会丢失第一次转换的触发信号.第二次转换完成后,DMA可以获得触发.即使总线再繁忙,dma访问adc的间隔不均匀,也不应该丢失触发信号.总线数据可以丢失,表现为数据错乱,但触发信号不应该丢失.
以上分析结果是做了不少测试得到的,由多人检测,应该不存在太多低级错误.

希望香主和ST联系,个人感觉是ADC和DMA的触发部分有些问题,可能DMA和ADC只有触发信号,没有握手信号或有握手问题.当然不了解adc和Dma细节所以这里只能猜了.
不过DMA的触发问题在很多芯片的早期版本常见,有的是仲裁时丢失,有的是数据通路有问题.cortexM的总线设计比较新颖,但也有可能有很多问题,也许问题可能在这里.

使用特权

评论回复
地板
liuxin518|  楼主 | 2009-7-12 12:27 | 只看该作者

压力测试

我们这类的压力测试包含软件和硬件的,本来不能公布的,不过大概说说也无所谓
软件的就不说了.
硬件主要是芯片功能和设计功能的测试,很多芯片都有这样那样的问题,这事本来应该由芯片厂家做的.不过我们这里主要是验证自己的功能设计和硬件都正常.
采取的方法有一项是 功能模块单独测试,即对一个设备的功能单独测试,在整个软件写完后在加入单独监视代码.频繁中断,其他dma频繁传送数据,频繁开关中断,与其他功能模块同时使用等,此时看功能模块的数据是否正常.属于半白盒测试.
首先不加电磁干扰,电源波动,正常了逐步加入干扰条件,此时仍然监视设备,即使是1/1000的可忽略的硬件错误都要记录下来.
问题是测试里就数据手册的模糊表述就够让人折腾的了,还没到高低温,静电测试.
测试中不少设备都有问题,当然对我们来说,只关心我们的功能设计,毕竟我们不是ST的测试单位.数据手册中的很多表述很糟糕,很多东西的功能和其他芯片不同,但手册中没写.本来算法和可靠设计是主要任务,硬件和驱动是别人的活,结果硬件部分总出问题,任务就落在我们头上了.

使用特权

评论回复
5
香水城| | 2009-7-12 13:06 | 只看该作者

谢谢,能再说说电磁干扰测试是什么样的干扰,干扰的强度

有没有量的概念?

使用特权

评论回复
6
liuxin518|  楼主 | 2009-7-12 22:58 | 只看该作者

压力测试的有些东西要到专业的实验室去

这个内容我还是单独发给你站内信吧

使用特权

评论回复
7
午夜霓虹| | 2009-7-13 08:36 | 只看该作者

我也遇到过 并且和北京上海的工程师交流过

我也遇到过,并且和北京上海的工程师交流过,但是后来编译器的版本提高了以后,没再出现类似的问题,以为是编译器的问题,希望大家仔细看看,并不一定是stm32造成的,或许你的软件没有问题。

使用特权

评论回复
8
香水城| | 2009-7-13 08:51 | 只看该作者

我们有你说的专业实验室和相应的设备

所以我需要了解你说的电磁干扰测试是什么样的干扰,干扰的强度是多少?这样我们可以有针对性地进行测试。

使用特权

评论回复
9
xiaoerge| | 2013-1-11 15:39 | 只看该作者
挖个坟

最近也遇到了类似的问题,9个ADC通道转换,约1m远的地方有个继电器,
AC220V控制的,与该电路板没有直接联系,只要继电器动作,DMA必然乱掉。
继电器不动作没有观察到错误。
定时器3触发ADC,DMA中断简单处理9个数据,再开启DMA。

改成开启DMA同时重新初始化ADC貌似好了,尚需仔细测试。

不知道这个问题是否有进一步的说法?

使用特权

评论回复
10
swustlx86| | 2013-2-22 13:44 | 只看该作者
学习了            

使用特权

评论回复
11
jifuele| | 2013-2-22 15:56 | 只看该作者
高手

使用特权

评论回复
12
紫辰晓风| | 2013-5-11 18:00 | 只看该作者
最近本人 也在做STM32 DA连续输出,让AD进行采集,检测线性度,结果,DA用的TLC5615,万用表测试输出都正常,结果STM32 的AD输出 出现周期性的 相同值(造成波形图水平),请问有人遇到过没啊?

DA-AD.png (68.69 KB )

AD采集DA输出

AD采集DA输出

使用特权

评论回复
13
cjhk| | 2013-5-12 13:32 | 只看该作者
学习学习   谢谢了   楼主   不错的帖子   需要好好消化一下   顶一个  谢谢   

使用特权

评论回复
14
cnc2020| | 2013-5-20 23:28 | 只看该作者
学习了   

使用特权

评论回复
15
busdriver| | 2013-5-21 11:39 | 只看该作者
牛人啊

使用特权

评论回复
16
outstanding| | 2013-5-21 12:48 | 只看该作者
我遇到过ADC采集的时候,第一次数据不准。

使用特权

评论回复
17
ranqingfa| | 2013-9-5 22:51 | 只看该作者
这里大家讨论的都比较深啊,都是大牛

使用特权

评论回复
18
ticomi| | 2013-9-6 08:19 | 只看该作者
香水城 发表于 2009-7-12 10:57
你是否能详细说明你的“压力测试”具体细节,这样我们可以重现你说的问题,找到具体的原因并加以改进。另外 ...

是这样的,我的也出现这个问题,修改优先级后问题就解决了,后来我又调整了代码和优先级等!

使用特权

评论回复
19
outstanding| | 2013-9-6 09:08 | 只看该作者

使用特权

评论回复
20
cool_coder| | 2013-11-25 17:24 | 只看该作者
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

57

帖子

0

粉丝