STM32G474xx HAL用户手册
stm32g4xx_hal_rtc.c
跳转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_rtc.c
00004   * @author  MCD Application Team
00005   * @brief   RTC HAL模块驱动程序。
00006   *          本文件提供固件功能以管理实时时钟(RTC)外设的以下功能:
00007   *           + 初始化/反初始化函数
00008   *           + 日历(时间和日期)配置
00009   *           + 闹钟(闹钟A和闹钟B)配置
00010   *           + 唤醒定时器配置
00011   *           + 时间戳配置
00012   *           + 篡改检测配置
00013   *           + 备份数据寄存器配置
00014   *           + RTC篡改和时间戳引脚选择
00015   *           + 中断和标志管理
00016   *
00017   ******************************************************************************
00018   * @attention
00019   *
00020   * Copyright (c) 2019 STMicroelectronics.
00021   * All rights reserved.
00022   *
00023   * This software is licensed under terms that can be found in the LICENSE file
00024   * in the root directory of this software component.
00025   * If no LICENSE file comes with this software, it is provided AS-IS.
00026   *
00027   ******************************************************************************
00028   @verbatim
00029  ===============================================================================
00030                           ##### RTC工作条件 #####
00031  ===============================================================================
00032   [..] 实时时钟(RTC)和RTC备份寄存器可以在主VDD电源关闭时
00033        由VBAT电压供电。
00034        为了在VDD关闭时保留RTC备份寄存器的内容并为RTC供电,
00036        VBAT引脚可以连接到由电池或其他电源提供的可选

00037        备用电压。
00038 
00039                    ##### 备份域复位 #####
00040  ===============================================================================
00041   [..] 备份域复位将所有RTC寄存器和RCC_BDCR寄存器
00042        设置为复位值。
00043        当以下任一事件发生时,会产生备份域复位:
00044     (#) 软件复位,通过设置RCC备份域控制寄存器(RCC_BDCR)中的BDRST位触发。
00045     (#) VDD或VBAT上电,如果两个电源之前都已断电。
00046     (#) 篡改检测事件复位所有数据备份寄存器。
00047 
00048                    ##### 备份域访问 #####
00049   ==================================================================
00050   [..] 复位后,备份域(RTC寄存器和RTC备份数据寄存器)
00051        受保护以防止可能的意外写访问。
00052   [..] 要启用对RTC域和RTC寄存器的访问,请按以下步骤操作:
00053     (+) 使用__HAL_RCC_PWR_CLK_ENABLE()函数启用电源控制器(PWR)APB1接口时钟。
00054     (+) 使用HAL_PWR_EnableBkUpAccess()函数启用对RTC域的访问。
00055     (+) 使用__HAL_RCC_RTC_CONFIG()函数选择RTC时钟源。
00056     (+) 使用__HAL_RCC_RTC_ENABLE()函数启用RTC时钟。
00057 
00058   [..] 要启用对RTC域和RTC寄存器的访问,请按以下步骤操作:
00059     (#) 调用HAL_RCCEx_PeriphCLKConfig函数,参数为RCC_PERIPHCLK_RTC,
00060         并选择RTCClockSelection(LSE、LSI或HSEdiv32)
00061     (#) 使用__HAL_RCC_RTC_ENABLE()宏启用RTC时钟。
00062 
00063                   ##### 如何使用RTC驱动程序 #####
00065  ===================================================================
00066   [..]
00067     (+) 启用RTC域访问(请参阅上面的描述部分)。
00068     (+) 使用HAL_RTC_Init()函数配置RTC预分频器(异步和同步)和RTC小时格式。
00069 
00070   *** 时间和日期配置 ***
00071   ===================================
00072   [..]
00073     (+) 要配置RTC日历(时间和日期),请使用HAL_RTC_SetTime()
00075         和HAL_RTC_SetDate()函数。
00076     (+) 要读取RTC日历,请使用HAL_RTC_GetTime()和HAL_RTC_GetDate()函数。
00078 
00079   *** 闹钟配置 ***
00080   ===========================
00081   [..]
00082     (+) 要配置RTC闹钟,请使用HAL_RTC_SetAlarm()函数。
00083             您也可以使用HAL_RTC_SetAlarm_IT()函数配置RTC闹钟为中断模式。
00084     (+) 要读取RTC闹钟,请使用HAL_RTC_GetAlarm()函数。
00086 
00087                   ##### RTC和低功耗模式 #####
00088   ==================================================================
00089   [..] MCU可以通过RTC备用功能从低功耗模式唤醒。
00090   [..] RTC备用功能包括RTC闹钟(闹钟A和闹钟B)、
00091        RTC唤醒、RTC篡改事件检测和RTC时间戳事件检测。
00092        这些RTC备用功能可以从停止和
00093        待机低功耗模式唤醒系统。
00094   [..] 系统也可以不依赖外部中断(自动唤醒模式)从低功耗模式唤醒,
00096        方式为使用RTC闹钟或RTC唤醒事件。
00097   [..] RTC提供了一个可编程的时间基,用于在
00098        停止或待机模式下按固定间隔唤醒。
00099        只有当RTC时钟源为LSE或LSI时,才能从停止和待机模式唤醒。
00100 
00101   *** 回调函数注册 ***
00103   =============================================
00104   当编译定义USE_HAL_RTC_REGISTER_CALLBACKS设置为0或
00106   未定义时,回调注册功能不可用,所有回调
00107   都设置为对应的弱函数。这是推荐的配置
00108   以优化内存/代码消耗/性能。
00109 
00110   [..]
00111   编译定义USE_RTC_REGISTER_CALLBACKS设置为1时,
00112   允许用户动态配置驱动程序回调。
00113   使用函数HAL_RTC_RegisterCallback()注册中断回调。
00114 
00115   [..]
00116   函数HAL_RTC_RegisterCallback()允许注册以下回调:
00117     (+) AlarmAEventCallback          : RTC闹钟A事件回调。
00118     (+) AlarmBEventCallback          : RTC闹钟B事件回调。
00119     (+) TimeStampEventCallback       : RTC时间戳事件回调。
00120     (+) WakeUpTimerEventCallback     : RTC唤醒定时器事件回调。
00121     (+) Tamper1EventCallback         : RTC篡改1事件回调。
00122     (+) Tamper2EventCallback         : RTC篡改2事件回调。
00123     (+) Tamper3EventCallback         : RTC篡改3事件回调。
00124     (+) Tamper4EventCallback         : RTC篡改4事件回调。
00125     (+) Tamper5EventCallback         : RTC篡改5事件回调。
00126     (+) Tamper6EventCallback         : RTC篡改6事件回调。
00127     (+) Tamper7EventCallback         : RTC篡改7事件回调。
00128     (+) Tamper8EventCallback         : RTC篡改8事件回调。
00129     (+) InternalTamper1EventCallback : RTC内部篡改1事件回调。
00130     (+) InternalTamper2EventCallback : RTC内部篡改2事件回调。
00131     (+) InternalTamper3EventCallback : RTC内部篡改3事件回调。
00132     (+) InternalTamper5EventCallback : RTC内部篡改5事件回调。
00133     (+) InternalTamper8EventCallback : RTC内部篡改8事件回调。
00134 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
00135     (+) AlarmAEventCallback_S          : RTC闹钟A事件回调_S
00136     (+) AlarmBEventCallback_S          : RTC闹钟B事件回调_S。
00137     (+) TimeStampEventCallback_S       : RTC时间戳事件回调_S。
00138     (+) WakeUpTimerEventCallback_S     : RTC唤醒定时器事件回调_S。
00139     (+) Tamper1EventCallback_S         : RTC篡改1事件回调_S。
00140     (+) Tamper2EventCallback_S         : RTC篡改2事件回调_S。
00141     (+) Tamper3EventCallback_S         : RTC篡改3事件回调_S。
00142     (+) Tamper4EventCallback_S         : RTC篡改4事件回调_S。
00143     (+) Tamper5EventCallback_S         : RTC篡改5事件回调_S。
00144     (+) Tamper6EventCallback_S         : RTC篡改6事件回调_S。
00145     (+) Tamper7EventCallback_S         : RTC篡改7事件回调_S。
00146     (+) Tamper8EventCallback_S         : RTC篡改8事件回调_S。
00147     (+) InternalTamper1EventCallback_S : RTC内部篡改1事件回调_S。
00148     (+) InternalTamper2EventCallback_S : RTC内部篡改2事件回调_S。
00149     (+) InternalTamper3EventCallback_S : RTC内部篡改3事件回调_S。
00150     (+) InternalTamper5EventCallback_S : RTC内部篡改5事件回调_S。
00151     (+) InternalTamper8EventCallback_S : RTC内部篡改8事件回调_S。
00152 #endif
00153     (+) MspInitCallback              : RTC MspInit回调。
00155     (+) MspDeInitCallback            : RTC MspDeInit回调。
00156   [..]
00157   此函数需要HAL外设句柄、回调ID
00158   以及指向用户回调函数的指针作为参数。
00159 
00160   [..]
00161   使用函数HAL_RTC_UnRegisterCallback()将回调重置为默认
00163   弱函数。
00164   HAL_RTC_UnRegisterCallback()需要HAL外设句柄、
00165   和回调ID作为参数。
00166   此函数允许重置以下回调:
00167     (+) AlarmAEventCallback          : RTC闹钟A事件回调。
00168     (+) AlarmBEventCallback          : RTC闹钟B事件回调。
00169     (+) TimeStampEventCallback       : RTC时间戳事件回调。
00171     (+) WakeUpTimerEventCallback     : RTC唤醒定时器事件回调。
00173     (+) Tamper1EventCallback         : RTC篡改1事件回调。
00175     (+) Tamper2EventCallback         : RTC篡改2事件回调。
00176     (+) Tamper3EventCallback         : RTC篡改3事件回调。
00177     (+) Tamper4EventCallback         : RTC篡改4事件回调。
00179     (+) Tamper5EventCallback         : RTC篡改5事件回调。
00180     (+) Tamper6EventCallback         : RTC篡改6事件回调。
00181     (+) Tamper7EventCallback         : RTC篡改7事件回调。
00183     (+) Tamper8EventCallback         : RTC篡改8事件回调。
00185     (+) InternalTamper1EventCallback : RTC内部篡改1事件回调。
00186     (+) InternalTamper2EventCallback : RTC内部篡改2事件回调。
00187     (+) InternalTamper3EventCallback : RTC内部篡改3事件回调。
00188     (+) InternalTamper4EventCallback : RTC内部篡改4事件回调。
00189     (+) InternalTamper5EventCallback : RTC内部篡改5事件回调。
00190     (+) InternalTamper6EventCallback : RTC内部篡改6事件回调。
00191     (+) InternalTamper8EventCallback : RTC内部篡改8事件回调。
00192 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
00193     (+) AlarmAEventCallback_S          : RTC闹钟A事件回调安全版本。
00194     (+) AlarmBEventCallback_S          : RTC闹钟B事件回调安全版本。
00195     (+) TimeStampEventCallback_S       : RTC时间戳事件回调安全版本。
00196     (+) WakeUpTimerEventCallback_S     : RTC唤醒定时器事件回调安全版本。
00197     (+) Tamper1EventCallback_S         : RTC篡改1事件回调安全版本。
00198     (+) Tamper2EventCallback_S         : RTC篡改2事件回调安全版本。
00199     (+) Tamper3EventCallback_S         : RTC篡改3事件回调安全版本。
00200     (+) Tamper4EventCallback_S         : RTC篡改4事件回调安全版本。
00201     (+) Tamper5EventCallback_S         : RTC篡改5事件回调安全版本。
00202     (+) Tamper6EventCallback_S         : RTC篡改6事件回调安全版本。
00203     (+) Tamper7EventCallback_S         : RTC篡改7事件回调安全版本。
00204     (+) Tamper8EventCallback_S         : RTC篡改8事件回调安全版本。
00205     (+) InternalTamper1EventCallback_S : RTC内部篡改1事件回调安全版本。
00206     (+) InternalTamper2EventCallback_S : RTC内部篡改2事件回调安全版本。
00207     (+) InternalTamper3EventCallback_S : RTC内部篡改3事件回调安全版本。
00208     (+) InternalTamper4EventCallback_S : RTC内部篡改4事件回调安全版本。
00209     (+) InternalTamper5EventCallback_S : RTC内部篡改5事件回调安全版本。
00210     (+) InternalTamper6EventCallback_S : RTC内部篡改6事件回调安全版本。
00211     (+) InternalTamper8EventCallback_S : RTC内部篡改8事件回调安全版本。
00212 #endif
00213     (+) MspInitCallback              : RTC MspInit回调。
00215     (+) MspDeInitCallback            : RTC MspDeInit回调。
00216 
00217   [..]
00218   默认情况下,在HAL_RTC_Init()之后且当状态为HAL_RTC_STATE_RESET时,
00219   所有回调都设置为对应的弱函数:
00220   例如AlarmAEventCallback()、TimeStampEventCallback()。
00221   例外情况是MspInit和MspDeInit回调,这些回调仅在这些回调为null时
00223   (即之前未注册)在HAL_RTC_Init()/HAL_RTC_DeInit()中重置为旧的弱函数。
00224   否则,如果MspInit或MspDeInit不为null,HAL_RTC_Init()/HAL_RTC_DeInit()
00225   将保留并使用用户注册的MspInit/MspDeInit回调
00226   (之前已注册)
00227 
00228   [..]
00229   回调只能在HAL_RTC_STATE_READY状态下注册/注销。
00230   例外情况是MspInit/MspDeInit可以在
00231   HAL_RTC_STATE_READY或HAL_RTC_STATE_RESET状态下注册/注销,
00232   因此注册的(用户)MspInit/DeInit回调可以在Init/DeInit期间使用。
00233   在这种情况下,首先使用HAL_RTC_RegisterCallback()注册MspInit/MspDeInit用户回调,
00234   然后再调用HAL_RTC_DeInit()
00235   或HAL_RTC_Init()函数。
00236 
00237   [..]
00239   当编译定义USE_HAL_RTC_REGISTER_CALLBACKS设置为0或
00241   未定义时,回调注册功能不可用