超低功耗研发-STM32L151C8T6芯片(五)低功耗设计总结

超低功耗研发-STM32L151C8T6芯片(一)时钟系统概述

超低功耗研发-STM32L151C8T6芯片(二)低功耗模式

超低功耗研发-STM32L151C8T6芯片(三)RTC自动唤醒机制

超低功耗研发-STM32L151C8T6芯片(四)串口接收唤醒机制、注意事项、C代码

目录

一、硬件设计

1、DC-DC电源部分

2、CPU供电

3、开关控制电路

4、外围芯片供电控制

5、外围模组供电控制

6、电阻电容的选择。

7、IO口的分配策略

8、焊接及静电

二、软件设计

         1、不用的IO口处理

2、CPU 的是时钟频率及内核电压

3、输出 的IO口

4、 输入 IO 口

5、外设

6、唤醒后动作

   三、调试


    通过前面的讲解,基本上对于STM32L系列低功耗原理有了一些的认知,单纯的讲CPU的低功耗是没有太大的意义的,
毕竟我们的实际工程项目不可能是一个单独的核心板,是必须要添加一些外围功能的,下面我们就从硬件、软件设计上做一些 总结。

一、硬件设计

    硬件设计的总则是选用低功耗的设计方案,器件能少绝对不对,多一个器件,就多一份消耗,我们具体来分析,低功耗硬件设计方案:

1、DC-DC电源部分


        (1)选用低压降、超低功耗DC-DC芯片:由于低功耗设备往往采用电池供电,一些锂电池随着电量的降低,输出电压也会降低,所以我们的DC-DC芯片要保证低压降,至少要能做到0.1V的压降下,仍能正常工作。
        (2)DC-DC静态功耗要足够小,因为在低功耗设计中,所有的器件本身也是要耗电的,尤其是DC-DC器件,耗电更多,所以尽可能的选用超低功耗LDO,当然了还要考虑LDO的最大输出电流,我使用的一款新品是上海贝岭的BL8064系列,静态功耗手册上说只有1uA,实测确实也不错。

2、CPU供电

     超低功耗CPU的内核电压一般都是可配置的,比如说STM32L系列的,CPU电压就可以配置为1.2/1.5/1.8V,这个根据自己项目的情况来选择,因为电压与工作频率是有关系的,正常情况下,1.5V是够用的。
         

3、开关控制电路


        如果我们的外围中,有开关控制需求,比如ADC电压 采集、信号通断等,那么优先考虑 CPU低功耗时,IO口引脚默认为低电平。这样的话,本身GPIO为输出配置,输出低电平肯定要比输出高电平要保险一些(功耗),比如采用三极管实现通断,那么最好使用NPN的管子实现,因为NPN的管子,控制引脚为低电平,三极管不导通,这部分的电路相当于全部断掉,功耗比较小。


4、外围芯片供电控制


        对于一些的传感器,比如温度传感器芯片,如果这个传感器是超低功耗还好,但是多数情况下,传感器的功耗都是有的,即便是不测量的情况下,所以最保险的方式就是控制传感器的电源,这里面要特别注意,要控制整个传感器电源的源头,包括信号线上拉的电源,所以,还是考虑使用P沟道的mos管,mos管的S极接电源,D极给传感器电源和信号线上拉电阻供电,这样我们就能够通过IO口控制G极,实现整个传感器的完全断电了。

 5、外围模组供电控制


    (1)模组电源尽量不要使用LDO,多数超低功耗设备都是采用标准锂电池,所以选用的模组的工作电源要尽可能的与电池电压一致,而且需要宽范围,如果不一致,就要使用LDO,多使用LDO就涉及到产品的成本和整体的功耗增加。    

    (2)如果方案中涉及到通信模组,比如说NB-Iot模组、LoRa模组、蓝牙模组等,模组和外围芯片还不太一样,模组是一个特别大的耗电器件,这个耗电不仅仅在于发送数据时,还在于发送数据前的连接过程也是很费电的,所以如果想要采用直接断电的方式就要好好的衡量一下,是否得不偿失,比如说NB-Iot模组,每次的数据发送,都要经过很漫长的连接过程,举例,可能整个数据发送过程是50秒,那么连接过程可能就要48秒,因为一旦连接成功后,发送数据就很快了,所以NB-Iot模组都有一个叫做PSM模式的东西,这个时候,我们就要采用它本身的PSM模式了,而不是直接断电,因为NB-Iot的PSM模式普遍功耗都特别低,小于10uA。
      (3)另外由于模组需要一直带电运行,如果我们添加了mos管进行备用控制,mos管的控制电路本身也有功耗,这部分的功耗也是需要考虑的,所以,可能比较合适方案是,将电池的输出电压直接给模组供电,模组的外围接口比如reset、唤醒引脚等都接入到CPU,这样就能最大可能的保证模组的稳定。

6、电阻电容的选择。

    这个涉及到一些细节问题,这里就不一一描述了,总而言之就是在满足功能的需求的情况下,电阻和电容都要少,而且电阻阻值不要太小,这有几方面原因,一是太小,相对费电,虽然在低功耗状态下,电阻大小不会影响费电,但是在正常工作情况下,电阻小,电流就大,整体的电流大了后,就会拉低电池的电压,所以需要采用合适的,稍微大点的电阻。电容呢,是要按需用,因为电容本身是储能的,也有漏电流,所以用的多了,也是会引起耗电的。

7、IO口的分配策略


        IO口的分配不能只从布线方便上考虑,还要结合软件设计,比如说CPU进入低功耗设计之前,需要关闭一些外围器件,一些外围器件的关闭是需要XXX_DeInit操作的,比如说I2C模拟接口,关闭I2C模拟接口,最方便的就是先XXX_DeInit,这个函数会对整个port口进行时钟使能和关闭,所以好的设计,应该是将功能分块,比如所有的控制IO口都适用PortA,所有的I2C模拟接口都适用PortB,中间不要随意穿插。这样对于软件工程师来讲,写代码的时候就相对容易些。

8、焊接及静电

     焊接温度和静电有可能会引起莫名其妙的功耗增加,这个时候是很抓狂的,尽可能的低温(280度以下)焊接,然后尽量减小静电的干扰,比如喷三防漆,放在无静电干扰的地方(橡胶垫)。

二、软件设计


      对于CPU中标准的各种低功耗模式,这里就不用赘述了,因为是CPU厂家提供的,我们在软件设计的时候,出现各种奇怪的功耗增加的原因,多数是因为我们队外围功能控制的处理不当引起的,作为程序设计人员,我们一定要非常清楚CPU中所有外围功能的状态、所有IO口的状态,只要确保所有的功能都在合适的状态,才能实现超低功耗。对于STM32L CPU,注意事项有:


   1、不用的IO口处理

    不用的IO口一定设置为 模拟输入&& 无上拉,这个也蛮容易理解的,我们可以认为CPU的内部,模拟输入要经过运放,而运放的输入电阻是无穷大的,相当于输入端断开,加上没有 上下拉电阻的影响,即便是IO口状态不确定,基本上也是不会有电流的。
    


2、CPU 的是时钟频率及内核电压

    根据自己项目情况设置的低一些,时钟、内核电压配置如下:

	* 5. This file configures the system clock as follows:  
  *=============================================================================
  *                         System Clock Configuration
  *=============================================================================
  *        System Clock source          | PLL(HSE)
  *----------------------------------------------------------------------------- 
  *        SYSCLK                       | 12000000 Hz
  *----------------------------------------------------------------------------- 
  *        HCLK                         | 12000000 Hz
  *----------------------------------------------------------------------------- 
  *        AHB Prescaler                | 1
  *----------------------------------------------------------------------------- 
  *        APB1 Prescaler               | 1
  *----------------------------------------------------------------------------- 
  *        APB2 Prescaler               | 1
  *----------------------------------------------------------------------------- 
  *        HSE Frequency                | 8000000 Hz
  *----------------------------------------------------------------------------- 
  *        PLL DIV                      | 2
  *----------------------------------------------------------------------------- 
  *        PLL MUL                      | 3
  *----------------------------------------------------------------------------- 
  *        VDD                          | 3.3 V
  *----------------------------------------------------------------------------- 
  *        Vcore                        | 1.5 V (Range 2)
  *----------------------------------------------------------------------------- 
  *        Flash Latency                | 1 WS
  *----------------------------------------------------------------------------- 
  *        Require 48MHz for USB clock  | Disabled
  *----------------------------------------------------------------------------- 


  3、输出 的IO口

       可以设置成 开漏无上下拉,而且在 进入低功耗模式前,必须要拉低该IO口。


4、 输入 IO 口

    比如用作外部中断输入的IO口,要设置成 输入&&下拉&上升沿。
  

5、外设

 进入超低功耗模式之前,要关闭使用的外围功能,比如ADC、SPI外设,串口关闭与否好像并没有太大的影响,
      关闭外设的步骤如下:
      ① 关闭外部中断。
      ② XXX_Cmd(XXX, DISABLE);
      ③ XXX_DeInit(XXX)
      
      对于一些模拟时序的外围,比如I2C接口,关闭外设的步骤其实就是设置成 模拟无上拉 输入即可,不需要再进行
      XXX_DeInit的操作。
      


6、唤醒后动作

   CPU唤醒后,需要将之前设置的低功耗配置IO口、外围功能重新初始化一遍,比如ADC、I2C等。


 三、调试


     超低功耗的设计,涉及到硬件和软件的低功耗设计,哪一块出问题了,都会影响整体的功耗,所以我们调试的时候,务必要一点点的增加软件功能,先从最小系统功耗测量开始,一点点的增加外围功能,这样才能逐步锁定问题,解决问题。

发布了247 篇原创文章 · 获赞 257 · 访问量 62万+

猜你喜欢

转载自blog.csdn.net/u012351051/article/details/97910615