zoukankan      html  css  js  c++  java
  • 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左右,达到预期目标。

  • 相关阅读:
    mysql general log使用介绍
    是否可以根据GTID 选出日志最新的实例
    python踩坑现场,看起来一样的两个字符串,却不相等
    sql case when的使用
    golang 匿名结构体成员,具名结构体成员,继承,组合
    golang go-sql-driver/mysql基本原理
    raft协议中的日志安全性
    go get 安装 go.etcd.io etcd clientv3 报错
    ZGC
    发现jdk9之后,AQS代码有啥变化了吗
  • 原文地址:https://www.cnblogs.com/Danhuise/p/3858398.html
Copyright © 2011-2022 走看看