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 */