至于是不是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内核现在还不成熟就推向了市场,需要一段时间来完善,问题肯定存在. |