OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13398|回复: 11

奇怪的TIM2和ADC_GetFlagStatus,求助!

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-12
在线时间
2 小时
发表于 2015-7-12 20:55:58 | 显示全部楼层 |阅读模式
5金钱
最近做一个项目,开始是基于STM32F103RC,一切正常,后来移植到STM32F103RB,出现了两个奇怪的问题,百思不得其解。
疑问1:
移植后,TIM3和TIM4正常,但TIM2中断函数每次都会执行两次,代码几乎都是一样的,不知道为啥。猜测如果加上if(TIM_GetITStatus(TIM2,TIM_IT_Update!=RESET))后可能会解决问题,实在不行可以弃用TIM2,反正TIM3的时间绰绰有余。但就是不明白代码几乎都是一样的,就是STM32F103RB的TIM2不行。
疑问2:
为了理解简单,ADC我就直接基于软件触发,在STM32F103RC一切正常,但移植到STM32F103RB后发现while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)总是死循环,当然采用DMA的方式估计可以解决问题,但就是不明白,同样的代码,为啥STM32F103RC一切正常,移植到STM32F103RB就不行了。

附件包含了STM32的原理图和代码,希望能指点一二。

AD9959_Control_SCH_V2.pdf

30.19 KB, 下载次数: 1257

STM32F103(20150710 1544).rar

250.24 KB, 下载次数: 1281

最佳答案

查看完整内容[请看2#楼]

今天试了下,对于TIM2,加上if(TIM_GetITStatus(TIM2,TIM_IT_Update!=RESET))可以解决问题;对于ADC,采用delay()替代while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)可以解决问题。但为啥移植后就不行了,疑问还是没有解决,期待中。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2015-7-12
在线时间
2 小时
 楼主| 发表于 2015-7-12 20:55:59 | 显示全部楼层
今天试了下,对于TIM2,加上if(TIM_GetITStatus(TIM2,TIM_IT_Update!=RESET))可以解决问题;对于ADC,采用delay()替代while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)可以解决问题。但为啥移植后就不行了,疑问还是没有解决,期待中。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-12 23:25:38 | 显示全部楼层
帮顶....
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-8-11
在线时间
0 小时
发表于 2015-8-23 22:16:35 | 显示全部楼层
表示今天也遇到了同样的问题,用Delay 代替 while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);就好了......
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2014-11-17
在线时间
0 小时
发表于 2015-9-28 16:50:52 | 显示全部楼层
遇到同样的问题,对于ADC,采用delay()替代while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET)解决了问题(谢谢2楼),但想知道问什么会出现这个问题,求大神指教
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2015-4-3
在线时间
8 小时
发表于 2016-3-8 16:04:37 | 显示全部楼层
请问找到原因没,期待,答案
感谢这个平台,感谢大家的阅览!
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
发表于 2017-9-20 09:20:27 | 显示全部楼层
我也遇到这个问题了,不过很快解决了,在初始化ADC的时候把ADC失能,即DISABLE ,然后在获得ADC值得函数里面在ENABLE
/********************************************************
oˉêyÃû3Æ£oADC_Init3õê¼»ˉoˉêy
oˉêy1|Äü£o//ÕaàïÎòÃǽöòÔ1æÔòí¨μàÎaày
                                        //ÎòÃÇĬèϽ«¿aÆôí¨μà0~3       
·μ »Ø Öμ£o
*********************************************************/
void  Adc_Init(void)
{        
        GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStuctrue;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1        , ENABLE );          //ê1ÄüADC1í¨μàê±Öó
//        RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
        //PA0 ×÷ÎaÄ£Äaí¨μàêäèëòy½Å                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;                //Ä£Äaêäèëòy½Å
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //¸′λADC1,½«íaéè ADC1 μÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
                //ADC ÅäÖà 
        ADC_InitStuctrue.ADC_Resolution=ADC_Resolution_12b;//12λ¾«¶è
        ADC_InitStuctrue.ADC_ContinuousConvMode=DISABLE;//μ¥′ÎADC  
        ADC_InitStuctrue.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;  
        ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right;//êy¾Y¶ÔÆë
        ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward;//êy¾Y¸2¸Ç  
        ADC_Init(ADC1,&ADC_InitStuctrue);
  
        ADC_Cmd(ADC1, DISABLE);        //
}       
/******************************************
//»ñμÃADCÖμ
//ch:í¨μàÖμ 0~3
//ÅäÖÃADC2éÑùμÄí¨μàoí2éÑùμÄê±¼ä
//PA0¶Ôó|ADC2éÑùí¨μà0
//×¢òa2éÑùμÄêy¾YêÇ·ñ×¼è·óë2éÑùê±¼äóD1ØÏμ
*******************************************/
u16 Get_Adc(u8 ch)   
{
  ADC_ChannelConfig(ADC1,ch,ADC_SampleTime_1_5Cycles);
        ADC_GetCalibrationFactor(ADC1);  //D£×¼
        ADC_Cmd(ADC1,ENABLE); //ê1Äü
        while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY)==RESET) ;//μè′yADC×¼±¸

        ADC_StartOfConversion(ADC1);  //èí¼tÆô¶ˉADC×a»»

  while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) ;  //μè′yADCíê3é

        return ADC_GetConversionValue(ADC1);        //·μ»Ø×î½üò»′ÎADC11æÔò×éμÄ×a»»½á1û
}
/******************************************
oˉêyÃû3Æ£oGet_Adc_Average
oˉêy1|Äü£o»ñμÃadc2é¼ˉÖμ
èë¿ú2Îêy£och, í¨μà Times £¬2é¼ˉ′Îêy
·μ »Ø Öμ£o2é¼ˉ′ÎêyÄúμÄÆ½¾ù½á1û
*******************************************/
u16 Get_Adc_Average(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}          
回复

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-9-2 19:12:47 | 显示全部楼层
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY)==RESET) ;/
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) ;  
这两句写错了,复位校准如果是0,表示校准寄存器已经初始化,1表示初始化中
ad校准 0校准完成,1开始校准 TIM截图20180902191202.png
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-5-28
在线时间
6 小时
发表于 2019-12-17 16:42:46 | 显示全部楼层
初始化有问题,我遇到后找到的原因是[img][/img],
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-5-28
在线时间
6 小时
发表于 2019-12-17 16:45:06 | 显示全部楼层
C:\Users\zzl\Desktop\姜林发的\1576572065(1)
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-5-28
在线时间
6 小时
发表于 2019-12-17 16:46:44 | 显示全部楼层
//        RCC->APB2RSTR|=1<<8;           //ADCs复位(注意,所有ADC都会被复位.)
//        RCC->APB2RSTR&=~(1<<8);        //复位结束         
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-9-5
在线时间
16 小时
发表于 2020-1-11 15:50:24 | 显示全部楼层
15353920254 发表于 2018-9-2 19:12
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_ADRDY)==RESET) ;/
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)= ...

没写错,ADRDY  0:ADC未准备好  1:ADC已准备好
             EOC       0:通道转换未结束     1:通道转换结束

我现在也是遇到则合格问题,卡在while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);了,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 00:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表