你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
安 发表于 2018-3-15 11:26 看配置差不多,值应该是多少,采集到的是多少。
查看全部评分
OHWIXP 发表于 2018-9-24 16:00 楼主程序里DMA传输数据宽度部分,应该是配置错了: DMA_InitStructure.DMA_PeripheralDataSize = D ...
AD转换结果为0x04ef, DMA传输后得到的结果为0x00ef, 高8位被丢掉了。
控制部分是这样做的,需要每100ms转换一次,并用DMA传输
ADC_DMACmd(ADC1,ENABLE); //开启ADC1 DMA传输
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束 大约56us
while(DMA_GetFlagStatus(DMA1_FLAG_TC1) != RESET)
{
DMA_ClearFlag(DMA1_FLAG_TC1); //清除通道1传输完成标志
break;
}
ADC_DMACmd(ADC1,DISABLE); //关闭ADC1 DMA传输
也可以仿真的情况下,看一下寄存器的值和DMA取到的值是不是一致。我使用很长时间DMA中断,发生的问题基本是因为自己配置错误导致。
评分
查看全部评分
楼主既然一次扫描8个通道4次,就不应该将这里设成禁止:
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
这样的话ADC只转换8个通道一次就结束,DMA不知道,它会硬要凑足32个数据,后面的数据必定对不上号
要么设成ENABLE,要么32改成8
还有字长应该设成:
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
评分
查看全部评分
楼主程序里DMA传输数据宽度部分,应该是配置错了:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位
——改为:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
非常感谢,我也犯了这个错误