STM32L051 RTC STOP模式低功耗实例详解及实践指南

        1、首先我们打开STM32CubeMX软件新建一个工程文件,这里我们的单片机选的是STM32L051C8TX,封装为LQFP48;

        2、我们先配置系统:点击SYS,由于我们采用的是SWD模式的下载方式,所以选择Debug Serial Wire,如图:

3、其次,我们配置时钟,点击RCC由于我们采用内部晶振,故这里保持默认设置就可以,然后打开时钟配置界面,我们选择HSI16MHz时钟晶振,2分频,如下图所示:

4、接下来我们配置RTC,激活时钟源,唤醒方式选择内部唤醒,并打开RTC中断:

5、到这里RTC+STOP低功耗模式便可以实现了,但是由于我的硬件系统中还有一些外设,需要配置,如果不做相应处理的话不能得到最低的休眠功耗,大家可以参考下:

        由于串口和IIC以及一些采样控制等信号是我的硬件所需要的,故这里不做赘述,接下来我们就可以生成代码了,点击project manager,填写工程文件名,选择自己的编译器即可:

        最后点击GENRRATE CODE 生成代码,我用的是keil软件,代码生成后需要自己添加一些进入低功耗的程序

//重写RTC中断函数,用于定时唤醒休眠中的处理器
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
	rtc_flag = 1;
}

    //进入休眠所需要的函数
    __HAL_RCC_PWR_CLK_ENABLE();//使能电源时钟
    __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);//配置从休眠模式唤醒后的时钟源
	
	HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);//停用唤醒时间计数器
	__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清楚PWR挂起标志
	HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x5AD7, RTC_WAKEUPCLOCK_RTCCLK_DIV16);//设置从休眠模        
    式唤醒所需要的时间
	HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//进入STOP模式

        唤醒后,我们程序是从进入休眠时的位置继续执行,这里我们用while循环实现,RTC周期性定时唤醒,执行一段程序后继续进入休眠。

 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(rtc_flag == 1)
				{
					rtc_flag = 0;
					LED1_ON;
					LED2_ON;
					HAL_Delay(5000);
					LED1_OFF;
					LED2_OFF;
					
					PS1_ON;
					PS2_ON;
					PS3_ON;
					MX_I2C1_Init();
					MX_I2C2_Init();
					HAL_Delay(5000);
					HAL_I2C_DeInit(&hi2c1);
					HAL_I2C_DeInit(&hi2c2);
					PS1_OFF;
					PS2_OFF;
					PS3_OFF;
					HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
					__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//新加
					HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x5AD7,            RTC_WAKEUPCLOCK_RTCCLK_DIV16);
					HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
		}
  }

这里为了实现最低功耗,我针对自己的板子做了一些处理,大家可以忽略。从RTC唤醒后,给标志位置0,然后执行后四句就可以了,也可以根据自己的硬件电路,做相应的处理,来实现最低功耗。

需要注意的是,我这里休眠10秒,然后唤醒10秒,(我采用的是内部时钟37KHz)可以根据以下方法进行计算:

/*## Setting the Wake up time ############################################*/
    /*  RTC Wakeup Interrupt Generation:
        Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI))
        Wakeup Time = Wakeup Time Base * WakeUpCounter 
                    = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSE or LSI)) * WakeUpCounter
        ==> WakeUpCounter = Wakeup Time / Wakeup Time Base

        To configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:
          RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16 
          Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms
          Wakeup Time = ~4s = 0,410ms  * WakeUpCounter
          ==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */

作者:小白小菜。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32L051 RTC STOP模式低功耗实例详解及实践指南

发表评论