STM32L1x FreeRTOS低功耗模式实现指南

1.三种模式:sleep睡眠模式、stop停机模式、standby 待机模式

因为项目有外部引脚中断,这边用的是stop模式,以便条件触发唤醒。网上看了挺多的,freertos带有Tickless Idle Mode模式,cubemx中将其打开:

2. Tickless Idle Mode 的软件设计原理

这边参考FreeRTOS 低功耗模式设计 STM32平台-CSDN博客,简单来说就是,尽可能的让MCU 在运行空闲任务的时候进入低功耗模式,需要的时候就退出低功耗模式正常运行。

当MCU 被唤醒时,通过某种方式为系统时钟提供补偿,唤醒的两种方式:系统时钟中断,外部事件中断,可以通过运行在低功耗模式下的某种定时器来计算出MCU处于低功耗模式下的时间,在MCU唤醒后对系统时间进行软件补偿,至于l151的话,我刚学习,至于系统时间补偿以后有时间再研究,可以参考https://www.cnblogs.com/suozhang/p/9946097.html。

3.Tickless模式函数

这边为了方便简单就看了这两个函数,更深入一点的暂时就没有去看了。

1.PreSleepProcessing,freertos进入低功耗前需要做的事情,就是把一些外设时钟关掉,不用的引脚尽量改成模拟输入,降低功耗。

//进入低功耗模式前需要处理的事情
//ulExpectedIdleTime:低功耗模式运行时间
void PreSleepProcessing(uint32_t ulExpectedIdleTime)
{
 if (g_noStopMode == 0)
    {

        WakeUpCounter = 2.048 * (*ulExpectedIdleTime);

        *ulExpectedIdleTime = 0;

        if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, WakeUpCounter,
        RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
        {
            Error_Handler();
        }

        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

    }
}

这边因为进入stop模式,只剩下LSE, LSI还在运行,我发现freertos的时钟变慢,定时器变得不准,为了较准确的使用定时器,给他配置为LSE外部rtc唤醒。然后进入stop模式,用这个函数就完事了HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

2.PostSleepProcessing

void PostSleepProcessing(uint32_t ulExpectedIdleTime)
{
//退出低功耗模式
    if (g_noStopMode == 0)
    {
        SystemClockConfig_STOP();

        HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
    }


}

上面所说,进入stop模式,除了lse和lsi时钟,其他时钟都将被禁止,所以在退出stop时,我们要重新配置时钟,(这边退出stop,默认使用的是hsi),将rtc唤醒计时器停用。

4.体会

为了低功耗,可以把不用的引脚改为模拟化输入,这是能否在低功耗上更进一步的关键,当时这个坑趟了好久。如果你不需要定时器之类的,rtc唤醒可以不用,只用外部事件中断唤醒,这就会达到手册上所说的0.44ua。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32L1x FreeRTOS低功耗模式实现指南

发表评论