关于ADC——DMA采集数据错位

2019-07-21 07:28发布

在论坛上看到好多人都表示ADC——DMA采集数据回来后数据错位了。

刚才发现,我的代码如果在DMA使能了时钟后面加一个小延时的话,就会发生这样的情况。
然后我把那个小延时去掉后发现数据就正常了,正在纠结的人可以看下自己DMA初始化函数前面是不是有个小延时了。
为什么会这样呢?


PS:我要在DMA初始化函数前加个小延时是因为刚才看到原子哥说库函数某个版本的函数有个小bug,加了小延时可以消除。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
正点原子
1楼-- · 2019-07-21 12:09
回复【楼主位】2253367:
---------------------------------
没这么邪门吧.那个延时是要加的,我现在是加1ms,你的加多少??
2253367
2楼-- · 2019-07-21 13:20
 精彩回答 2  元偷偷看……
shihantu
3楼-- · 2019-07-21 17:43
先使能DMA,再使能ADC就没有问题.

错位的原因是ADC开启后,没有及时使能DMA,到DMA使能时ADC已经转换过若干个值,与设计产生偏差.
2253367
4楼-- · 2019-07-21 19:38
回复【4楼】shihantu:

---------------------------------
对的,确实先初始化DMA然后再初始化ADC就没问题了。
球球~电子
5楼-- · 2019-07-21 23:59
困扰我数日的问题。。。原来是  初始化顺序啊= =  头发都抓掉不少
xxcmax
6楼-- · 2019-07-22 03:26
刚刚解决了这个问题,解决之前也百度到这了,但是上面说的貌似都不能根本解决,注册个号说下我的办法吧
我是双adc-dma采集,发现少了adc1的第一个数据,看内存的时候是直接把数组名字复制到地址栏里,然后我直接输入内存地址往数组的前面又看了几个字节,发现adc1的第一个数跑到数组头再前面两个字节处了,然后又观察了一下发现其实就是个对齐问题,双adc是要用到adc1的dr的全部32位,所以dma需要4字节对齐,在dma目标数组的前面加上“__align(4)”,问题解决
上面几楼说的方法也能解决,我猜是改了代码,造成目标数组位置变动,正好变到了对齐的位置,不过也只是猜测,总之我上面说的算是一种解决办法

一周热门 更多>