目的:每天定时闹钟
直接上过程:
步骤一、配置
日历设置,我这里是20-03-06 9:00:00 星期五。那天都无所谓,有函数可以修改。
闹钟设置:09:01:00秒的闹钟
注意:Alarm mask hours等这些设置,我英语不太好,但是我知道mask是什么意思。它是屏蔽的意思。我这里是每天09:01:00。如果全部不屏蔽,则,RTC时间与闹钟时间完全一致才会触发。mask是用来屏蔽触发条件的。
比如说:我工作日屏蔽,秒屏蔽。那么这样的话,每天9:01分都会进入闹钟中断函数,而且会进去60次,09:01:00-09:01:59期间,每S都会触发一次。
使能中断
再帖几个函数上来
// Alarm A callback. AL_RTC_AlarmAEventCallback(hrtc);
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
// portBASE_TYPE xHigherPriorityTaskWoken;
/* Clear the AlarmA interrupt pending bit */
__HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
}
//Sets the specified RTC Alarm with Interrupt
HAL_StatusTypeDef RTC_Set_Alarm_IT(uint8_t hour,uint8_t min,uint8_t sec)
{
RTC_AlarmTypeDef salarmstructure;
salarmstructure.Alarm = RTC_ALARM_A;
salarmstructure.AlarmTime.Hours = hour;
salarmstructure.AlarmTime.Minutes = min;
salarmstructure.AlarmTime.Seconds = sec;
salarmstructure.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
salarmstructure.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
// salarmstructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS
// |RTC_ALARMMASK_SECONDS;
salarmstructure.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
salarmstructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
salarmstructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
salarmstructure.AlarmDateWeekDay = 1;
if(HAL_RTC_SetAlarm_IT(&hrtc, &salarmstructure, RTC_FORMAT_BIN)) return HAL_ERROR;
return HAL_OK;
}
//Sets RTC current date. 优化的不是很好,强迫症者可自行修改
HAL_StatusTypeDef RTC_Set_Date_Time(uint8_t year,uint8_t month,uint8_t date,uint8_t week,uint8_t hour,uint8_t min,uint8_t sec,uint8_t ampm)
{
RTC_DateTypeDef RTC_DateStructure;
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateStructure.Date=date;
RTC_DateStructure.Month=month;
RTC_DateStructure.WeekDay=week;
RTC_DateStructure.Year=year;
if(HAL_RTC_SetDate(&hrtc,&RTC_DateStructure,RTC_FORMAT_BIN)) return HAL_ERROR;
RTC_TimeStructure.Hours=hour;
RTC_TimeStructure.Minutes=min;
RTC_TimeStructure.Seconds=sec;
RTC_TimeStructure.TimeFormat=ampm;
RTC_TimeStructure.DayLightSaving=RTC_DAYLIGHTSAVING_NONE;
RTC_TimeStructure.StoreOperation=RTC_STOREOPERATION_RESET;
if(HAL_RTC_SetTime(&hrtc,&RTC_TimeStructure,RTC_FORMAT_BIN)) return HAL_ERROR;
return HAL_OK;
}
HAL_StatusTypeDef RTC_GetAlarm(void)
{
if(HAL_RTC_GetAlarm(&hrtc, &RTC_GetAlarmStruct, RTC_ALARM_A, RTC_FORMAT_BIN))return HAL_ERROR;
return HAL_OK;
}
要用到的代码都贴上来了,其实还是挺简单的。留意RTC_Set_Alarm_IT这个函数