HAL - RTC分析

本文章用于对于HAL库RTC代码进行分析,并同时关心cubemx是如何使用hal库进行初始化的。芯片基于F429/F767两种。
前面从cubemx开始,到函数使用,再到具体的代码的分析。

cubemx设置
HAL - RTC分析_第1张图片
通常情况下,我们会选择LSE作为RTC的时钟源,一般f RTCCLK = f LSE = 32.768KHz. 然后经过预分频器PRER分频生成1Hz的时钟用于更新日历,为了最大程度的降低功耗,一般同步预分频器设置为较大的值,例如PREDIV_S=255,PREDIV_A=127,计算公式为: f CK_SPRE = f RTCCLK /{ ( PREDIV_A+1 ) * ( PREDIV_S+1 ) } = 32.768/{ ( 127+1 ) *(255+1)}=1HZ。

Hour Format : 时制
Asynchronous Predivider value: 异步分频值
Synchronous Predivider value:同步分频值

Data Format: BCD码模式或者 Binary data format 所谓BCD码就是 0x10 表示 10的意思,Bin 0x10 表示 16,另外寄存器是BCD码的
Hours : 默认小时
Minutes:默认分钟
Seconds:默认秒
Day Light Saving:设置日历,增加1小时 ,还是减小1小时,或者不变,一般用于夏时令或者冬时令。
Store Operation:存储操作,可以理解为一个类似于RTC备份域的寄存器,主要用于标记。比如如上增加了1个小时,把这个寄存器设置为1.记录一下。另外我国没有夏时令,基本用不上。

Weak Day: 星期
Month:月份
Data:日期
Year:年

RTC唤醒
设置WakeUp 为 internal Wake Up 会有一个唤醒设置
Wake Up Clock :唤醒时钟
Wake Up Counter: 唤醒时间
自动复位值,实测可以再待机模式中唤醒

闹钟功能
设置 ALarm A 或者 Alarm B为Internal Alarm 或者 Routed to AFR,会有闹钟设置
HAL - RTC分析_第2张图片
Hours:小时
Minutes:分钟
Seconds:秒
Sub Seconds:亚秒
Alarm Mask Data Week day:功能掩码,表示对应设置参数是否有效,这个表示Data是否进行比较
Alarm Mask Hours:表示Hours是否进行比较
Alarm Mask Minutes:表示Minutes是否进行比较
Alarm Mask Seconds:表示Seconds是否进行比较
Alarm Sub Second Mask:如上
Alarm Date Week Day Sel:Alarm Date表示的是Data还是Week
Alaram Date :根据上面设置表示日期或者星期 日期可以是(0-31)

关于Mask的说明,disable表示不使能亚秒,即该位需要比较,例如我们闹钟是设置11号每小时的11分钟11秒,那么小时由于每小时都有用则应该设置able,而data,min,sec都有对应的值不使用mask设置disable,这样再11号那一天的每个小时中的11分11秒都会产生一个闹钟事件。闹钟也可以用于低功耗唤醒

时间戳
有个Timestamp Routed to AF1选项,设置后有如下参数
Time Stamp Pin Edge:时间戳引脚边沿信号。
时间戳的作用时,引脚检测到目标边沿信号,那么会当前时间记录再时间戳寄存器中,如果设置了中断,也会产生中断事件。另外时间戳事件也可以用于低功耗唤醒,这意味这除了RTC唤醒引脚外还有其它的引脚进行低功耗唤醒。

其它的一些参考时钟,输入校准因为没使用过就不进行分析了。

API操作

HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);   //初始化
HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc); //去初始化

//需要注意的的时cubemx你使用的时BCD还是Binary。
// 最简单的时钟日历功能
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); //设置当前时间 
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format); //获取时间
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format); //设置日期
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format);// 获取日期

//闹钟功能
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); // 设置闹钟
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format); //设置闹钟并开中断
HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm); // 关闭闹钟
HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format); //获取闹钟
void                HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc); //闹钟中断会调用
HAL_StatusTypeDef   HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //等待到闹钟A事件或者超时。
void         HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc); //闹钟A回调
void              HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc);    //等待到闹钟B事件或者超时。
HAL_StatusTypeDef HAL_RTCEx_PollForAlarmBEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //闹钟B回调

//时间戳
HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin);//设置时间戳
HAL_StatusTypeDef HAL_RTCEx_SetTimeStamp_IT(RTC_HandleTypeDef *hrtc, uint32_t TimeStampEdge, uint32_t RTC_TimeStampPin);//设置时间戳并开中断
HAL_StatusTypeDef HAL_RTCEx_DeactivateTimeStamp(RTC_HandleTypeDef *hrtc);//关闭时间戳
HAL_StatusTypeDef HAL_RTCEx_SetInternalTimeStamp(RTC_HandleTypeDef *hrtc);//设置内部时间戳
HAL_StatusTypeDef HAL_RTCEx_DeactivateInternalTimeStamp(RTC_HandleTypeDef *hrtc);//关闭内部时间戳
HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTimeStamp, RTC_DateTypeDef *sTimeStampDate, uint32_t Format);//获取当前记录的时间戳

//入侵检查
HAL_StatusTypeDef HAL_RTCEx_SetTamper(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper); //设置入侵
HAL_StatusTypeDef HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper); //设置入侵并开中断
HAL_StatusTypeDef HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef *hrtc, uint32_t Tamper);//关闭入侵检查
void              HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc);//入侵以及时间戳中断
//入侵跟备份域相关,这个用于防止别人拆机,比如你机器关键部分打开后,某个引脚端口产生一个信号,这个信号会直接把备份域中的信息删除,达到保护功能。或者再中断中想办法把你芯片锁死,或者程序不在运行等。。。

void              HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc);  //AF1引脚入侵中断回调
void              HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef *hrtc);  //AF2引脚入侵中断回调
void              HAL_RTCEx_Tamper3EventCallback(RTC_HandleTypeDef *hrtc);  //AF3引脚入侵中断回调
void              HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc); //时间戳中断回调
HAL_StatusTypeDef HAL_RTCEx_PollForTimeStampEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout);//阻塞等待一个时间戳事件直到超时
HAL_StatusTypeDef HAL_RTCEx_PollForTamper1Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //同上
HAL_StatusTypeDef HAL_RTCEx_PollForTamper2Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout);//同上
HAL_StatusTypeDef HAL_RTCEx_PollForTamper3Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //同上

//唤醒函数
HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock); //设置唤醒
HAL_StatusTypeDef HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock); //设置唤醒并开中断
uint32_t          HAL_RTCEx_DeactivateWakeUpTimer(RTC_HandleTypeDef *hrtc); //关闭唤醒
uint32_t          HAL_RTCEx_GetWakeUpTimer(RTC_HandleTypeDef *hrtc); //获取唤醒
void              HAL_RTCEx_WakeUpTimerIRQHandler(RTC_HandleTypeDef *hrtc); //唤醒中断以及其处理
void              HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc); //唤醒回调函数
HAL_StatusTypeDef HAL_RTCEx_PollForWakeUpTimerEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout); //阻塞等待一个唤醒事件知道超时

//备份域 //备份域还是蛮有用的,希望多使用,它是一个ram,但是电源时RTC电池提供的,也就是RTC电池一直有电,这个可以当一个EEPROM使用。可以用于防止突然断电,或者有预谋的软件复位等等。
void              HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data); //写备份域
uint32_t          HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister);//读备份域

代码分析
有空再说。

你可能感兴趣的:(HAL库)