RTC外设详解

发布于:2025-07-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到