目的:每天定時鬧鐘
直接上過程:
步驟一、配置
日曆設置,我這裏是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這個函數