历史上的今天
今天是: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);
就这样,问题解决了!!!
史海拾趣
|
在wince下调用软键盘,代码如下 void CRecorderDlg::OnBnClickedButton6() { // TODO: Add your control notification handler code here SipShowIM(SIPF_ON); //Shows&nb ...… 查看全部问答> |
|
我想把一个带 透明通道的bitmap作为前景贴到一个不带透明通道的背景bitmap上,试了几种方法 都不理想,包括 TransparentBlt(...),alphablend(...),还使用过maskdc 的方法,都不理想。 前两种方法把我的小的前景,拉伸到跟背景一样大;而且Transpa ...… 查看全部问答> |
|
前几天取汉字模从网上下个软件,不太好,就因为取然的格式带H地,我要C语言数组地,以前用过清华蓬远的取模软件,我认为是最好地,今天翻出特发上来,大家共享,我也MARK,省得以后再找不到,呵呵… 查看全部问答> |
|
今天连续看了两篇关于加密方面的帖子,感觉自己应该友情奉献一回了~~~ 设想一种加密办法,大家看看可行吗? 关于STM32F器件电子签名以及加密问题-请指点 今日方知STM32的UID为96位即12个字节,以前知道STM32内嵌CRC32. 网上在线CRC演算工 ...… 查看全部问答> |
|
拿到开发板后就第一时间对LM3S811进行调试,图片已经有网友上传了我就不再上传,就说说自己调试碰到的问题一级解决方法! 1、由于我的电脑没有光驱,所以智能是手动安装仿真器的驱动,安装的过程中会出现对话框让你选择的文件,此时你只要双击那文 ...… 查看全部问答> |
|
如今,无论我们在车上、家里或是旅途中,都希望能够随时随地顺畅地浏览多媒体内容和信息。特别是在玩游戏时,我们更是贪求一个畅快、愉悦的美好体验。而这些体验的实现与提升,很大程度上取决于NOR内存产品的性能和密度。 &n ...… 查看全部问答> |




