我有和STM32f3发现板,我试图使用4个ADC通道。这是我的阅读功能:
int ADC_read(int channel)
{
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5);
ADC_StartConversion(ADC1);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET);
return ADC_GetConversionValue(ADC1);
}
一切顺利,直到突然程序卡在while循环中。有没有办法避免将ADC_FLAG_EOC置于循环中?或者只是让我的程序工作的其他方式?
答案 0 :(得分:0)
据我所知,根据您使用的主板版本,您必须使用ADC_SoftwareStartConvCmd
或ADC_StartConversion
。
所以也许你没有正确启动ADC转换,请试试这个:
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5);
#if defined(SERIES_STM32F10x)
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
#elif defined(SERIES_STM32F30x)
ADC_StartConversion(ADC1);
#else
ADC_SoftwareStartConv(ADC1);
#endif
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
另外,不要忘记将引脚模式设置为输入:pinMode(pin, INPUT_ANALOG);
最后,take a look at this post用户遇到类似问题并通过重新启用外部触发器来解决问题:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
答案 1 :(得分:0)
不需要在每次调用时运行RegularChannelConfig,它可能没有时间来完成配置,并在启动时挂起。 在你开始之前等一下。
查看示例
为什么在您可以让DMA为您运行ADC并且只在需要时从内存中访问值(这些)时,以这种方式使用ADC。
STM-Cube正确地为您生成了大部分代码。