比較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);
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);