天天看點

STM32F4鬧鐘

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

繼續閱讀