打印
[STM8]

STM8L152 ADC 不能关停,为什么?

[复制链接]
1310|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liyucai|  楼主 | 2014-12-24 17:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教版主,我用STM8L152做一个低功耗的东西。在外部中断到来时调用下面的函数,打开ADC采集电池电压,采集后关停ADC。
功能实现了,但发现调用退出后ADC没有关停。在线调试发现 ADC的寄存器 CR1 最低位(ADON)是1。本来应该是0的。不知道为什么。
麻烦版主指点。
unsigned char AdcGetData(void)
{
       unsigned char tempdata;
       CLK->PCKENR2 |= 0x01;  // clock set on
  
       ADC1->CR1 &= (uint8_t)~(ADC_CR1_CONT | ADC_CR1_RES);  //clear CR1 register
       ADC1->CR1 |= (uint8_t)((uint8_t)ADC_ConversionMode_Single | (uint8_t)ADC_Resolution_8Bit);
      
       ADC1->CR2 &= (uint8_t)~(ADC_CR2_PRESC);  //clear CR2 register
       ADC1->CR2 |= (uint8_t) ADC_Prescaler_2;
       ADC1->CR2 &= (uint8_t)~ADC_CR2_SMPT1;
       ADC1->CR2 |= (uint8_t)ADC_SamplingTime_192Cycles;
  
       ADC1->CR1 |= ADC_CR1_ADON;   // ADC set on
       Wait(31);
       ADC1->SQR1 = 0x80;         // no DMA
       ADC1->SQR3 = 0x04;         // use channnel 10
       ADC1->TRIGR3 = 0x04;
       Wait(37);
       ADC1->CR1 |= ADC_CR1_START;
       while( RESET == (ADC1->SR & ADC_FLAG_EOC) )
           ;
       tempdata = (ADC1->DRL);
      
       CLK->PCKENR2 &=  ~0x01; // clock set off
       ADC1->TRIGR3 = 0x04;
       //ADC1->SQR[3] &= ~0x04;
        
       ADC1->SR = 0x00;
       ADC1->CR1 = 0x40;  // ADC set off
       Wait(41);
       return tempdata;
}
沙发
grant_jx| | 2014-12-24 17:25 | 只看该作者
时钟一关,啥都停了

使用特权

评论回复
板凳
liyucai|  楼主 | 2014-12-24 17:32 | 只看该作者
程序里已经关了时钟了,但实测电流,发现ADC没有关。再在线调试,发现 ADON 位还是 1。
不知道什么原因。

使用特权

评论回复
地板
mmuuss586| | 2014-12-24 18:27 | 只看该作者
liyucai 发表于 2014-12-24 17:32
程序里已经关了时钟了,但实测电流,发现ADC没有关。再在线调试,发现 ADON 位还是 1。
不知道什么原因。 ...

可能是IO泄露了吧;
有没有测试电流差多少?

使用特权

评论回复
5
liyucai|  楼主 | 2014-12-25 08:56 | 只看该作者
不调用上面的函数,系统耗电2.4mA,调用后该函数后系统耗电3.5mA。相差约1.1mA。
而且在线调试发现,ADC->CR1 中的 ADON 位没有回到0。 很奇怪。

使用特权

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

本版积分规则

3

主题

13

帖子

0

粉丝