打印

发个图,求教最简单的AD例子

[复制链接]
4355|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
60岁老头|  楼主 | 2008-3-24 22:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   是否只要按合适的时间间隔,对ADON置1,就可完成AD?有何其他条件?
   向大家求教。
沙发
computer00| | 2008-3-25 00:23 | 只看该作者

没有了。通常是查询EOC,等待转换完成。

使用特权

评论回复
板凳
60岁老头|  楼主 | 2008-3-25 07:03 | 只看该作者

我也是这么想的,但常死在“查询EOC”上,可怕。

使用特权

评论回复
地板
60岁老头|  楼主 | 2008-3-25 12:33 | 只看该作者

不知为何,走一个单步,EOC就变为0了。

使用特权

评论回复
5
walnutcy| | 2008-3-25 12:47 | 只看该作者

你可以作一个查询超时,超时即当失败处理,

你可以作一个查询超时,超时即当失败处理,
稍后重来

使用特权

评论回复
6
60岁老头|  楼主 | 2008-3-25 13:04 | 只看该作者

奇怪的是有AD值,就是AD完成了,EOC却=0。

使用特权

评论回复
7
lut1lut| | 2008-3-25 14:16 | 只看该作者

手册上说:读ADC->DR就会把该位清零了阿

Bit 1 EOC: End of conversion
This bit is set by hardware at the end of a group channel conversion (regular or injected). It is
cleared by software or by reading the ADC_DR.
0: Conversion is not complete
1: Conversion complete

使用特权

评论回复
8
香水城| | 2008-3-25 14:22 | 只看该作者

楼主还是把你的程序贴出来看看吧,你是否在查询EOC=0前读过

如果在查询EOC=0之前曾经读过DR寄存器,则可能会清楚EOC状态位。

使用特权

评论回复
9
60岁老头|  楼主 | 2008-3-25 15:01 | 只看该作者

程序就是香主的“ST的网站上有一篇关于STM32低功耗..”中的

   STM32F10x_LowPower_ANLowPower_ANPart3WFE_Stop_Flash
我跟贴过。
   我是用MCBSTM32KEIL评估板试的。
摘录如下:
void ADC_Configuration(void)
{
  /* Enable ADC1 clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  /* Set the ADC Clock Divider */
  RCC_ADCCLKConfig(RCC_PCLK2_Div2); 

  /* Reset variables */
  RegularConvData = 0;

  /* ADC1 Init */
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 Regular Channel Config */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_1Cycles5);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  while(ADC_GetResetCalibrationStatus(ADC1));
  /* ADC1 calibaration start */
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));

  /* ADC1 regular Software Start Conv */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  /* Test EOC flag */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));------------A
  /* Read regular converted data and clear EOC Flag */
  RegularConvData = ADC_GetConversionValue(ADC1); 

  ADC_Cmd(ADC1, DISABLE);
}
始终停在A处。 

使用特权

评论回复
10
60岁老头|  楼主 | 2008-3-25 15:09 | 只看该作者

顺便把原跟贴重写。

 我已经头疼好久了。

   我用MCBSTM32KEIL评估板试的。
   STM32F10x_LowPower_ANLowPower_ANPart3WFE_Stop_Flash
始终停在:
   while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); 
百思不解!
   好象只要是“不连续 不扫描 非外部触发”就不出EOC。

   求助!

 我现在认为Part3中的3个例子可能有错,要不就是我的软件有错。

使用特权

评论回复
11
lut1lut| | 2008-3-25 15:55 | 只看该作者

re

我在EK-STM32和MCBSTM32两个板子上都试了。由于刚才提到的EOC会被读ADC-〉DR而清零,所以调试的时候不要打开ADC的register window,因为仿真器可能会去读ADC的各个寄存器来更新寄存器窗口。

我打开了ADC的寄存器窗口,那么不管单步走还是全速,都会停在lz说的地方。
不打开ADC的寄存器窗口,就没有问题,运行正常

使用特权

评论回复
12
60岁老头|  楼主 | 2008-3-25 16:07 | 只看该作者

谢谢。但奇怪,那是JTAG,不是一条路啊!遗憾。

使用特权

评论回复
13
香水城| | 2008-3-25 16:17 | 只看该作者

调试器的寄存器窗口是通过JTAG刷新显示数据

JTAG是通过内部总线读出相应的寄存器,然后显示到你的屏幕上。

你看到的不是一条路,但芯片内部却是相同的路径。如果真的不是一条路,那么这个芯片就要多出很多仅供调试的内部数据通路,势必造成芯片的面积增大、成本上升。

使用特权

评论回复
14
60岁老头|  楼主 | 2008-3-25 16:35 | 只看该作者

事情可能比较复杂,我没有打开ADC的register window

  但打开了memory 窗口。
  再说是“停留在A处,下不来”,不是“在断点处看不到EOC=1”。
  

使用特权

评论回复
15
60岁老头|  楼主 | 2008-3-25 16:42 | 只看该作者

按lut1lut的说法,关了memory 窗口,也死。

使用特权

评论回复
16
香水城| | 2008-3-25 16:45 | 只看该作者

如果memory窗口显示的区域涵盖了ADC的寄存器所在地址也会有

请先把所有的memory、register、watch窗口全部关上,再试试看。

另外,你说是“停留在A处,下不来”是如何判断的?单步?连续运行?还是设了调试断点?断点设在哪里?

使用特权

评论回复
17
60岁老头|  楼主 | 2008-3-25 17:06 | 只看该作者

所有的memory、register、watch窗口全部关上。

  仅1个断点在下一行。

使用特权

评论回复
18
香水城| | 2008-3-25 18:07 | 只看该作者

今天下班了,人都走了,明天我们争取把这个问题搞清楚

现象确实很奇怪。

使用特权

评论回复
19
lut1lut| | 2008-3-26 11:13 | 只看该作者

lz用的哪个版本的芯片?

Z版本的芯片,我这里试的,都好的。

使用特权

评论回复
20
60岁老头|  楼主 | 2008-3-26 11:37 | 只看该作者

A版本

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

158

帖子

0

粉丝