比較F1的片子對於F4的RTC來說有很大提升,F4的RTC提供了日歷時鍾和兩個可編程鬧鍾中斷,一個周期性可編程喚醒標志。這樣很方便設置系統時間,並不會像F1的RTC那樣要自己計算年月日時分秒。F4的RTC是一個獨立的BCD定時計數器,系統可以自動將月份天數補償為28、29(閏年)、30、31天。並且還可以進行夏令時補償。
這里主要說明FAL庫鬧鍾配置結構體
/** * @brief RTC Time structure definition */ typedef struct { uint8_t Hours; //設置小時,如果選擇RTC_HourFormat_12,取值范圍【0-12】,如果選擇RTC_HourFormat_24,取值范圍【0-23】,HourFormat在RTC初始化中設置 uint8_t Minutes; //設置分鍾,范圍【0-59】 uint8_t Seconds; //設置秒鍾,范圍【0-59】 uint8_t TimeFormat; //格式設置,選擇RTC_HOURFORMAT12_AM(代表AM或24小時格式)/RTC_HOURFORMAT12_PM(代表:PM) uint32_t SubSeconds; //亞秒設置 uint32_t SecondFraction; //亞秒因子 uint32_t DayLightSaving; //夏令時接口,已棄用 uint32_t StoreOperation; //夏令時接口,已棄用 }RTC_TimeTypeDef;
/** * @brief RTC Alarm structure definition */ typedef struct { RTC_TimeTypeDef AlarmTime; //設置時間 uint32_t AlarmMask; //鬧鍾掩碼設置 //RTC_ALARMMASK_NONE,鬧鍾比較時匹配所有比較項目,包括日期(日/星期)、時、分、秒,完全匹配才會產生鬧鍾中斷/事件 //RTC_ALARMMASK_DATEWEEKDAY,屏蔽日期(日/星期),鬧鍾比較時將不關心日期(日/星期) //RTC_ALARMMASK_HOURS,屏蔽時鍾,鬧鍾比較時將不關心小時數 //RTC_ALARMMASK_MINUTES,屏蔽分鍾,鬧鍾比較時將不關心分鍾數 //RTC_ALARMMASK_SECONDS,屏蔽秒鍾,鬧鍾比較時將不關心秒鍾數 //RTC_ALARMMASK_ALL,屏蔽所有,設置后將不會產生鬧鍾中斷/事件 uint32_t AlarmSubSecondMask; //亞秒掩碼設置 //在RTC_Alarm_Sub_Seconds_Masks_Definitions中設置亞秒匹配規則 uint32_t AlarmDateWeekDaySel; //日期(日/星期)選擇,此位只有當AlarmMask中不設置RTC_ALARMMASK_DATEWEEKDAY時才有效 //RTC_ALARMDATEWEEKDAYSEL_DATE,選擇匹配日期 //RTC_ALARMDATEWEEKDAYSEL_WEEKDAY,選擇匹配星期 uint8_t AlarmDateWeekDay; //日期(日/星期)設置,此位只有當AlarmMask中不設置RTC_ALARMMASK_DATEWEEKDAY時才有效 //如果AlarmDateWeekDaySel選擇RTC_ALARMDATEWEEKDAYSEL_DATE,該值范圍【1-31】,代表設置一個月當中的第幾號 //如果AlarmDateWeekDaySel選擇RTC_ALARMDATEWEEKDAYSEL_WEEKDAY,該值范圍在RTC_WeekDay_Definitions定義,代表設置一周當中的星期幾 uint32_t Alarm; //設置鬧鍾 //RTC_ALARM_A,選擇鬧鍾A //RTC_ALARM_B,選擇鬧鍾B }RTC_AlarmTypeDef;
比如設置一個鬧鍾,在每個月10號,10點10分10秒時產生鬧鍾事件,則設置如下:
RTC_AlarmTypeDef sAlarm = {0}; sAlarm.AlarmTime.Hours = 10; sAlarm.AlarmTime.Minutes = 10; sAlarm.AlarmTime.Seconds = 10; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; //不屏蔽日期比較 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; //選擇匹配日期 sAlarm.AlarmDateWeekDay = 10; //設置10號 sAlarm.Alarm = RTC_ALARM_A; HAL_RTC_SetAlarm_IT(&RTC_Handler, &sAlarm, RTC_FORMAT_BIN);
比如設置一個鬧鍾,在每周星期五,10點10分10秒時產生鬧鍾事件,則設置如下:
RTC_AlarmTypeDef sAlarm = {0}; sAlarm.AlarmTime.Hours = 10; sAlarm.AlarmTime.Minutes = 10; sAlarm.AlarmTime.Seconds = 10; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_NONE; //不屏蔽日期比較 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; //選擇匹配星期 sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_FRIDAY; //設置星期五 sAlarm.Alarm = RTC_ALARM_A; HAL_RTC_SetAlarm_IT(&RTC_Handler, &sAlarm, RTC_FORMAT_BIN);
比如設置一個鬧鍾,在每天10點10分10秒時產生鬧鍾事件,則設置如下:
RTC_AlarmTypeDef sAlarm = {0}; sAlarm.AlarmTime.Hours = 10; sAlarm.AlarmTime.Minutes = 10; sAlarm.AlarmTime.Seconds = 10; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; //屏蔽日期/星期比較 sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; //日期/星期設置無關 sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_FRIDAY; //日期/星期設置無關 sAlarm.Alarm = RTC_ALARM_A; HAL_RTC_SetAlarm_IT(&RTC_Handler, &sAlarm, RTC_FORMAT_BIN);