2019-07-21 07:28发布
sweetstandard 发表于 2016-9-10 09:28 我也遇到了这样的问题,解决方法是:DMA工作在循环模式。具体如下: =================================== ...
最多设置5个标签!
这个帖子里重点讲解了为什么会数据错位,并且怎么处理。亲测有效!
要注意在初始化时将DMA_Cmd(DMA1_Channel1, ENABLE);放置到ADC_SoftwareStartConvCmd(ADC1, ENABLE);前面。
原因是:如果在初始化AD的时候DMA被触发了一次,但是此时并没有采样,但是DMA目的地址已经发生了自加,
当你采样第一路的时候,数据却填充到了第二路。
校准AD的时候会触发DMA导致通道错位,因此校准AD基准前不要启用DMA
我也遇到了这样的问题,解决方法是:DMA工作在循环模式。具体如下:
======================================
寄存器方式:
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{
。
。
。
//DMA_CHx->CCR|=0<<5; //非循环模式,这种模式下就错位。
DMA_CHx->CCR|=1<<5; //循环模式
。
。
。
}
=================================
库函数方式:
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx)
{
。
。
。
//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //正常缓存模式,这种模式下就错位。
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环模式。
。
。
。
}
================================
你这种修改方式不实用啊,应该还不是问题的本质吧。那要是在只能用正常模式下(不用循环模式),岂不是就一直错位下去啊?
一周热门 更多>