历史上的今天
返回首页

历史上的今天

今天是:2024年09月26日(星期四)

正在发生

2021年09月26日 | while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)==RESET)死循环死等待的问题

2021-09-26 来源:eefocus

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


前提:


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);

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

推荐阅读

史海拾趣

Delphi Connection Systems公司的发展小趣事

Delphi Connection Systems公司自创立之初,就致力于在电子行业中的连接器技术上进行创新。公司投入大量研发资源,开发出一种新型的高性能连接器,这种连接器具有更小的体积、更高的可靠性和更低的传输损耗。这一创新成果迅速获得了市场的认可,为公司带来了大量的订单和合作机会。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER公司的历史可以追溯到1910年,由Alonzo G. Decker和Duncan S. Black在美国马里兰州巴尔的摩共同创立。两位创始人的初始投资来自于Black先生卖掉他的二手车所得的600美元,再加上1200美元的贷款。公司起初主要生产牛奶瓶装盖机、棉花采集机、糖果浸包机等工业用设备。然而,真正让BLACK&DECKER崭露头角的,是1916年他们发明的现代手枪钻原型。这一创新产品解决了当时德国电动工具笨重、难以操控的问题,为电动工具行业带来了革命性的变革。

Edcon Components Netherlands Cv公司的发展小趣事

随着全球环保意识的提高,Edcon Components Netherlands Cv积极响应绿色生产的号召。公司采用环保材料和工艺进行生产,减少废弃物排放和能源消耗。同时,公司还加强了员工的环保意识培训,鼓励员工积极参与环保活动。这些举措不仅有助于提升企业的社会责任感,也为公司的可持续发展奠定了坚实基础。

DELTA公司的发展小趣事

Delta公司始终将技术创新作为推动企业发展的核心动力。公司不断投入巨资进行技术研发和创新,积极引进先进技术和设备,培养高素质的研发人才。这些努力使Delta在电源管理、能源管理、智能绿生活等领域取得了多项技术突破和专利成果,不仅提升了公司的核心竞争力,还引领了整个行业的发展方向。

DILABS公司的发展小趣事

随着全球环保意识的提高,DILABS开始注重绿色生产。他们引入了先进的环保技术和设备,确保在生产过程中最大限度地减少废弃物和污染物的排放。同时,DILABS还积极推动电子产品的环保设计,帮助客户实现绿色采购和可持续发展。

Accetek公司的发展小趣事

随着电子技术的飞速发展,Accetek公司意识到只有不断创新才能在市场中立于不败之地。因此,公司加大了对技术研发的投入,建立了一支高素质的研发团队。经过无数次的试验和失败,团队终于取得了重大突破,成功开发出了一种新型的数控雕刻机,具有更高的精度和更稳定的性能。这一创新成果不仅为公司赢得了更多的客户和市场份额,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

无形的屏幕

哇,我的电脑屏幕隐形了,成透明的了,这...这...怎么可能?淡定淡定,这不是灵异事件,奥秘来自于墙纸...厌倦了常规的墙纸当屏幕背景,那就看一下这一组怪异墙纸,它们会让你的屏幕变无形。但是事实是,屏幕还在,只不过是视觉欺骗了我们的感觉。 ...…

查看全部问答>

请教一个简单的C51程序,

#include main() {         TMOD=0X10;         TH1=0XFE;         TL1=0X0C;         TR1=1;         ET1=1;       ...…

查看全部问答>

wince下调用软键盘的问题

在wince下调用软键盘,代码如下 void CRecorderDlg::OnBnClickedButton6() {         // TODO: Add your control notification handler code here         SipShowIM(SIPF_ON);  //Shows&nb ...…

查看全部问答>

在wince 下怎么能读取 一个像素 alpha 通道的值

我想把一个带 透明通道的bitmap作为前景贴到一个不带透明通道的背景bitmap上,试了几种方法 都不理想,包括 TransparentBlt(...),alphablend(...),还使用过maskdc 的方法,都不理想。 前两种方法把我的小的前景,拉伸到跟背景一样大;而且Transpa ...…

查看全部问答>

发个清华蓬远地取模软件

前几天取汉字模从网上下个软件,不太好,就因为取然的格式带H地,我要C语言数组地,以前用过清华蓬远的取模软件,我认为是最好地,今天翻出特发上来,大家共享,我也MARK,省得以后再找不到,呵呵…

查看全部问答>

一个晶振引发的问题

本来是51好板,就是CPU座松了,让同事搞一下变紧,拿回来突然不好用,仿真器上也不好用,本来屏幕可显开机画面,但怎么也搞不定,由于急有找了另一台机器总算把程序实验完,第二天对着这个坏板研究起来,首先是换51的40脚DIP座,小心得很,因为板上 ...…

查看全部问答>

菜农友情为STM32设计一种通用加密方法之原理

今天连续看了两篇关于加密方面的帖子,感觉自己应该友情奉献一回了~~~ 设想一种加密办法,大家看看可行吗? 关于STM32F器件电子签名以及加密问题-请指点 今日方知STM32的UID为96位即12个字节,以前知道STM32内嵌CRC32. 网上在线CRC演算工 ...…

查看全部问答>

基于Keil的LM3S811调试笔记

拿到开发板后就第一时间对LM3S811进行调试,图片已经有网友上传了我就不再上传,就说说自己调试碰到的问题一级解决方法! 1、由于我的电脑没有光驱,所以智能是手动安装仿真器的驱动,安装的过程中会出现对话框让你选择的文件,此时你只要双击那文 ...…

查看全部问答>

NOR市场晴转多云 spansion突破寻曙光

   如今,无论我们在车上、家里或是旅途中,都希望能够随时随地顺畅地浏览多媒体内容和信息。特别是在玩游戏时,我们更是贪求一个畅快、愉悦的美好体验。而这些体验的实现与提升,很大程度上取决于NOR内存产品的性能和密度。   &n ...…

查看全部问答>

困扰我好几天的问题

我做了一个简单的光电检测电路 运放用的是741,单电源供电+5v,当光敏二极管没接收光时,输出+2.4v,属于正常么?…

查看全部问答>