关于STM32F030的ADC采样在while(ADC
英雄联盟:ADC英雄对线禁忌 #生活常识# #游戏攻略#
前提:
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元吧,本来就这么简单的板子,想一天搞定的,结果,硬是被折腾了我整整一个星期(的业余时间)。为什么不买个万用表?——我有万用表,我就想做个板子,手痒!
网址:关于STM32F030的ADC采样在while(ADC https://www.yuejiaxmz.com/news/view/168028
相关内容
STM32项目设计:基于stm32的智能家居系统设计使用PIC单片机开发的简易数字电压表
stm32项目(8)——基于stm32的智能家居设计
【特纳斯电子】基于单片机的语音控制灯系统设计
深度解析:STM32对接米家平台,打造WiFi智能插座(ESP8266、电流检测)
探索舒适生活,飞利浦空调为用户交出满意答案
基于STM32开发的智能语音助手系统
一种基于STM32的智能家居控制系统
多传感器融合的人体健康监测系统设计与实现
基于ESP32的智能家庭健康系统