超低功耗研发-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芯片:由于低功耗设备往往采用电池供电,一些锂电池随着电量的降低,输出电压也会降低,所以我们的DC-DC芯片要保证低压降,至少要能做到0.1V的压降下,仍能正常工作。
(2)DC-DC静态功耗要足够小,因为在低功耗设计中,所有的器件本身也是要耗电的,尤其是DC-DC器件,耗电更多,所以尽可能的选用超低功耗LDO,当然了还要考虑LDO的最大输出电流,我使用的一款新品是上海贝岭的BL8064系列,静态功耗手册上说只有1uA,实测确实也不错。
超低功耗CPU的内核电压一般都是可配置的,比如说STM32L系列的,CPU电压就可以配置为1.2/1.5/1.8V,这个根据自己项目的情况来选择,因为电压与工作频率是有关系的,正常情况下,1.5V是够用的。
如果我们的外围中,有开关控制需求,比如ADC电压 采集、信号通断等,那么优先考虑 CPU低功耗时,IO口引脚默认为低电平。这样的话,本身GPIO为输出配置,输出低电平肯定要比输出高电平要保险一些(功耗),比如采用三极管实现通断,那么最好使用NPN的管子实现,因为NPN的管子,控制引脚为低电平,三极管不导通,这部分的电路相当于全部断掉,功耗比较小。
对于一些的传感器,比如温度传感器芯片,如果这个传感器是超低功耗还好,但是多数情况下,传感器的功耗都是有的,即便是不测量的情况下,所以最保险的方式就是控制传感器的电源,这里面要特别注意,要控制整个传感器电源的源头,包括信号线上拉的电源,所以,还是考虑使用P沟道的mos管,mos管的S极接电源,D极给传感器电源和信号线上拉电阻供电,这样我们就能够通过IO口控制G极,实现整个传感器的完全断电了。
(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,这样就能最大可能的保证模组的稳定。
这个涉及到一些细节问题,这里就不一一描述了,总而言之就是在满足功能的需求的情况下,电阻和电容都要少,而且电阻阻值不要太小,这有几方面原因,一是太小,相对费电,虽然在低功耗状态下,电阻大小不会影响费电,但是在正常工作情况下,电阻小,电流就大,整体的电流大了后,就会拉低电池的电压,所以需要采用合适的,稍微大点的电阻。电容呢,是要按需用,因为电容本身是储能的,也有漏电流,所以用的多了,也是会引起耗电的。
IO口的分配不能只从布线方便上考虑,还要结合软件设计,比如说CPU进入低功耗设计之前,需要关闭一些外围器件,一些外围器件的关闭是需要XXX_DeInit操作的,比如说I2C模拟接口,关闭I2C模拟接口,最方便的就是先XXX_DeInit,这个函数会对整个port口进行时钟使能和关闭,所以好的设计,应该是将功能分块,比如所有的控制IO口都适用PortA,所有的I2C模拟接口都适用PortB,中间不要随意穿插。这样对于软件工程师来讲,写代码的时候就相对容易些。
焊接温度和静电有可能会引起莫名其妙的功耗增加,这个时候是很抓狂的,尽可能的低温(280度以下)焊接,然后尽量减小静电的干扰,比如喷三防漆,放在无静电干扰的地方(橡胶垫)。
对于CPU中标准的各种低功耗模式,这里就不用赘述了,因为是CPU厂家提供的,我们在软件设计的时候,出现各种奇怪的功耗增加的原因,多数是因为我们队外围功能控制的处理不当引起的,作为程序设计人员,我们一定要非常清楚CPU中所有外围功能的状态、所有IO口的状态,只要确保所有的功能都在合适的状态,才能实现超低功耗。对于STM32L CPU,注意事项有:
不用的IO口一定设置为 模拟输入&& 无上拉,这个也蛮容易理解的,我们可以认为CPU的内部,模拟输入要经过运放,而运放的输入电阻是无穷大的,相当于输入端断开,加上没有 上下拉电阻的影响,即便是IO口状态不确定,基本上也是不会有电流的。
根据自己项目情况设置的低一些,时钟、内核电压配置如下:
* 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
*-----------------------------------------------------------------------------
可以设置成 开漏无上下拉,而且在 进入低功耗模式前,必须要拉低该IO口。
比如用作外部中断输入的IO口,要设置成 输入&&下拉&上升沿。
进入超低功耗模式之前,要关闭使用的外围功能,比如ADC、SPI外设,串口关闭与否好像并没有太大的影响,
关闭外设的步骤如下:
① 关闭外部中断。
② XXX_Cmd(XXX, DISABLE);
③ XXX_DeInit(XXX)
对于一些模拟时序的外围,比如I2C接口,关闭外设的步骤其实就是设置成 模拟无上拉 输入即可,不需要再进行
XXX_DeInit的操作。
CPU唤醒后,需要将之前设置的低功耗配置IO口、外围功能重新初始化一遍,比如ADC、I2C等。
超低功耗的设计,涉及到硬件和软件的低功耗设计,哪一块出问题了,都会影响整体的功耗,所以我们调试的时候,务必要一点点的增加软件功能,先从最小系统功耗测量开始,一点点的增加外围功能,这样才能逐步锁定问题,解决问题。