STM32L151 使用cube配置RTC 睡眠唤醒闹钟-闹钟方式
1、cube配置
2、睡眠唤醒闹钟程序:注意闹钟必须和时间对应一样否则无法产生中断,小编在这入坑,希望帮到其他人;
void RTC_PowerLow(void)
{
//rtc struct init
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
RTC_AlarmTypeDef sAlarm = {0};
/** Initialize RTC and set the Time and Date : 06:00:00
*/
sTime.Hours = 0x6;
sTime.Minutes = 0x00;
sTime.Seconds = 0x00;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 0x1;
sDate.Year = 0x19;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/** Enable the Alarm A : 06:00:05
*/
sAlarm.AlarmTime.Hours = 0x06;
sAlarm.AlarmTime.Minutes = 0x00;
sAlarm.AlarmTime.Seconds = 0x05;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 0x1;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
}
3、进入低功耗程序
RTC_PowerLow();
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //clear flag
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //clear Power wakeup flag
HAL_PWREx_EnableUltraLowPower();
HAL_PWREx_EnableFastWakeUp();
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //all interrupt
HAL_ResumeTick();
LowPowerResumeConfig();
__HAL_RTC_WAKEUPTIMER_EXTI_DISABLE_IT(); //disable wakeup timer
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG(); //clear flag
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //clear Power wakeup flag