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

  

比如設置一個鬧鍾,在每天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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM