STM32L4待机模式闹钟唤醒方法
在很多低功耗应用中都会用到待机模式,而在使用待机模式的同时一定要用STM32的RTC功能,一般都是秒级别的。在这次项目中,我要用RTC来作为时间闹钟让单片机进入待机模式进入低功耗模式,以此来降低功耗。应用场景就是在白天进行工作模式,晚上7点之后将数据上传之后进入低功耗模式,第二天早上8点通过闹钟中断进行唤醒继续工作。在调试的过程中发现stm32f4系列与stm32L4系列的应用模式有一定的区别下面是我的解决方案。
闹钟唤醒待机模式解决方案:
使用CUBEmx配置RTC选择ALARMA,在RTC配置中给ALARMA配置为你想要的时间,当然也可以选择秒或者小时,具体根据需要。
1 设置中断源为外部中断Exit int pin18(注意在stm32f4中是Exit int pin17)
2 生成代码
3 将RTC生成的代码进行简单的修改,具体如下所示:
u8 MX_RTC_Init(void)
{
// RTC_TimeTypeDef sTime = {0};
// RTC_DateTypeDef sDate = {0};
// RTC_AlarmTypeDef sAlarm = {0};
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
return 2;
}
// RTC_Set_Time(10,50,10,RTC_HOURFORMAT12_AM); //设置时间 ,根据实际时间修改
// RTC_Set_Date(21,6,3,4); //设置日期
/* USER CODE BEGIN Check_RTC_BKUP */
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!=0X5050)//是否第一次配置
{
RTC_Set_Time(23,59,56,RTC_HOURFORMAT12_PM); //设置时间 ,根据实际时间修改
RTC_Set_Date(15,12,27,7); //设置日期
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0X5050);//标记已经初始化过了
}
return 0;
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
}
4 在主函数中调用
HAL_PWR_EnterSTANDBYMode();
即可进入待机模式。
5 等待进行闹钟中断,即可唤醒单片机(这里注意只要设置好闹钟时间即可唤醒单片机,在中断里不需要加复位函数)。