第一次做低功耗设备,单片机 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左右,达到预期目标。