关于STM32F030的ADC采样在while(ADC

发布时间:2024-11-21 04:58

英雄联盟: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的智能家庭健康系统

随便看看