RTC外设详解
1、RTC介绍
STM32H562的RTC具有日历功能,提供自动唤醒功能,可用于管理所有低功耗模式。实时时钟是一个独立的VCD定时器/计数器,提供了两个可编程(ALARM A和 ALARM B)中断。RTC模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后RTC的配置及时间维持不变,只要供电电压保持在工作范围内,RTC就永远不会停止。
2、RTC功能详解
2.1、RTC架构框图
根据上图可以把RTC模块分为如下几个部分:
1、时钟源输入(rtc_ker_ck)
STM32H5xx系列的RTC时钟源(rtc_ker_ck)可在LSE时钟、LSI时钟及HSE时钟中三选一,通过RCC模块的RCC_BDCR寄存器配置。一般优先选择LSE,即外部32.768KHz晶振为rtc_ker_ck,具有高精度的优点。LSI为STM32内部的低速RC振荡器,频率约32kHz,缺点精度低,一般不使用;所以当考虑 成本无外部低速晶振时,会优先选择分频后的HSE为备选;
2、预分频器
预分频器(RTC_PRER)分为两部分:一个通过RTC_PRER寄存器的PREDIV_A位域配置的7位异步预分频器。另一个为通过RTC_PRER寄存器的PREDIV_S位域配置的15位同步预分频器。经过7位异步预分频器出来的时钟ck_apre可作为RTC_SSR亚秒递减计数器(RTC_SSR)的时钟,ck_apre时钟频率计算公式如下:
当RTC_SSR寄存器递减到0时,会使用PREDIV_S的值重新装载RTC_SSR。
ck_spre时钟就可以用于更新日历,也可以用作16位唤醒自动重载定时器的时基。ck_spre时钟频率(一般设置为1Hz)计算公式如下:
对于同时使用两个预分频器(PREDIV_A与PREDIV_S)时,一般推荐设置7位异步预分频器(PREDIV_A)的值较大,以降低功耗。如本实例我们使用外部低速晶振32.768KHz经过PREDIV_A异步分频器后,再经过PREDIV_S同步分频器,得到1Hz频率的输入时钟ck_spre;即设置PREDIV_A=0x7F(128分频);PREDIV_S=0xFF(256分频)。
3、时间和日期
该部分包括三个影子寄存器,RTC_SSR(亚秒)、RTC_TR(时间)、RTC_DR(日期)。实时时钟一般一般表示为:时/分/秒/亚秒。RTC_TR寄存器用于存储时/分/秒时间数据,可读可写;RTC_DR寄存器用于存储日期数据,包括年/月/日/星期,可读可写;RTC_SSR寄存器用于存储亚秒级的时间。
4、可编程闹钟
STM32H5xx系列提供了两个可编程闹钟(Programmable alarms):Alarm_A和Alarm_B。
通过RTC_CR寄存器的ALRAE与ALRBE位置1来使能闹钟。当亚秒、秒、分、时、日期分别与闹钟寄存器RTC_ALRMASSR/RTC_ALRMAR和RTC_ALRMBSSR/RTC_ALRMBR中的值匹配时,则可产生闹钟。
5、周期性自动唤醒
周期性唤醒标志是由一个16位可编程自动重载计数器(RTC_WUTR)生成,可扩展至17位。
通过RTC_CR寄存器中的WURE位设置使能此唤醒功能。该唤醒定时器的时钟输入可以是:RTC时钟(rtc_ker_ck)经过2、4、8或16分频后输入,也可以是ck_spre时钟;
当使用rtc_ker_ck(即LSE:32.768kHz)作为输入时钟,可配置唤醒中断周期在122us~32s之间,分辨率最低为61us。
当选择ck_spre(1Hz)作为输入时钟时,可得到唤醒时间为1s到36h左右,分辨率为1s。
初始化完成后,定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。当计数器计数到0时,RTC_ISR寄存器的WUTF标志会置1,并且唤醒寄存器会使用其重载值动重载,之后必须用软件清零WUTF标志。
2.2、RTC的Hal库变量及函数简介
1、RTC初始化结构体变量如下:
/*** @brief RTC Configuration Structure definition*/typedef struct{uint32_t HourFormat; /*!< Specifies the RTC Hour Format.This parameter can be a value of @ref RTC_Hour_Formats */uint32_t AsynchPrediv; /*!< Specifies the RTC Asynchronous Predivider value.This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7F */uint32_t SynchPrediv; /*!< Specifies the RTC Synchronous Predivider value.This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x7FFF */uint32_t OutPut; /*!< Specifies which signal will be routed to the RTC output.This parameter can be a value of @ref RTCEx_Output_selection_Definitions */uint32_t OutPutRemap; /*!< Specifies the remap for RTC output.This parameter can be a value of @ref RTC_Output_ALARM_OUT_Remap */uint32_t OutPutPolarity; /*!< Specifies the polarity of the output signal.This parameter can be a value of @ref RTC_Output_Polarity_Definitions */uint32_t OutPutType; /*!< Specifies the RTC Output Pin mode.This parameter can be a value of @ref RTC_Output_Type_ALARM_OUT */uint32_t OutPutPullUp; /*!< Specifies the RTC Output Pull-Up mode.This parameter can be a value of @ref RTC_Output_PullUp_ALARM_OUT */uint32_t BinMode; /*!< Specifies the RTC binary mode.This parameter can be a value of @ref RTCEx_Binary_Mode */uint32_t BinMixBcdU; /*!< Specifies the BCD calendar update if and only if BinMode = RTC_BINARY_MIX.This parameter can be a value of @ref RTCEx_Binary_mix_BCDU */} RTC_InitTypeDef;
HourFormat:小时格式
AsynchPrediv:异步预分频系数
SynchPrediv:同步预分频系数
OutPut:选择连接到RTC_ALARM输出的标志
OutPutRemap:指定RTC输出的映射
OutPutPolarity:设置RTC_ALARM的输出极性
OutPutType:设置RTC_ALARM的输出类型为开漏输出还是推挽输出
BinMode:二进制模式
BinMixBcdU:设置RTC日历更新
2、RTC初始化相关API函数
/** @defgroup RTC_Exported_Functions_Group1 Initialization and de-initialization functions* @{*//* Initialization and de-initialization functions ****************************/HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc);HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc);void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc);void HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc);
3、RTC时钟日期时间及Alarm相关API函数
/** @defgroup RTC_Exported_Functions_Group2 RTC Time and Date functions* @{*//* RTC Time and Date functions ************************************************/HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);HAL_StatusTypeDef HAL_RTC_GetTime(const RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format);HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate