STM32F030F4P6低功耗模式

最近在DIY一款支持mppt的太阳能充电器,其中使用到了STM32F030F4P6作为主控芯片。用来显示充电状态,电池电量,升压电路使能控制,输出使能控制,手机插入检测,台灯控制等等功能。但是在我DIY过程中电路工作一切正常,就是晚上待机功耗有点大,具体待机电流有多少,没有设备没有测量。就是一晚上下来单节电池电压会下降0点几伏。在通过分析后发现在没用进行太阳能充电时,单片机还在飞速运转中,必然会造成功耗的损失。所以这里就想着在空闲时间让单片机进入低功耗模式,减少待机功耗。


STM32F030休眠模式介绍

从芯片手册中可以找到以下一段文字:

STM32F030F4P6低功耗模式_第1张图片

      大概的意思就是STM32F030F4P6支持3种低功耗模式,分别为Sleep mode(休眠模式),Stop mode(停止模式),Standby mode(待机模式)。从手册中可以看出停止模式支持任何一个外部中断将MCU从低功耗模式中唤醒,这个功能对我这个应用实在是太友好了,因为我能用来作为外部唤醒资源的只有一个按键,所以在此次DIY的过程中毫不犹豫就使用停止模式,节省来之不易的能量。

在进入停止耗模式之前需要根据应用情况将单片机内部相关外设时钟进行关闭。我这里用到了ADC,所以需要关闭ADC时钟,失能ADC。还有使用到两个定时器,所以需要失能定时器让所有定时器停止计数。还有就是记得将IO口做适当的处理,这个根据板子实际情况。具体怎样设置可以参考下面这个文章,写的不错。http://www.openedv.com/posts/list/18372.htm

然后调用两个函数便可以进入停止模式。(我用的HAL库,函数参数可通过查看函数说明)  

__HAL_RCC_PWR_CLK_ENABLE();
    HAL_PWR_EnterSTOPMode();

void StopModeIn(void)
{
  
    uint32_t i=10000;
    /*关闭输出*/
    PowerSwitch(0);
    LedOffAll();
    /*失能定时器*/
    ConfigTimer();
    /*失能ADC*/
    ConfigAdc();
    /*设置所有IO口*/
    ConfigIo();
    /*开启外部中断,我这里使用到两个外部中断进行唤醒*/
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);            //按键状态监测
    HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);           //充电状态监测
    while(i--);                                  //延时一小会  
    /*进入STOP MODE*/
    __HAL_RCC_PWR_CLK_ENABLE();                                        //使能电源管理时钟
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI); //进入停止模式,可以被任何一个中断源唤醒
}

  我专门写了一个函数用来进入停止模式,在进入之前调用相关函数对单片机进行配置,每个人需求都不同这里就不一一介绍了。经过一番配置后,就能进入低功耗模式了吧!!!!

        我手边没有专用的仪器,只有一个30多元万用表,接上去后单片机不能正常工作。于是呼我采用了观察法,将我的板子接上电池,进入低功耗测量初始电压为3.79V,然后经过3天后电压依然为3.79V,并且可以正常唤醒,我的电池是一节2600mah的锂电池,在这期间肯定存在损耗,具体多少等到公司后在进行测量,总之能够满足我目前的需求。

 进入停机模式前需要将一个引脚配置为输入中断,在中断函数中可以做一些相应的操作,对于我这个系统而言,不存在历史数据所以直接在中断服务函数中进行软件复位就可以了,这样就可以让所有使用到的外设重新初始化。

你可能感兴趣的:(STM32)