分享

STM8L052低功耗设置【转】

 astro蛋蛋 2017-05-24
转载:http://blog.163.com/zhaojun_xf/blog/static/3005058020172983422329/

  最近一个项目用电池供电,待机电流需要低于50uA,刚开始使用STM32F103做的,发现功耗无法达到要求,现在改用STM8L052来做这个项目。对于STM8L052来说,在低功耗方便还是比较成功的,很多人说比MSP430更低。本人也是第一次使用这款芯片,在实现低功耗方便走了不少弯路,现在把其步骤和注意事项记录下来,以便大家借鉴。
        功耗的高低是软件和硬件的组合实现的。硬件的设计不好,软件如何更改都是无法实现的,同理,硬件设计得再好,如果软件不对的话,也是不行的。必须针对不同的硬件,用不同的软件代码来实现。

硬件检测步骤:
     为了知道每部分硬件的实际功耗问题,拿到PCB后,不要急于焊接好所有的器件,这样无法知道每部分的功耗问题。
      
     1. 只焊接LDO部分,了解自己选择的电源芯片,本身会消耗多少功耗。
        例如,HT7533[500mA]的静态电流应该是8uA,HT7233[100mA]的静态电流是2uA;由此看出,根据项目的实际消耗功率选择一款合适的LDO是非常有必要的。

      2. 焊接CPU及单片机的最小系统。
         单片机一般来说都有多种低功耗模式,我们可以查看芯片手册,知道每一种模式的具体功耗,并选择一种适合项目的功耗模式。
        例如,STM8L052有5种低功耗模式,即Wait[WFE or WFI]、Low power run,Low power wait,Active-halt,Halt,每种模式的功耗是不同的:Wait[WFE or WFI]的电流是55uA,Low Power Run的电流是5.9uA,Low power wait的电流是3uA,Active-halt的电流是3uA,Halt的功耗是400nA。我们必须要保证硬件能够达到或者接近这样的功耗,才能进入下一步。

测试程序如下:

    // 所有端口输出开漏,低电平
    GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOE, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOF, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);
    GPIO_Init(GPIOG, GPIO_Pin_All, GPIO_Mode_Out_OD_Low_Slow);

    halt(); // 进入低功耗

     3. 有上拉电阻的电路
       很多电路都需要加入外部上拉,例如,I2C总线等。这样的电路必须外部添加1K~10K的外部上拉电阻,对于这样的电路,初始化端口应该设置为GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_High_Slow),即输出推挽,高电平。对于这样的电路,外部已经上拉,所以,输出高电平,基本是不会消耗电流的。
       这样的设计适合I2C的EEPROM和RTC芯片等电路,由于本身功耗并不高,所以,初始化后即为这样的设置,进入低功耗之前也不需要改变其设置。
STM8L052低功耗设置【原创】 - 我心永恒 - ARM嵌入式研发
 
       4. MOS管控制电路
        MOS控制电路,低电平有效,如下面的电路:
STM8L052低功耗设置【原创】 - 我心永恒 - ARM嵌入式研发
     对于这样的电路,初始化时应该设置为GPIO_Init(NVC_PWR_PORT, NVC_PWR_PIN, GPIO_Mode_Out_PP_High_Slow),在控制时,电流还是比较大的,大概有40uA。显然如果什么都不处理就进入低功耗,电流是无法达到我们的要求,所以,需要在进入低功耗之前改变其设置,防止漏电流的产生,GPIO_Init(NVC_PWR_PORT, NVC_PWR_PIN, GPIO_Mode_Out_OD_HiZ_Slow)即设置为高阻状态。


      5. 外部中断
      很多时候,我们需要外部中断来唤醒CPU,所有,我们需要设置中断模式,一般来说,需要让端口处于低电平或者高电平,对于空闲时为高电平的,我们需要在外面添加上拉电阻,并设置端口为   

    GPIO_Init(MPR_IRQ_PORT, MPR_IRQ_PIN, GPIO_Mode_In_PU_IT);  // 上拉输入,有中断
    EXTI_SetPinSensitivity(NVC_IRQ_INT, EXTI_Trigger_Falling);              // 下降沿触发中断
  
    对于这样的电路,实际上并不需要其他处理,本身这样的设置电流就非常少。

       总结:在测试某一模块的功耗时,一定要循环运行while(halt();),或者通过仿真看运行halt函数后是否真的睡眠,否则可能会因为其他模块的唤醒导致测试模块功耗与实际功耗不一致的问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多