STM8 低功耗时钟管理

  第一次做低功耗设备,单片机 STM8s003 ,起初只设置了进入 Halt模式,IO配置是使用之前的状态。客户测试结果,9v的电池,10天电压损失比率为 13.5%。

  自己做了下测试,运行状态电流 -- 7.2mA,待机电流 1.6mA.

  首次改进,由于使用的是外部上拉,在进入 Halt模式前将单片机 IO全部配置为浮空输入状态,按键使用的 IO加上下降沿触发中。测试结果:运行状态电流 6.7mA;待机电流 133uA.

  第二次改进,将 12M的内部时钟 4分频,CPU时钟 4分频,外设时钟只保留两个定时器和一个看门狗;测试结果:运行状态电流 2.36mA;待机电流 127uA.

经理说还是太大,至少要降到两位数,继续吧。。。

拿着 STM8的 Datesheet翻低功耗,时钟这块,发现用 LSI作为系统时钟可以再次降低功耗,于是配置寄存器调试。

配了半天发现 CLK_SWR寄存器中的数据始终修改不了。百度查原因,又过了几个小时终于发现了问题的所在,需要配置选项字。

如下:

------------------------------------------- 我是分割线 -------------------------------------------

摘自:http://blog.sina.com.cn/s/blog_4a3946360100yuzl.html  

“选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和一个用来备份的互补格式(NOPTx)”

   要使用内部低速RC必须将LSI_EN置1,就是这个地方让我纠结了半天,然后用IAR将其置1,方法是:进入调试模式,在上面有个ST-LINK,点击,看到OPTION BYTE,左键点进去,右键单击上面的选项,就可更改了,然后全速运行,就写进去了

  

  STM8的时钟分为HSI,HSE,LSI,最常用的是HSI,STMS105S4内置的是16M的RC,叫fhsi。它可以分频输出为fhsidiv=fhsi/hsidiv,如果选择其为主时钟源,那么主时钟fmaster=fhsidiv。CPU时钟fcpu=fmaster/cpudiv。

可以通过外设时钟门控寄存器CLK_PCKENR1和CLK_PCKENR2选择是否与某个外设连接。

好了上个切换内部时钟的源代码,测试通过

void CLK_Init(void)
{
  //切换到内部LSI(!!!需要修改选项字节的LSI_EN为1)
  CLK_ICKR|=0x08;//开启内部低速RC震荡
  while(CLK_ICKR&0x10==0);//LSI准备就绪
  CLK_SWR=0xd2;
  while(CLK_SWCR&0x08==0); //等待目标时钟源就绪
  CLK_SWCR|=0x02;  
  //CPU分频设置
  CLK_CKDIVR=0;  //内部RC输出不分频,CPU亦分频
}

------------------------------------------- 我是分割线 -------------------------------------------

代码大差不差

1 CLK->ICKR |= 0x04;        // 快速唤醒
2 CLK->SWCR |= 0x02;    // 使能时钟切换
3 CLK->ICKR |= 0x08;     // 打开内部低速振荡器
4 while(!(CLK->ICKR & 0x10));    // 等待内部时钟稳定
5 CLK->SWR = 0xD2;                // 将 LSI设置为系统时钟
6 while(CLK->SWCR & 0x01);    // 等待时钟切换完成
7 CLK->CKDIV = 0x00; // 设置分频系数,不分频 
8 CLK->HSI &= ~0x01;    // 关闭 HSI

至此,运行状态电流:2.36mA;待机状态电流:130uA

还是降不下来,晕了,直接拆芯片,测试电路消耗电流,结果为 120uA左右,也就是说单片机消耗电流也就在 10uA左右,达到预期目标。

原文地址:https://www.cnblogs.com/Danhuise/p/3858398.html