OpenEdv-开源电子网

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

求教原子哥,ADC转换调试时发现停在while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));不出去了

[复制链接]

8

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2013-11-7
在线时间
23 小时
发表于 2013-11-7 12:44:13 | 显示全部楼层 |阅读模式

这是程序,您看下什么原因

/**********************************************************
** 函数名: ADC_Configuration
** 功能描述: 时钟ADC初始化
** 输入参数: 无
** 输出参数: 无
***********************************************************/
void ADC_Configuration(void)
{
 ADC_InitTypeDef ADC_InitStructure;
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);            //配置时钟(12MHz),在RCC里面还应配置APB2=AHB时钟72MHz
 ADC_DeInit(ADC1);
 
 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC1和ADC2工作在独立模式
 ADC_InitStructure.ADC_ScanConvMode = ENABLE;      //开启通道扫描模式,由于是多个通道采集
 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   //注意不要使用持续转换模式,否则只要触发一次,后续的转换就会永不停歇(除非CONT清0)
                             //这样第一次以后的ADC,就不是由TIM2_CC2来触发了
 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//配置内部为触发源
 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //转换的数据为右对齐
 ADC_InitStructure.ADC_NbrOfChannel = 2;         //实验开启的转换通道
 ADC_Init(ADC1, &ADC_InitStructure);
  
 //ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_13Cycles5);   //ADC1通道11转换顺序为1,采样时间为13.5个周期
 //ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_13Cycles5);   //ADC1通道12转换顺序为2,采样时间为13.5个周期
 
 ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
 ADC_Cmd(ADC1,ENABLE);
 //ADC_SoftwareStartConvCmd(ADC1, ENABLE);                     //启动软件采集模式
 
 //ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);                     //使能转换完成中断
 
 ADC_ResetCalibration(ADC1);
 while(ADC_GetResetCalibrationStatus(ADC1));
 ADC_StartCalibration(ADC1);                               //Start Calibration register
 while(ADC_GetCalibrationStatus(ADC1));                         //waiting for finishing the calibration 
 //ADC_ExternalTrigConvCmd(ADC1, ENABLE);           //设置外部触发模式使能(这个“外部“其实仅仅是相对于ADC模块的外部,实际上还是在STM32内部)

}

/**********************************************************
** 函数名: uint16_t GET_ADC(uint8_t ch)
** 功能描述: 获得通道ch的adc转换值
** 输入参数: ch
** 输出参数: u16 adc
***********************************************************/
uint16_t GET_ADC(uint8_t ch)
{
 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_13Cycles5 ); //ADC1,ADC通道ch,采样时间为13.5周期         
 
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);  //使能指定的ADC1的软件转换启动功能 
 
 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束 一只在这不动

 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-7 14:17:10 | 显示全部楼层
回复【楼主位】北京:
---------------------------------
没看到楼主的GPIO初始化,是不是没有设置GPIO为模拟输入模式啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

8

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2013-11-7
在线时间
23 小时
 楼主| 发表于 2013-11-7 16:42:56 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
这个倒是设置了,并且没有问题,后来发现我的TIM初始化后直接进中断,adc居然没初始。。。但是新的问题又有了,就是ADC转换得不到值,正在继续debug
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-9-21
在线时间
0 小时
发表于 2014-3-3 11:50:18 | 显示全部楼层
我有一次用K60程序卡死是因为 使用的端口只能硬件触发。不过我设置成了软件触发了。。蛋疼、。
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-4-20
在线时间
4 小时
发表于 2014-3-21 14:48:05 | 显示全部楼层
回复【3楼】北京:
---------------------------------
您好,我也遇到了这个问题,请问您是怎么解决的呢?
回复 支持 反对

使用道具 举报

8

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
198
金钱
198
注册时间
2013-11-7
在线时间
23 小时
 楼主| 发表于 2014-4-11 22:59:08 | 显示全部楼层
回复【5楼】xzp114:
---------------------------------
后来我采取的dma传递方式。。。。。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-7-25
在线时间
4 小时
发表于 2019-8-3 10:42:48 | 显示全部楼层
看看是不是主函数里面没有初始化Adc_Init();
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-1-16
在线时间
24 小时
发表于 2019-11-16 11:11:21 | 显示全部楼层
楼主怎么解决这个问题啊,我也碰到这个问题
回复 支持 反对

使用道具 举报

21

主题

131

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2019-5-12
在线时间
168 小时
发表于 2020-2-25 15:05:26 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);

是不是少了这个?我今天也是碰到这个问题,RCC 的GPIO和ADC配置要用"|"写在一起,不然断点也会卡在while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束 一只在这不动     那里死等
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-8-21
在线时间
11 小时
发表于 2020-10-2 10:50:37 | 显示全部楼层
北京 发表于 2013-11-7 16:42
回复【2楼】Badu_Space:
---------------------------------
这个倒是设置了,并且没有问题,后来发现我的T ...

可能是你把定时器初始化放在了AD初始化的前面,然后进入中断服务函数时调用了ADC_Get,然后因为还没初始化状态寄存器始终卡在0,可以试着改一下初始化的顺序
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-10-2
在线时间
0 小时
发表于 2020-10-2 13:55:23 来自手机 | 显示全部楼层
while后的封号去掉
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 03:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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