关于STM32F030的ADC采样在while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)==RESET)死循环死等待的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/mrlixirong/article/details/102763721

前提:

1、单片机是STM32F030F4P6

2、软件平台有用过两个,一个是Keil uVision5、一个是CooCox(1.7.8版本)

3、采用的库是1.5版本的标注库(STM32F0xx_StdPeriph_Lib_V1.5.0)

调试中,怎么看下面的代码都觉得没问题,可是通过插入打印或者LED指示的调试,发现程序就卡死在

while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)==RESET)这一句。

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_InitTypeDef ADC_InitStuctrue;
	ADC_InitStuctrue.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStuctrue.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStuctrue.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
	ADC_InitStuctrue.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStuctrue.ADC_ScanDirection = ADC_ScanDirection_Upward;
	ADC_Init(ADC1, &ADC_InitStuctrue);

	ADC_ChannelConfig(ADC1,ADC_Channel_0,ADC_SampleTime_55_5Cycles);
	ADC_GetCalibrationFactor(ADC1);
	ADC_Cmd(ADC1,ENABLE);

	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)==RESET);
	ADC_StartOfConversion(ADC1);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
	voltage=1.0f*ADC_GetConversionValue(ADC1);

后面,就各种网上查找,发现有关STM32的ADC采样问题的文章不少,很快就被引导到while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET)这里死等待的问题,于是按照相关解决方法进行排查:

a)有说ADC_GetFlagStatus函数里面有定时器相关参数,我看了那个帖子是STM32F103相关的,所以和我的STM32F030F4P6不相关;另外,我用的1.5版本标准库,确认该函数里面没有和定时器相关的信息。

b)有说编译器设置-O0、-O1的,我的编译器默认设置是-O0的,设置为其他参数时,也还是不行。

c)有说调用通道设置、校准前先 ADC_Cmd(ADC1,DISABLE)的,也不行。

d)有说在通道设置之后、交转之后和ADC_Cmd(ADC1,ENABLE)之后加delay,也不行。

最终解决,问题在GPIO初始化上。

GPIO_InitStructure在配置ADC IO之前,我还配过用于配过其他IO输出,如下

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOF, &GPIO_InitStructure);

在写下这篇文章之前,我才试着重新定义一个GPIO_InitTypeDef,于是有了下面的代码:

	GPIO_InitTypeDef PORT_ADC;
	PORT_ADC.GPIO_Pin = GPIO_Pin_0;
	PORT_ADC.GPIO_Mode = GPIO_Mode_AN;
	PORT_ADC.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, &PORT_ADC);

就这样,问题解决了!!!

家里有娃,各种玩具需要电池,各种玩具被摔,不知是玩具坏掉还是电池坏掉,于是制作了这个小东西。感谢嘉立创PCB5元快板还包邮,其他器件加起来也没过10元吧,本来就这么简单的板子,想一天搞定的,结果,硬是被折腾了我整整一个星期(的业余时间)。为什么不买个万用表?——我有万用表,我就想做个板子,手痒!

猜你喜欢

转载自blog.csdn.net/mrlixirong/article/details/102763721
今日推荐