SPKT

Dependents:   WAV

Committer:
phungductung
Date:
Tue Jun 04 21:51:46 2019 +0000
Revision:
0:e87aa4c49e95
libray

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:e87aa4c49e95 1 /**
phungductung 0:e87aa4c49e95 2 ******************************************************************************
phungductung 0:e87aa4c49e95 3 * @file stm32f7xx_hal_rtc.c
phungductung 0:e87aa4c49e95 4 * @author MCD Application Team
phungductung 0:e87aa4c49e95 5 * @version V1.0.4
phungductung 0:e87aa4c49e95 6 * @date 09-December-2015
phungductung 0:e87aa4c49e95 7 * @brief RTC HAL module driver.
phungductung 0:e87aa4c49e95 8 * This file provides firmware functions to manage the following
phungductung 0:e87aa4c49e95 9 * functionalities of the Real Time Clock (RTC) peripheral:
phungductung 0:e87aa4c49e95 10 * + Initialization and de-initialization functions
phungductung 0:e87aa4c49e95 11 * + RTC Time and Date functions
phungductung 0:e87aa4c49e95 12 * + RTC Alarm functions
phungductung 0:e87aa4c49e95 13 * + Peripheral Control functions
phungductung 0:e87aa4c49e95 14 * + Peripheral State functions
phungductung 0:e87aa4c49e95 15 *
phungductung 0:e87aa4c49e95 16 @verbatim
phungductung 0:e87aa4c49e95 17 ==============================================================================
phungductung 0:e87aa4c49e95 18 ##### Backup Domain Operating Condition #####
phungductung 0:e87aa4c49e95 19 ==============================================================================
phungductung 0:e87aa4c49e95 20 [..] The real-time clock (RTC), the RTC backup registers, and the backup
phungductung 0:e87aa4c49e95 21 SRAM (BKP SRAM) can be powered from the VBAT voltage when the main
phungductung 0:e87aa4c49e95 22 VDD supply is powered off.
phungductung 0:e87aa4c49e95 23 To retain the content of the RTC backup registers, backup SRAM, and supply
phungductung 0:e87aa4c49e95 24 the RTC when VDD is turned off, VBAT pin can be connected to an optional
phungductung 0:e87aa4c49e95 25 standby voltage supplied by a battery or by another source.
phungductung 0:e87aa4c49e95 26
phungductung 0:e87aa4c49e95 27 [..] To allow the RTC operating even when the main digital supply (VDD) is turned
phungductung 0:e87aa4c49e95 28 off, the VBAT pin powers the following blocks:
phungductung 0:e87aa4c49e95 29 (#) The RTC
phungductung 0:e87aa4c49e95 30 (#) The LSE oscillator
phungductung 0:e87aa4c49e95 31 (#) The backup SRAM when the low power backup regulator is enabled
phungductung 0:e87aa4c49e95 32 (#) PC13 to PC15 I/Os, plus PI8 I/O (when available)
phungductung 0:e87aa4c49e95 33
phungductung 0:e87aa4c49e95 34 [..] When the backup domain is supplied by VDD (analog switch connected to VDD),
phungductung 0:e87aa4c49e95 35 the following pins are available:
phungductung 0:e87aa4c49e95 36 (#) PC14 and PC15 can be used as either GPIO or LSE pins
phungductung 0:e87aa4c49e95 37 (#) PC13 can be used as a GPIO or as the RTC_AF1 pin
phungductung 0:e87aa4c49e95 38 (#) PI8 can be used as a GPIO or as the RTC_AF2 pin
phungductung 0:e87aa4c49e95 39
phungductung 0:e87aa4c49e95 40 [..] When the backup domain is supplied by VBAT (analog switch connected to VBAT
phungductung 0:e87aa4c49e95 41 because VDD is not present), the following pins are available:
phungductung 0:e87aa4c49e95 42 (#) PC14 and PC15 can be used as LSE pins only
phungductung 0:e87aa4c49e95 43 (#) PC13 can be used as the RTC_AF1 pin
phungductung 0:e87aa4c49e95 44 (#) PI8 can be used as the RTC_AF2 pin
phungductung 0:e87aa4c49e95 45 (#) PC1 can be used as the RTC_AF3 pin
phungductung 0:e87aa4c49e95 46
phungductung 0:e87aa4c49e95 47 ##### Backup Domain Reset #####
phungductung 0:e87aa4c49e95 48 ==================================================================
phungductung 0:e87aa4c49e95 49 [..] The backup domain reset sets all RTC registers and the RCC_BDCR register
phungductung 0:e87aa4c49e95 50 to their reset values. The BKPSRAM is not affected by this reset. The only
phungductung 0:e87aa4c49e95 51 way to reset the BKPSRAM is through the Flash interface by requesting
phungductung 0:e87aa4c49e95 52 a protection level change from 1 to 0.
phungductung 0:e87aa4c49e95 53 [..] A backup domain reset is generated when one of the following events occurs:
phungductung 0:e87aa4c49e95 54 (#) Software reset, triggered by setting the BDRST bit in the
phungductung 0:e87aa4c49e95 55 RCC Backup domain control register (RCC_BDCR).
phungductung 0:e87aa4c49e95 56 (#) VDD or VBAT power on, if both supplies have previously been powered off.
phungductung 0:e87aa4c49e95 57
phungductung 0:e87aa4c49e95 58 ##### Backup Domain Access #####
phungductung 0:e87aa4c49e95 59 ==================================================================
phungductung 0:e87aa4c49e95 60 [..] After reset, the backup domain (RTC registers, RTC backup data
phungductung 0:e87aa4c49e95 61 registers and backup SRAM) is protected against possible unwanted write
phungductung 0:e87aa4c49e95 62 accesses.
phungductung 0:e87aa4c49e95 63 [..] To enable access to the RTC Domain and RTC registers, proceed as follows:
phungductung 0:e87aa4c49e95 64 (+) Enable the Power Controller (PWR) APB1 interface clock using the
phungductung 0:e87aa4c49e95 65 __HAL_RCC_PWR_CLK_ENABLE() function.
phungductung 0:e87aa4c49e95 66 (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function.
phungductung 0:e87aa4c49e95 67 (+) Select the RTC clock source using the __HAL_RCC_RTC_CONFIG() function.
phungductung 0:e87aa4c49e95 68 (+) Enable RTC Clock using the __HAL_RCC_RTC_ENABLE() function.
phungductung 0:e87aa4c49e95 69
phungductung 0:e87aa4c49e95 70
phungductung 0:e87aa4c49e95 71 ##### How to use this driver #####
phungductung 0:e87aa4c49e95 72 ==================================================================
phungductung 0:e87aa4c49e95 73 [..]
phungductung 0:e87aa4c49e95 74 (+) Enable the RTC domain access (see description in the section above).
phungductung 0:e87aa4c49e95 75 (+) Configure the RTC Prescaler (Asynchronous and Synchronous) and RTC hour
phungductung 0:e87aa4c49e95 76 format using the HAL_RTC_Init() function.
phungductung 0:e87aa4c49e95 77
phungductung 0:e87aa4c49e95 78 *** Time and Date configuration ***
phungductung 0:e87aa4c49e95 79 ===================================
phungductung 0:e87aa4c49e95 80 [..]
phungductung 0:e87aa4c49e95 81 (+) To configure the RTC Calendar (Time and Date) use the HAL_RTC_SetTime()
phungductung 0:e87aa4c49e95 82 and HAL_RTC_SetDate() functions.
phungductung 0:e87aa4c49e95 83 (+) To read the RTC Calendar, use the HAL_RTC_GetTime() and HAL_RTC_GetDate() functions.
phungductung 0:e87aa4c49e95 84
phungductung 0:e87aa4c49e95 85 *** Alarm configuration ***
phungductung 0:e87aa4c49e95 86 ===========================
phungductung 0:e87aa4c49e95 87 [..]
phungductung 0:e87aa4c49e95 88 (+) To configure the RTC Alarm use the HAL_RTC_SetAlarm() function.
phungductung 0:e87aa4c49e95 89 You can also configure the RTC Alarm with interrupt mode using the HAL_RTC_SetAlarm_IT() function.
phungductung 0:e87aa4c49e95 90 (+) To read the RTC Alarm, use the HAL_RTC_GetAlarm() function.
phungductung 0:e87aa4c49e95 91
phungductung 0:e87aa4c49e95 92 ##### RTC and low power modes #####
phungductung 0:e87aa4c49e95 93 ==================================================================
phungductung 0:e87aa4c49e95 94 [..] The MCU can be woken up from a low power mode by an RTC alternate
phungductung 0:e87aa4c49e95 95 function.
phungductung 0:e87aa4c49e95 96 [..] The RTC alternate functions are the RTC alarms (Alarm A and Alarm B),
phungductung 0:e87aa4c49e95 97 RTC wakeup, RTC tamper event detection and RTC time stamp event detection.
phungductung 0:e87aa4c49e95 98 These RTC alternate functions can wake up the system from the Stop and
phungductung 0:e87aa4c49e95 99 Standby low power modes.
phungductung 0:e87aa4c49e95 100 [..] The system can also wake up from low power modes without depending
phungductung 0:e87aa4c49e95 101 on an external interrupt (Auto-wakeup mode), by using the RTC alarm
phungductung 0:e87aa4c49e95 102 or the RTC wakeup events.
phungductung 0:e87aa4c49e95 103 [..] The RTC provides a programmable time base for waking up from the
phungductung 0:e87aa4c49e95 104 Stop or Standby mode at regular intervals.
phungductung 0:e87aa4c49e95 105 Wakeup from STOP and STANDBY modes is possible only when the RTC clock source
phungductung 0:e87aa4c49e95 106 is LSE or LSI.
phungductung 0:e87aa4c49e95 107
phungductung 0:e87aa4c49e95 108 @endverbatim
phungductung 0:e87aa4c49e95 109 ******************************************************************************
phungductung 0:e87aa4c49e95 110 * @attention
phungductung 0:e87aa4c49e95 111 *
phungductung 0:e87aa4c49e95 112 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
phungductung 0:e87aa4c49e95 113 *
phungductung 0:e87aa4c49e95 114 * Redistribution and use in source and binary forms, with or without modification,
phungductung 0:e87aa4c49e95 115 * are permitted provided that the following conditions are met:
phungductung 0:e87aa4c49e95 116 * 1. Redistributions of source code must retain the above copyright notice,
phungductung 0:e87aa4c49e95 117 * this list of conditions and the following disclaimer.
phungductung 0:e87aa4c49e95 118 * 2. Redistributions in binary form must reproduce the above copyright notice,
phungductung 0:e87aa4c49e95 119 * this list of conditions and the following disclaimer in the documentation
phungductung 0:e87aa4c49e95 120 * and/or other materials provided with the distribution.
phungductung 0:e87aa4c49e95 121 * 3. Neither the name of STMicroelectronics nor the names of its contributors
phungductung 0:e87aa4c49e95 122 * may be used to endorse or promote products derived from this software
phungductung 0:e87aa4c49e95 123 * without specific prior written permission.
phungductung 0:e87aa4c49e95 124 *
phungductung 0:e87aa4c49e95 125 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
phungductung 0:e87aa4c49e95 126 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
phungductung 0:e87aa4c49e95 127 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
phungductung 0:e87aa4c49e95 128 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
phungductung 0:e87aa4c49e95 129 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
phungductung 0:e87aa4c49e95 130 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
phungductung 0:e87aa4c49e95 131 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
phungductung 0:e87aa4c49e95 132 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
phungductung 0:e87aa4c49e95 133 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
phungductung 0:e87aa4c49e95 134 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
phungductung 0:e87aa4c49e95 135 *
phungductung 0:e87aa4c49e95 136 ******************************************************************************
phungductung 0:e87aa4c49e95 137 */
phungductung 0:e87aa4c49e95 138
phungductung 0:e87aa4c49e95 139 /* Includes ------------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 140 #include "stm32f7xx_hal.h"
phungductung 0:e87aa4c49e95 141
phungductung 0:e87aa4c49e95 142 /** @addtogroup STM32F7xx_HAL_Driver
phungductung 0:e87aa4c49e95 143 * @{
phungductung 0:e87aa4c49e95 144 */
phungductung 0:e87aa4c49e95 145
phungductung 0:e87aa4c49e95 146 /** @defgroup RTC RTC
phungductung 0:e87aa4c49e95 147 * @brief RTC HAL module driver
phungductung 0:e87aa4c49e95 148 * @{
phungductung 0:e87aa4c49e95 149 */
phungductung 0:e87aa4c49e95 150
phungductung 0:e87aa4c49e95 151 #ifdef HAL_RTC_MODULE_ENABLED
phungductung 0:e87aa4c49e95 152
phungductung 0:e87aa4c49e95 153 /* Private typedef -----------------------------------------------------------*/
phungductung 0:e87aa4c49e95 154 /* Private define ------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 155 /* Private macro -------------------------------------------------------------*/
phungductung 0:e87aa4c49e95 156 /* Private variables ---------------------------------------------------------*/
phungductung 0:e87aa4c49e95 157 /* Private function prototypes -----------------------------------------------*/
phungductung 0:e87aa4c49e95 158 /* Private functions ---------------------------------------------------------*/
phungductung 0:e87aa4c49e95 159
phungductung 0:e87aa4c49e95 160 /** @defgroup RTC_Exported_Functions RTC Exported Functions
phungductung 0:e87aa4c49e95 161 * @{
phungductung 0:e87aa4c49e95 162 */
phungductung 0:e87aa4c49e95 163
phungductung 0:e87aa4c49e95 164 /** @defgroup RTC_Group1 Initialization and de-initialization functions
phungductung 0:e87aa4c49e95 165 * @brief Initialization and Configuration functions
phungductung 0:e87aa4c49e95 166 *
phungductung 0:e87aa4c49e95 167 @verbatim
phungductung 0:e87aa4c49e95 168 ===============================================================================
phungductung 0:e87aa4c49e95 169 ##### Initialization and de-initialization functions #####
phungductung 0:e87aa4c49e95 170 ===============================================================================
phungductung 0:e87aa4c49e95 171 [..] This section provides functions allowing to initialize and configure the
phungductung 0:e87aa4c49e95 172 RTC Prescaler (Synchronous and Asynchronous), RTC Hour format, disable
phungductung 0:e87aa4c49e95 173 RTC registers Write protection, enter and exit the RTC initialization mode,
phungductung 0:e87aa4c49e95 174 RTC registers synchronization check and reference clock detection enable.
phungductung 0:e87aa4c49e95 175 (#) The RTC Prescaler is programmed to generate the RTC 1Hz time base.
phungductung 0:e87aa4c49e95 176 It is split into 2 programmable prescalers to minimize power consumption.
phungductung 0:e87aa4c49e95 177 (++) A 7-bit asynchronous prescaler and a 13-bit synchronous prescaler.
phungductung 0:e87aa4c49e95 178 (++) When both prescalers are used, it is recommended to configure the
phungductung 0:e87aa4c49e95 179 asynchronous prescaler to a high value to minimize power consumption.
phungductung 0:e87aa4c49e95 180 (#) All RTC registers are Write protected. Writing to the RTC registers
phungductung 0:e87aa4c49e95 181 is enabled by writing a key into the Write Protection register, RTC_WPR.
phungductung 0:e87aa4c49e95 182 (#) To configure the RTC Calendar, user application should enter
phungductung 0:e87aa4c49e95 183 initialization mode. In this mode, the calendar counter is stopped
phungductung 0:e87aa4c49e95 184 and its value can be updated. When the initialization sequence is
phungductung 0:e87aa4c49e95 185 complete, the calendar restarts counting after 4 RTCCLK cycles.
phungductung 0:e87aa4c49e95 186 (#) To read the calendar through the shadow registers after Calendar
phungductung 0:e87aa4c49e95 187 initialization, calendar update or after wakeup from low power modes
phungductung 0:e87aa4c49e95 188 the software must first clear the RSF flag. The software must then
phungductung 0:e87aa4c49e95 189 wait until it is set again before reading the calendar, which means
phungductung 0:e87aa4c49e95 190 that the calendar registers have been correctly copied into the
phungductung 0:e87aa4c49e95 191 RTC_TR and RTC_DR shadow registers.The HAL_RTC_WaitForSynchro() function
phungductung 0:e87aa4c49e95 192 implements the above software sequence (RSF clear and RSF check).
phungductung 0:e87aa4c49e95 193
phungductung 0:e87aa4c49e95 194 @endverbatim
phungductung 0:e87aa4c49e95 195 * @{
phungductung 0:e87aa4c49e95 196 */
phungductung 0:e87aa4c49e95 197
phungductung 0:e87aa4c49e95 198 /**
phungductung 0:e87aa4c49e95 199 * @brief Initializes the RTC peripheral
phungductung 0:e87aa4c49e95 200 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 201 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 202 * @retval HAL status
phungductung 0:e87aa4c49e95 203 */
phungductung 0:e87aa4c49e95 204 HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc)
phungductung 0:e87aa4c49e95 205 {
phungductung 0:e87aa4c49e95 206 /* Check the RTC peripheral state */
phungductung 0:e87aa4c49e95 207 if(hrtc == NULL)
phungductung 0:e87aa4c49e95 208 {
phungductung 0:e87aa4c49e95 209 return HAL_ERROR;
phungductung 0:e87aa4c49e95 210 }
phungductung 0:e87aa4c49e95 211
phungductung 0:e87aa4c49e95 212 /* Check the parameters */
phungductung 0:e87aa4c49e95 213 assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
phungductung 0:e87aa4c49e95 214 assert_param(IS_RTC_HOUR_FORMAT(hrtc->Init.HourFormat));
phungductung 0:e87aa4c49e95 215 assert_param(IS_RTC_ASYNCH_PREDIV(hrtc->Init.AsynchPrediv));
phungductung 0:e87aa4c49e95 216 assert_param(IS_RTC_SYNCH_PREDIV(hrtc->Init.SynchPrediv));
phungductung 0:e87aa4c49e95 217 assert_param (IS_RTC_OUTPUT(hrtc->Init.OutPut));
phungductung 0:e87aa4c49e95 218 assert_param (IS_RTC_OUTPUT_POL(hrtc->Init.OutPutPolarity));
phungductung 0:e87aa4c49e95 219 assert_param(IS_RTC_OUTPUT_TYPE(hrtc->Init.OutPutType));
phungductung 0:e87aa4c49e95 220
phungductung 0:e87aa4c49e95 221 if(hrtc->State == HAL_RTC_STATE_RESET)
phungductung 0:e87aa4c49e95 222 {
phungductung 0:e87aa4c49e95 223 /* Allocate lock resource and initialize it */
phungductung 0:e87aa4c49e95 224 hrtc->Lock = HAL_UNLOCKED;
phungductung 0:e87aa4c49e95 225 /* Initialize RTC MSP */
phungductung 0:e87aa4c49e95 226 HAL_RTC_MspInit(hrtc);
phungductung 0:e87aa4c49e95 227 }
phungductung 0:e87aa4c49e95 228
phungductung 0:e87aa4c49e95 229 /* Set RTC state */
phungductung 0:e87aa4c49e95 230 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 231
phungductung 0:e87aa4c49e95 232 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 233 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 234
phungductung 0:e87aa4c49e95 235 /* Set Initialization mode */
phungductung 0:e87aa4c49e95 236 if(RTC_EnterInitMode(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 237 {
phungductung 0:e87aa4c49e95 238 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 239 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 240
phungductung 0:e87aa4c49e95 241 /* Set RTC state */
phungductung 0:e87aa4c49e95 242 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 243
phungductung 0:e87aa4c49e95 244 return HAL_ERROR;
phungductung 0:e87aa4c49e95 245 }
phungductung 0:e87aa4c49e95 246 else
phungductung 0:e87aa4c49e95 247 {
phungductung 0:e87aa4c49e95 248 /* Clear RTC_CR FMT, OSEL and POL Bits */
phungductung 0:e87aa4c49e95 249 hrtc->Instance->CR &= ((uint32_t)~(RTC_CR_FMT | RTC_CR_OSEL | RTC_CR_POL));
phungductung 0:e87aa4c49e95 250 /* Set RTC_CR register */
phungductung 0:e87aa4c49e95 251 hrtc->Instance->CR |= (uint32_t)(hrtc->Init.HourFormat | hrtc->Init.OutPut | hrtc->Init.OutPutPolarity);
phungductung 0:e87aa4c49e95 252
phungductung 0:e87aa4c49e95 253 /* Configure the RTC PRER */
phungductung 0:e87aa4c49e95 254 hrtc->Instance->PRER = (uint32_t)(hrtc->Init.SynchPrediv);
phungductung 0:e87aa4c49e95 255 hrtc->Instance->PRER |= (uint32_t)(hrtc->Init.AsynchPrediv << 16);
phungductung 0:e87aa4c49e95 256
phungductung 0:e87aa4c49e95 257 /* Exit Initialization mode */
phungductung 0:e87aa4c49e95 258 hrtc->Instance->ISR &= (uint32_t)~RTC_ISR_INIT;
phungductung 0:e87aa4c49e95 259
phungductung 0:e87aa4c49e95 260 hrtc->Instance->OR &= (uint32_t)~RTC_OR_ALARMTYPE;
phungductung 0:e87aa4c49e95 261 hrtc->Instance->OR |= (uint32_t)(hrtc->Init.OutPutType);
phungductung 0:e87aa4c49e95 262
phungductung 0:e87aa4c49e95 263 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 264 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 265
phungductung 0:e87aa4c49e95 266 /* Set RTC state */
phungductung 0:e87aa4c49e95 267 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 268
phungductung 0:e87aa4c49e95 269 return HAL_OK;
phungductung 0:e87aa4c49e95 270 }
phungductung 0:e87aa4c49e95 271 }
phungductung 0:e87aa4c49e95 272
phungductung 0:e87aa4c49e95 273 /**
phungductung 0:e87aa4c49e95 274 * @brief DeInitializes the RTC peripheral
phungductung 0:e87aa4c49e95 275 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 276 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 277 * @note This function doesn't reset the RTC Backup Data registers.
phungductung 0:e87aa4c49e95 278 * @retval HAL status
phungductung 0:e87aa4c49e95 279 */
phungductung 0:e87aa4c49e95 280 HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc)
phungductung 0:e87aa4c49e95 281 {
phungductung 0:e87aa4c49e95 282 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 283
phungductung 0:e87aa4c49e95 284 /* Check the parameters */
phungductung 0:e87aa4c49e95 285 assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
phungductung 0:e87aa4c49e95 286
phungductung 0:e87aa4c49e95 287 /* Set RTC state */
phungductung 0:e87aa4c49e95 288 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 289
phungductung 0:e87aa4c49e95 290 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 291 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 292
phungductung 0:e87aa4c49e95 293 /* Set Initialization mode */
phungductung 0:e87aa4c49e95 294 if(RTC_EnterInitMode(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 295 {
phungductung 0:e87aa4c49e95 296 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 297 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 298
phungductung 0:e87aa4c49e95 299 /* Set RTC state */
phungductung 0:e87aa4c49e95 300 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 301
phungductung 0:e87aa4c49e95 302 return HAL_ERROR;
phungductung 0:e87aa4c49e95 303 }
phungductung 0:e87aa4c49e95 304 else
phungductung 0:e87aa4c49e95 305 {
phungductung 0:e87aa4c49e95 306 /* Reset TR, DR and CR registers */
phungductung 0:e87aa4c49e95 307 hrtc->Instance->TR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 308 hrtc->Instance->DR = (uint32_t)0x00002101;
phungductung 0:e87aa4c49e95 309 /* Reset All CR bits except CR[2:0] */
phungductung 0:e87aa4c49e95 310 hrtc->Instance->CR &= (uint32_t)0x00000007;
phungductung 0:e87aa4c49e95 311
phungductung 0:e87aa4c49e95 312 /* Get tick */
phungductung 0:e87aa4c49e95 313 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 314
phungductung 0:e87aa4c49e95 315 /* Wait till WUTWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 316 while(((hrtc->Instance->ISR) & RTC_ISR_WUTWF) == (uint32_t)RESET)
phungductung 0:e87aa4c49e95 317 {
phungductung 0:e87aa4c49e95 318 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 319 {
phungductung 0:e87aa4c49e95 320 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 321 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 322
phungductung 0:e87aa4c49e95 323 /* Set RTC state */
phungductung 0:e87aa4c49e95 324 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 325
phungductung 0:e87aa4c49e95 326 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 327 }
phungductung 0:e87aa4c49e95 328 }
phungductung 0:e87aa4c49e95 329
phungductung 0:e87aa4c49e95 330 /* Reset all RTC CR register bits */
phungductung 0:e87aa4c49e95 331 hrtc->Instance->CR &= (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 332 hrtc->Instance->WUTR = (uint32_t)0x0000FFFF;
phungductung 0:e87aa4c49e95 333 hrtc->Instance->PRER = (uint32_t)0x007F00FF;
phungductung 0:e87aa4c49e95 334 hrtc->Instance->ALRMAR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 335 hrtc->Instance->ALRMBR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 336 hrtc->Instance->SHIFTR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 337 hrtc->Instance->CALR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 338 hrtc->Instance->ALRMASSR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 339 hrtc->Instance->ALRMBSSR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 340
phungductung 0:e87aa4c49e95 341 /* Reset ISR register and exit initialization mode */
phungductung 0:e87aa4c49e95 342 hrtc->Instance->ISR = (uint32_t)0x00000000;
phungductung 0:e87aa4c49e95 343
phungductung 0:e87aa4c49e95 344 /* Reset Tamper and alternate functions configuration register */
phungductung 0:e87aa4c49e95 345 hrtc->Instance->TAMPCR = 0x00000000;
phungductung 0:e87aa4c49e95 346
phungductung 0:e87aa4c49e95 347 /* Reset Option register */
phungductung 0:e87aa4c49e95 348 hrtc->Instance->OR = 0x00000000;
phungductung 0:e87aa4c49e95 349
phungductung 0:e87aa4c49e95 350 /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
phungductung 0:e87aa4c49e95 351 if((hrtc->Instance->CR & RTC_CR_BYPSHAD) == RESET)
phungductung 0:e87aa4c49e95 352 {
phungductung 0:e87aa4c49e95 353 if(HAL_RTC_WaitForSynchro(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 354 {
phungductung 0:e87aa4c49e95 355 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 356 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 357
phungductung 0:e87aa4c49e95 358 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 359
phungductung 0:e87aa4c49e95 360 return HAL_ERROR;
phungductung 0:e87aa4c49e95 361 }
phungductung 0:e87aa4c49e95 362 }
phungductung 0:e87aa4c49e95 363 }
phungductung 0:e87aa4c49e95 364
phungductung 0:e87aa4c49e95 365 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 366 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 367
phungductung 0:e87aa4c49e95 368 /* De-Initialize RTC MSP */
phungductung 0:e87aa4c49e95 369 HAL_RTC_MspDeInit(hrtc);
phungductung 0:e87aa4c49e95 370
phungductung 0:e87aa4c49e95 371 hrtc->State = HAL_RTC_STATE_RESET;
phungductung 0:e87aa4c49e95 372
phungductung 0:e87aa4c49e95 373 /* Release Lock */
phungductung 0:e87aa4c49e95 374 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 375
phungductung 0:e87aa4c49e95 376 return HAL_OK;
phungductung 0:e87aa4c49e95 377 }
phungductung 0:e87aa4c49e95 378
phungductung 0:e87aa4c49e95 379 /**
phungductung 0:e87aa4c49e95 380 * @brief Initializes the RTC MSP.
phungductung 0:e87aa4c49e95 381 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 382 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 383 * @retval None
phungductung 0:e87aa4c49e95 384 */
phungductung 0:e87aa4c49e95 385 __weak void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 386 {
phungductung 0:e87aa4c49e95 387 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 388 UNUSED(hrtc);
phungductung 0:e87aa4c49e95 389
phungductung 0:e87aa4c49e95 390 /* NOTE : This function Should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 391 the HAL_RTC_MspInit could be implemented in the user file
phungductung 0:e87aa4c49e95 392 */
phungductung 0:e87aa4c49e95 393 }
phungductung 0:e87aa4c49e95 394
phungductung 0:e87aa4c49e95 395 /**
phungductung 0:e87aa4c49e95 396 * @brief DeInitializes the RTC MSP.
phungductung 0:e87aa4c49e95 397 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 398 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 399 * @retval None
phungductung 0:e87aa4c49e95 400 */
phungductung 0:e87aa4c49e95 401 __weak void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 402 {
phungductung 0:e87aa4c49e95 403 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 404 UNUSED(hrtc);
phungductung 0:e87aa4c49e95 405
phungductung 0:e87aa4c49e95 406 /* NOTE : This function Should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 407 the HAL_RTC_MspDeInit could be implemented in the user file
phungductung 0:e87aa4c49e95 408 */
phungductung 0:e87aa4c49e95 409 }
phungductung 0:e87aa4c49e95 410
phungductung 0:e87aa4c49e95 411 /**
phungductung 0:e87aa4c49e95 412 * @}
phungductung 0:e87aa4c49e95 413 */
phungductung 0:e87aa4c49e95 414
phungductung 0:e87aa4c49e95 415 /** @defgroup RTC_Group2 RTC Time and Date functions
phungductung 0:e87aa4c49e95 416 * @brief RTC Time and Date functions
phungductung 0:e87aa4c49e95 417 *
phungductung 0:e87aa4c49e95 418 @verbatim
phungductung 0:e87aa4c49e95 419 ===============================================================================
phungductung 0:e87aa4c49e95 420 ##### RTC Time and Date functions #####
phungductung 0:e87aa4c49e95 421 ===============================================================================
phungductung 0:e87aa4c49e95 422
phungductung 0:e87aa4c49e95 423 [..] This section provides functions allowing to configure Time and Date features
phungductung 0:e87aa4c49e95 424
phungductung 0:e87aa4c49e95 425 @endverbatim
phungductung 0:e87aa4c49e95 426 * @{
phungductung 0:e87aa4c49e95 427 */
phungductung 0:e87aa4c49e95 428
phungductung 0:e87aa4c49e95 429 /**
phungductung 0:e87aa4c49e95 430 * @brief Sets RTC current time.
phungductung 0:e87aa4c49e95 431 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 432 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 433 * @param sTime: Pointer to Time structure
phungductung 0:e87aa4c49e95 434 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 435 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 436 * @arg FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 437 * @arg FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 438 * @retval HAL status
phungductung 0:e87aa4c49e95 439 */
phungductung 0:e87aa4c49e95 440 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
phungductung 0:e87aa4c49e95 441 {
phungductung 0:e87aa4c49e95 442 uint32_t tmpreg = 0;
phungductung 0:e87aa4c49e95 443
phungductung 0:e87aa4c49e95 444 /* Check the parameters */
phungductung 0:e87aa4c49e95 445 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 446 assert_param(IS_RTC_DAYLIGHT_SAVING(sTime->DayLightSaving));
phungductung 0:e87aa4c49e95 447 assert_param(IS_RTC_STORE_OPERATION(sTime->StoreOperation));
phungductung 0:e87aa4c49e95 448
phungductung 0:e87aa4c49e95 449 /* Process Locked */
phungductung 0:e87aa4c49e95 450 __HAL_LOCK(hrtc);
phungductung 0:e87aa4c49e95 451
phungductung 0:e87aa4c49e95 452 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 453
phungductung 0:e87aa4c49e95 454 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 455 {
phungductung 0:e87aa4c49e95 456 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 457 {
phungductung 0:e87aa4c49e95 458 assert_param(IS_RTC_HOUR12(sTime->Hours));
phungductung 0:e87aa4c49e95 459 assert_param(IS_RTC_HOURFORMAT12(sTime->TimeFormat));
phungductung 0:e87aa4c49e95 460 }
phungductung 0:e87aa4c49e95 461 else
phungductung 0:e87aa4c49e95 462 {
phungductung 0:e87aa4c49e95 463 sTime->TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 464 assert_param(IS_RTC_HOUR24(sTime->Hours));
phungductung 0:e87aa4c49e95 465 }
phungductung 0:e87aa4c49e95 466 assert_param(IS_RTC_MINUTES(sTime->Minutes));
phungductung 0:e87aa4c49e95 467 assert_param(IS_RTC_SECONDS(sTime->Seconds));
phungductung 0:e87aa4c49e95 468
phungductung 0:e87aa4c49e95 469 tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(sTime->Hours) << 16) | \
phungductung 0:e87aa4c49e95 470 ((uint32_t)RTC_ByteToBcd2(sTime->Minutes) << 8) | \
phungductung 0:e87aa4c49e95 471 ((uint32_t)RTC_ByteToBcd2(sTime->Seconds)) | \
phungductung 0:e87aa4c49e95 472 (((uint32_t)sTime->TimeFormat) << 16));
phungductung 0:e87aa4c49e95 473 }
phungductung 0:e87aa4c49e95 474 else
phungductung 0:e87aa4c49e95 475 {
phungductung 0:e87aa4c49e95 476 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 477 {
phungductung 0:e87aa4c49e95 478 tmpreg = RTC_Bcd2ToByte(sTime->Hours);
phungductung 0:e87aa4c49e95 479 assert_param(IS_RTC_HOUR12(tmpreg));
phungductung 0:e87aa4c49e95 480 assert_param(IS_RTC_HOURFORMAT12(sTime->TimeFormat));
phungductung 0:e87aa4c49e95 481 }
phungductung 0:e87aa4c49e95 482 else
phungductung 0:e87aa4c49e95 483 {
phungductung 0:e87aa4c49e95 484 sTime->TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 485 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sTime->Hours)));
phungductung 0:e87aa4c49e95 486 }
phungductung 0:e87aa4c49e95 487 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sTime->Minutes)));
phungductung 0:e87aa4c49e95 488 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sTime->Seconds)));
phungductung 0:e87aa4c49e95 489 tmpreg = (((uint32_t)(sTime->Hours) << 16) | \
phungductung 0:e87aa4c49e95 490 ((uint32_t)(sTime->Minutes) << 8) | \
phungductung 0:e87aa4c49e95 491 ((uint32_t)sTime->Seconds) | \
phungductung 0:e87aa4c49e95 492 ((uint32_t)(sTime->TimeFormat) << 16));
phungductung 0:e87aa4c49e95 493 }
phungductung 0:e87aa4c49e95 494
phungductung 0:e87aa4c49e95 495 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 496 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 497
phungductung 0:e87aa4c49e95 498 /* Set Initialization mode */
phungductung 0:e87aa4c49e95 499 if(RTC_EnterInitMode(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 500 {
phungductung 0:e87aa4c49e95 501 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 502 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 503
phungductung 0:e87aa4c49e95 504 /* Set RTC state */
phungductung 0:e87aa4c49e95 505 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 506
phungductung 0:e87aa4c49e95 507 /* Process Unlocked */
phungductung 0:e87aa4c49e95 508 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 509
phungductung 0:e87aa4c49e95 510 return HAL_ERROR;
phungductung 0:e87aa4c49e95 511 }
phungductung 0:e87aa4c49e95 512 else
phungductung 0:e87aa4c49e95 513 {
phungductung 0:e87aa4c49e95 514 /* Set the RTC_TR register */
phungductung 0:e87aa4c49e95 515 hrtc->Instance->TR = (uint32_t)(tmpreg & RTC_TR_RESERVED_MASK);
phungductung 0:e87aa4c49e95 516
phungductung 0:e87aa4c49e95 517 /* Clear the bits to be configured */
phungductung 0:e87aa4c49e95 518 hrtc->Instance->CR &= (uint32_t)~RTC_CR_BCK;
phungductung 0:e87aa4c49e95 519
phungductung 0:e87aa4c49e95 520 /* Configure the RTC_CR register */
phungductung 0:e87aa4c49e95 521 hrtc->Instance->CR |= (uint32_t)(sTime->DayLightSaving | sTime->StoreOperation);
phungductung 0:e87aa4c49e95 522
phungductung 0:e87aa4c49e95 523 /* Exit Initialization mode */
phungductung 0:e87aa4c49e95 524 hrtc->Instance->ISR &= (uint32_t)~RTC_ISR_INIT;
phungductung 0:e87aa4c49e95 525
phungductung 0:e87aa4c49e95 526 /* If CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
phungductung 0:e87aa4c49e95 527 if((hrtc->Instance->CR & RTC_CR_BYPSHAD) == RESET)
phungductung 0:e87aa4c49e95 528 {
phungductung 0:e87aa4c49e95 529 if(HAL_RTC_WaitForSynchro(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 530 {
phungductung 0:e87aa4c49e95 531 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 532 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 533
phungductung 0:e87aa4c49e95 534 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 535
phungductung 0:e87aa4c49e95 536 /* Process Unlocked */
phungductung 0:e87aa4c49e95 537 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 538
phungductung 0:e87aa4c49e95 539 return HAL_ERROR;
phungductung 0:e87aa4c49e95 540 }
phungductung 0:e87aa4c49e95 541 }
phungductung 0:e87aa4c49e95 542
phungductung 0:e87aa4c49e95 543 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 544 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 545
phungductung 0:e87aa4c49e95 546 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 547
phungductung 0:e87aa4c49e95 548 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 549
phungductung 0:e87aa4c49e95 550 return HAL_OK;
phungductung 0:e87aa4c49e95 551 }
phungductung 0:e87aa4c49e95 552 }
phungductung 0:e87aa4c49e95 553
phungductung 0:e87aa4c49e95 554 /**
phungductung 0:e87aa4c49e95 555 * @brief Gets RTC current time.
phungductung 0:e87aa4c49e95 556 * @param hrtc: RTC handle
phungductung 0:e87aa4c49e95 557 * @param sTime: Pointer to Time structure with Hours, Minutes and Seconds fields returned
phungductung 0:e87aa4c49e95 558 * with input format (BIN or BCD), also SubSeconds field returning the
phungductung 0:e87aa4c49e95 559 * RTC_SSR register content and SecondFraction field the Synchronous pre-scaler
phungductung 0:e87aa4c49e95 560 * factor to be used for second fraction ratio computation.
phungductung 0:e87aa4c49e95 561 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 562 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 563 * @arg RTC_FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 564 * @arg RTC_FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 565 * @note You can use SubSeconds and SecondFraction (sTime structure fields returned) to convert SubSeconds
phungductung 0:e87aa4c49e95 566 * value in second fraction ratio with time unit following generic formula:
phungductung 0:e87aa4c49e95 567 * Second fraction ratio * time_unit= [(SecondFraction-SubSeconds)/(SecondFraction+1)] * time_unit
phungductung 0:e87aa4c49e95 568 * This conversion can be performed only if no shift operation is pending (ie. SHFP=0) when PREDIV_S >= SS
phungductung 0:e87aa4c49e95 569 * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
phungductung 0:e87aa4c49e95 570 * in the higher-order calendar shadow registers to ensure consistency between the time and date values.
phungductung 0:e87aa4c49e95 571 * Reading RTC current time locks the values in calendar shadow registers until Current date is read
phungductung 0:e87aa4c49e95 572 * to ensure consistency between the time and date values.
phungductung 0:e87aa4c49e95 573 * @retval HAL status
phungductung 0:e87aa4c49e95 574 */
phungductung 0:e87aa4c49e95 575 HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
phungductung 0:e87aa4c49e95 576 {
phungductung 0:e87aa4c49e95 577 uint32_t tmpreg = 0;
phungductung 0:e87aa4c49e95 578
phungductung 0:e87aa4c49e95 579 /* Check the parameters */
phungductung 0:e87aa4c49e95 580 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 581
phungductung 0:e87aa4c49e95 582 /* Get subseconds values from the correspondent registers*/
phungductung 0:e87aa4c49e95 583 sTime->SubSeconds = (uint32_t)(hrtc->Instance->SSR);
phungductung 0:e87aa4c49e95 584
phungductung 0:e87aa4c49e95 585 /* Get the TR register */
phungductung 0:e87aa4c49e95 586 tmpreg = (uint32_t)(hrtc->Instance->TR & RTC_TR_RESERVED_MASK);
phungductung 0:e87aa4c49e95 587
phungductung 0:e87aa4c49e95 588 /* Fill the structure fields with the read parameters */
phungductung 0:e87aa4c49e95 589 sTime->Hours = (uint8_t)((tmpreg & (RTC_TR_HT | RTC_TR_HU)) >> 16);
phungductung 0:e87aa4c49e95 590 sTime->Minutes = (uint8_t)((tmpreg & (RTC_TR_MNT | RTC_TR_MNU)) >>8);
phungductung 0:e87aa4c49e95 591 sTime->Seconds = (uint8_t)(tmpreg & (RTC_TR_ST | RTC_TR_SU));
phungductung 0:e87aa4c49e95 592 sTime->TimeFormat = (uint8_t)((tmpreg & (RTC_TR_PM)) >> 16);
phungductung 0:e87aa4c49e95 593
phungductung 0:e87aa4c49e95 594 /* Check the input parameters format */
phungductung 0:e87aa4c49e95 595 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 596 {
phungductung 0:e87aa4c49e95 597 /* Convert the time structure parameters to Binary format */
phungductung 0:e87aa4c49e95 598 sTime->Hours = (uint8_t)RTC_Bcd2ToByte(sTime->Hours);
phungductung 0:e87aa4c49e95 599 sTime->Minutes = (uint8_t)RTC_Bcd2ToByte(sTime->Minutes);
phungductung 0:e87aa4c49e95 600 sTime->Seconds = (uint8_t)RTC_Bcd2ToByte(sTime->Seconds);
phungductung 0:e87aa4c49e95 601 }
phungductung 0:e87aa4c49e95 602
phungductung 0:e87aa4c49e95 603 return HAL_OK;
phungductung 0:e87aa4c49e95 604 }
phungductung 0:e87aa4c49e95 605
phungductung 0:e87aa4c49e95 606 /**
phungductung 0:e87aa4c49e95 607 * @brief Sets RTC current date.
phungductung 0:e87aa4c49e95 608 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 609 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 610 * @param sDate: Pointer to date structure
phungductung 0:e87aa4c49e95 611 * @param Format: specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 612 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 613 * @arg RTC_FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 614 * @arg RTC_FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 615 * @retval HAL status
phungductung 0:e87aa4c49e95 616 */
phungductung 0:e87aa4c49e95 617 HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
phungductung 0:e87aa4c49e95 618 {
phungductung 0:e87aa4c49e95 619 uint32_t datetmpreg = 0;
phungductung 0:e87aa4c49e95 620
phungductung 0:e87aa4c49e95 621 /* Check the parameters */
phungductung 0:e87aa4c49e95 622 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 623
phungductung 0:e87aa4c49e95 624 /* Process Locked */
phungductung 0:e87aa4c49e95 625 __HAL_LOCK(hrtc);
phungductung 0:e87aa4c49e95 626
phungductung 0:e87aa4c49e95 627 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 628
phungductung 0:e87aa4c49e95 629 if((Format == RTC_FORMAT_BIN) && ((sDate->Month & 0x10) == 0x10))
phungductung 0:e87aa4c49e95 630 {
phungductung 0:e87aa4c49e95 631 sDate->Month = (uint8_t)((sDate->Month & (uint8_t)~(0x10)) + (uint8_t)0x0A);
phungductung 0:e87aa4c49e95 632 }
phungductung 0:e87aa4c49e95 633
phungductung 0:e87aa4c49e95 634 assert_param(IS_RTC_WEEKDAY(sDate->WeekDay));
phungductung 0:e87aa4c49e95 635
phungductung 0:e87aa4c49e95 636 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 637 {
phungductung 0:e87aa4c49e95 638 assert_param(IS_RTC_YEAR(sDate->Year));
phungductung 0:e87aa4c49e95 639 assert_param(IS_RTC_MONTH(sDate->Month));
phungductung 0:e87aa4c49e95 640 assert_param(IS_RTC_DATE(sDate->Date));
phungductung 0:e87aa4c49e95 641
phungductung 0:e87aa4c49e95 642 datetmpreg = (((uint32_t)RTC_ByteToBcd2(sDate->Year) << 16) | \
phungductung 0:e87aa4c49e95 643 ((uint32_t)RTC_ByteToBcd2(sDate->Month) << 8) | \
phungductung 0:e87aa4c49e95 644 ((uint32_t)RTC_ByteToBcd2(sDate->Date)) | \
phungductung 0:e87aa4c49e95 645 ((uint32_t)sDate->WeekDay << 13));
phungductung 0:e87aa4c49e95 646 }
phungductung 0:e87aa4c49e95 647 else
phungductung 0:e87aa4c49e95 648 {
phungductung 0:e87aa4c49e95 649 assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
phungductung 0:e87aa4c49e95 650 datetmpreg = RTC_Bcd2ToByte(sDate->Month);
phungductung 0:e87aa4c49e95 651 assert_param(IS_RTC_MONTH(datetmpreg));
phungductung 0:e87aa4c49e95 652 datetmpreg = RTC_Bcd2ToByte(sDate->Date);
phungductung 0:e87aa4c49e95 653 assert_param(IS_RTC_DATE(datetmpreg));
phungductung 0:e87aa4c49e95 654
phungductung 0:e87aa4c49e95 655 datetmpreg = ((((uint32_t)sDate->Year) << 16) | \
phungductung 0:e87aa4c49e95 656 (((uint32_t)sDate->Month) << 8) | \
phungductung 0:e87aa4c49e95 657 ((uint32_t)sDate->Date) | \
phungductung 0:e87aa4c49e95 658 (((uint32_t)sDate->WeekDay) << 13));
phungductung 0:e87aa4c49e95 659 }
phungductung 0:e87aa4c49e95 660
phungductung 0:e87aa4c49e95 661 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 662 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 663
phungductung 0:e87aa4c49e95 664 /* Set Initialization mode */
phungductung 0:e87aa4c49e95 665 if(RTC_EnterInitMode(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 666 {
phungductung 0:e87aa4c49e95 667 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 668 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 669
phungductung 0:e87aa4c49e95 670 /* Set RTC state*/
phungductung 0:e87aa4c49e95 671 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 672
phungductung 0:e87aa4c49e95 673 /* Process Unlocked */
phungductung 0:e87aa4c49e95 674 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 675
phungductung 0:e87aa4c49e95 676 return HAL_ERROR;
phungductung 0:e87aa4c49e95 677 }
phungductung 0:e87aa4c49e95 678 else
phungductung 0:e87aa4c49e95 679 {
phungductung 0:e87aa4c49e95 680 /* Set the RTC_DR register */
phungductung 0:e87aa4c49e95 681 hrtc->Instance->DR = (uint32_t)(datetmpreg & RTC_DR_RESERVED_MASK);
phungductung 0:e87aa4c49e95 682
phungductung 0:e87aa4c49e95 683 /* Exit Initialization mode */
phungductung 0:e87aa4c49e95 684 hrtc->Instance->ISR &= (uint32_t)~RTC_ISR_INIT;
phungductung 0:e87aa4c49e95 685
phungductung 0:e87aa4c49e95 686 /* If CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
phungductung 0:e87aa4c49e95 687 if((hrtc->Instance->CR & RTC_CR_BYPSHAD) == RESET)
phungductung 0:e87aa4c49e95 688 {
phungductung 0:e87aa4c49e95 689 if(HAL_RTC_WaitForSynchro(hrtc) != HAL_OK)
phungductung 0:e87aa4c49e95 690 {
phungductung 0:e87aa4c49e95 691 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 692 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 693
phungductung 0:e87aa4c49e95 694 hrtc->State = HAL_RTC_STATE_ERROR;
phungductung 0:e87aa4c49e95 695
phungductung 0:e87aa4c49e95 696 /* Process Unlocked */
phungductung 0:e87aa4c49e95 697 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 698
phungductung 0:e87aa4c49e95 699 return HAL_ERROR;
phungductung 0:e87aa4c49e95 700 }
phungductung 0:e87aa4c49e95 701 }
phungductung 0:e87aa4c49e95 702
phungductung 0:e87aa4c49e95 703 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 704 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 705
phungductung 0:e87aa4c49e95 706 hrtc->State = HAL_RTC_STATE_READY ;
phungductung 0:e87aa4c49e95 707
phungductung 0:e87aa4c49e95 708 /* Process Unlocked */
phungductung 0:e87aa4c49e95 709 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 710
phungductung 0:e87aa4c49e95 711 return HAL_OK;
phungductung 0:e87aa4c49e95 712 }
phungductung 0:e87aa4c49e95 713 }
phungductung 0:e87aa4c49e95 714
phungductung 0:e87aa4c49e95 715 /**
phungductung 0:e87aa4c49e95 716 * @brief Gets RTC current date.
phungductung 0:e87aa4c49e95 717 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 718 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 719 * @param sDate: Pointer to Date structure
phungductung 0:e87aa4c49e95 720 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 721 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 722 * @arg RTC_FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 723 * @arg RTC_FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 724 * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values
phungductung 0:e87aa4c49e95 725 * in the higher-order calendar shadow registers to ensure consistency between the time and date values.
phungductung 0:e87aa4c49e95 726 * Reading RTC current time locks the values in calendar shadow registers until Current date is read.
phungductung 0:e87aa4c49e95 727 * @retval HAL status
phungductung 0:e87aa4c49e95 728 */
phungductung 0:e87aa4c49e95 729 HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
phungductung 0:e87aa4c49e95 730 {
phungductung 0:e87aa4c49e95 731 uint32_t datetmpreg = 0;
phungductung 0:e87aa4c49e95 732
phungductung 0:e87aa4c49e95 733 /* Check the parameters */
phungductung 0:e87aa4c49e95 734 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 735
phungductung 0:e87aa4c49e95 736 /* Get the DR register */
phungductung 0:e87aa4c49e95 737 datetmpreg = (uint32_t)(hrtc->Instance->DR & RTC_DR_RESERVED_MASK);
phungductung 0:e87aa4c49e95 738
phungductung 0:e87aa4c49e95 739 /* Fill the structure fields with the read parameters */
phungductung 0:e87aa4c49e95 740 sDate->Year = (uint8_t)((datetmpreg & (RTC_DR_YT | RTC_DR_YU)) >> 16);
phungductung 0:e87aa4c49e95 741 sDate->Month = (uint8_t)((datetmpreg & (RTC_DR_MT | RTC_DR_MU)) >> 8);
phungductung 0:e87aa4c49e95 742 sDate->Date = (uint8_t)(datetmpreg & (RTC_DR_DT | RTC_DR_DU));
phungductung 0:e87aa4c49e95 743 sDate->WeekDay = (uint8_t)((datetmpreg & (RTC_DR_WDU)) >> 13);
phungductung 0:e87aa4c49e95 744
phungductung 0:e87aa4c49e95 745 /* Check the input parameters format */
phungductung 0:e87aa4c49e95 746 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 747 {
phungductung 0:e87aa4c49e95 748 /* Convert the date structure parameters to Binary format */
phungductung 0:e87aa4c49e95 749 sDate->Year = (uint8_t)RTC_Bcd2ToByte(sDate->Year);
phungductung 0:e87aa4c49e95 750 sDate->Month = (uint8_t)RTC_Bcd2ToByte(sDate->Month);
phungductung 0:e87aa4c49e95 751 sDate->Date = (uint8_t)RTC_Bcd2ToByte(sDate->Date);
phungductung 0:e87aa4c49e95 752 }
phungductung 0:e87aa4c49e95 753 return HAL_OK;
phungductung 0:e87aa4c49e95 754 }
phungductung 0:e87aa4c49e95 755
phungductung 0:e87aa4c49e95 756 /**
phungductung 0:e87aa4c49e95 757 * @}
phungductung 0:e87aa4c49e95 758 */
phungductung 0:e87aa4c49e95 759
phungductung 0:e87aa4c49e95 760 /** @defgroup RTC_Group3 RTC Alarm functions
phungductung 0:e87aa4c49e95 761 * @brief RTC Alarm functions
phungductung 0:e87aa4c49e95 762 *
phungductung 0:e87aa4c49e95 763 @verbatim
phungductung 0:e87aa4c49e95 764 ===============================================================================
phungductung 0:e87aa4c49e95 765 ##### RTC Alarm functions #####
phungductung 0:e87aa4c49e95 766 ===============================================================================
phungductung 0:e87aa4c49e95 767
phungductung 0:e87aa4c49e95 768 [..] This section provides functions allowing to configure Alarm feature
phungductung 0:e87aa4c49e95 769
phungductung 0:e87aa4c49e95 770 @endverbatim
phungductung 0:e87aa4c49e95 771 * @{
phungductung 0:e87aa4c49e95 772 */
phungductung 0:e87aa4c49e95 773 /**
phungductung 0:e87aa4c49e95 774 * @brief Sets the specified RTC Alarm.
phungductung 0:e87aa4c49e95 775 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 776 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 777 * @param sAlarm: Pointer to Alarm structure
phungductung 0:e87aa4c49e95 778 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 779 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 780 * @arg FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 781 * @arg FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 782 * @retval HAL status
phungductung 0:e87aa4c49e95 783 */
phungductung 0:e87aa4c49e95 784 HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
phungductung 0:e87aa4c49e95 785 {
phungductung 0:e87aa4c49e95 786 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 787 uint32_t tmpreg = 0, subsecondtmpreg = 0;
phungductung 0:e87aa4c49e95 788
phungductung 0:e87aa4c49e95 789 /* Check the parameters */
phungductung 0:e87aa4c49e95 790 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 791 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
phungductung 0:e87aa4c49e95 792 assert_param(IS_RTC_ALARM_MASK(sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 793 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(sAlarm->AlarmDateWeekDaySel));
phungductung 0:e87aa4c49e95 794 assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(sAlarm->AlarmTime.SubSeconds));
phungductung 0:e87aa4c49e95 795 assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(sAlarm->AlarmSubSecondMask));
phungductung 0:e87aa4c49e95 796
phungductung 0:e87aa4c49e95 797 /* Process Locked */
phungductung 0:e87aa4c49e95 798 __HAL_LOCK(hrtc);
phungductung 0:e87aa4c49e95 799
phungductung 0:e87aa4c49e95 800 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 801
phungductung 0:e87aa4c49e95 802 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 803 {
phungductung 0:e87aa4c49e95 804 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 805 {
phungductung 0:e87aa4c49e95 806 assert_param(IS_RTC_HOUR12(sAlarm->AlarmTime.Hours));
phungductung 0:e87aa4c49e95 807 assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat));
phungductung 0:e87aa4c49e95 808 }
phungductung 0:e87aa4c49e95 809 else
phungductung 0:e87aa4c49e95 810 {
phungductung 0:e87aa4c49e95 811 sAlarm->AlarmTime.TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 812 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
phungductung 0:e87aa4c49e95 813 }
phungductung 0:e87aa4c49e95 814 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
phungductung 0:e87aa4c49e95 815 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
phungductung 0:e87aa4c49e95 816
phungductung 0:e87aa4c49e95 817 if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE)
phungductung 0:e87aa4c49e95 818 {
phungductung 0:e87aa4c49e95 819 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(sAlarm->AlarmDateWeekDay));
phungductung 0:e87aa4c49e95 820 }
phungductung 0:e87aa4c49e95 821 else
phungductung 0:e87aa4c49e95 822 {
phungductung 0:e87aa4c49e95 823 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(sAlarm->AlarmDateWeekDay));
phungductung 0:e87aa4c49e95 824 }
phungductung 0:e87aa4c49e95 825
phungductung 0:e87aa4c49e95 826 tmpreg = (((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Hours) << 16) | \
phungductung 0:e87aa4c49e95 827 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes) << 8) | \
phungductung 0:e87aa4c49e95 828 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds)) | \
phungductung 0:e87aa4c49e95 829 ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << 16) | \
phungductung 0:e87aa4c49e95 830 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmDateWeekDay) << 24) | \
phungductung 0:e87aa4c49e95 831 ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \
phungductung 0:e87aa4c49e95 832 ((uint32_t)sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 833 }
phungductung 0:e87aa4c49e95 834 else
phungductung 0:e87aa4c49e95 835 {
phungductung 0:e87aa4c49e95 836 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 837 {
phungductung 0:e87aa4c49e95 838 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours);
phungductung 0:e87aa4c49e95 839 assert_param(IS_RTC_HOUR12(tmpreg));
phungductung 0:e87aa4c49e95 840 assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat));
phungductung 0:e87aa4c49e95 841 }
phungductung 0:e87aa4c49e95 842 else
phungductung 0:e87aa4c49e95 843 {
phungductung 0:e87aa4c49e95 844 sAlarm->AlarmTime.TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 845 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
phungductung 0:e87aa4c49e95 846 }
phungductung 0:e87aa4c49e95 847
phungductung 0:e87aa4c49e95 848 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
phungductung 0:e87aa4c49e95 849 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
phungductung 0:e87aa4c49e95 850
phungductung 0:e87aa4c49e95 851 if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE)
phungductung 0:e87aa4c49e95 852 {
phungductung 0:e87aa4c49e95 853 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay);
phungductung 0:e87aa4c49e95 854 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(tmpreg));
phungductung 0:e87aa4c49e95 855 }
phungductung 0:e87aa4c49e95 856 else
phungductung 0:e87aa4c49e95 857 {
phungductung 0:e87aa4c49e95 858 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay);
phungductung 0:e87aa4c49e95 859 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(tmpreg));
phungductung 0:e87aa4c49e95 860 }
phungductung 0:e87aa4c49e95 861
phungductung 0:e87aa4c49e95 862 tmpreg = (((uint32_t)(sAlarm->AlarmTime.Hours) << 16) | \
phungductung 0:e87aa4c49e95 863 ((uint32_t)(sAlarm->AlarmTime.Minutes) << 8) | \
phungductung 0:e87aa4c49e95 864 ((uint32_t) sAlarm->AlarmTime.Seconds) | \
phungductung 0:e87aa4c49e95 865 ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << 16) | \
phungductung 0:e87aa4c49e95 866 ((uint32_t)(sAlarm->AlarmDateWeekDay) << 24) | \
phungductung 0:e87aa4c49e95 867 ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \
phungductung 0:e87aa4c49e95 868 ((uint32_t)sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 869 }
phungductung 0:e87aa4c49e95 870
phungductung 0:e87aa4c49e95 871 /* Configure the Alarm A or Alarm B Sub Second registers */
phungductung 0:e87aa4c49e95 872 subsecondtmpreg = (uint32_t)((uint32_t)(sAlarm->AlarmTime.SubSeconds) | (uint32_t)(sAlarm->AlarmSubSecondMask));
phungductung 0:e87aa4c49e95 873
phungductung 0:e87aa4c49e95 874 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 875 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 876
phungductung 0:e87aa4c49e95 877 /* Configure the Alarm register */
phungductung 0:e87aa4c49e95 878 if(sAlarm->Alarm == RTC_ALARM_A)
phungductung 0:e87aa4c49e95 879 {
phungductung 0:e87aa4c49e95 880 /* Disable the Alarm A interrupt */
phungductung 0:e87aa4c49e95 881 __HAL_RTC_ALARMA_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 882
phungductung 0:e87aa4c49e95 883 /* In case of interrupt mode is used, the interrupt source must disabled */
phungductung 0:e87aa4c49e95 884 __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA);
phungductung 0:e87aa4c49e95 885
phungductung 0:e87aa4c49e95 886 /* Get tick */
phungductung 0:e87aa4c49e95 887 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 888
phungductung 0:e87aa4c49e95 889 /* Wait till RTC ALRAWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 890 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == RESET)
phungductung 0:e87aa4c49e95 891 {
phungductung 0:e87aa4c49e95 892 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 893 {
phungductung 0:e87aa4c49e95 894 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 895 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 896
phungductung 0:e87aa4c49e95 897 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 898
phungductung 0:e87aa4c49e95 899 /* Process Unlocked */
phungductung 0:e87aa4c49e95 900 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 901
phungductung 0:e87aa4c49e95 902 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 903 }
phungductung 0:e87aa4c49e95 904 }
phungductung 0:e87aa4c49e95 905
phungductung 0:e87aa4c49e95 906 hrtc->Instance->ALRMAR = (uint32_t)tmpreg;
phungductung 0:e87aa4c49e95 907 /* Configure the Alarm A Sub Second register */
phungductung 0:e87aa4c49e95 908 hrtc->Instance->ALRMASSR = subsecondtmpreg;
phungductung 0:e87aa4c49e95 909 /* Configure the Alarm state: Enable Alarm */
phungductung 0:e87aa4c49e95 910 __HAL_RTC_ALARMA_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 911 }
phungductung 0:e87aa4c49e95 912 else
phungductung 0:e87aa4c49e95 913 {
phungductung 0:e87aa4c49e95 914 /* Disable the Alarm B interrupt */
phungductung 0:e87aa4c49e95 915 __HAL_RTC_ALARMB_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 916
phungductung 0:e87aa4c49e95 917 /* In case of interrupt mode is used, the interrupt source must disabled */
phungductung 0:e87aa4c49e95 918 __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRB);
phungductung 0:e87aa4c49e95 919
phungductung 0:e87aa4c49e95 920 /* Get tick */
phungductung 0:e87aa4c49e95 921 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 922
phungductung 0:e87aa4c49e95 923 /* Wait till RTC ALRBWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 924 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == RESET)
phungductung 0:e87aa4c49e95 925 {
phungductung 0:e87aa4c49e95 926 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 927 {
phungductung 0:e87aa4c49e95 928 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 929 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 930
phungductung 0:e87aa4c49e95 931 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 932
phungductung 0:e87aa4c49e95 933 /* Process Unlocked */
phungductung 0:e87aa4c49e95 934 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 935
phungductung 0:e87aa4c49e95 936 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 937 }
phungductung 0:e87aa4c49e95 938 }
phungductung 0:e87aa4c49e95 939
phungductung 0:e87aa4c49e95 940 hrtc->Instance->ALRMBR = (uint32_t)tmpreg;
phungductung 0:e87aa4c49e95 941 /* Configure the Alarm B Sub Second register */
phungductung 0:e87aa4c49e95 942 hrtc->Instance->ALRMBSSR = subsecondtmpreg;
phungductung 0:e87aa4c49e95 943 /* Configure the Alarm state: Enable Alarm */
phungductung 0:e87aa4c49e95 944 __HAL_RTC_ALARMB_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 945 }
phungductung 0:e87aa4c49e95 946
phungductung 0:e87aa4c49e95 947 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 948 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 949
phungductung 0:e87aa4c49e95 950 /* Change RTC state */
phungductung 0:e87aa4c49e95 951 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 952
phungductung 0:e87aa4c49e95 953 /* Process Unlocked */
phungductung 0:e87aa4c49e95 954 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 955
phungductung 0:e87aa4c49e95 956 return HAL_OK;
phungductung 0:e87aa4c49e95 957 }
phungductung 0:e87aa4c49e95 958
phungductung 0:e87aa4c49e95 959 /**
phungductung 0:e87aa4c49e95 960 * @brief Sets the specified RTC Alarm with Interrupt
phungductung 0:e87aa4c49e95 961 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 962 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 963 * @param sAlarm: Pointer to Alarm structure
phungductung 0:e87aa4c49e95 964 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 965 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 966 * @arg FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 967 * @arg FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 968 * @note The Alarm register can only be written when the corresponding Alarm
phungductung 0:e87aa4c49e95 969 * is disabled (Use the HAL_RTC_DeactivateAlarm()).
phungductung 0:e87aa4c49e95 970 * @note The HAL_RTC_SetTime() must be called before enabling the Alarm feature.
phungductung 0:e87aa4c49e95 971 * @retval HAL status
phungductung 0:e87aa4c49e95 972 */
phungductung 0:e87aa4c49e95 973 HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
phungductung 0:e87aa4c49e95 974 {
phungductung 0:e87aa4c49e95 975 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 976 uint32_t tmpreg = 0, subsecondtmpreg = 0;
phungductung 0:e87aa4c49e95 977
phungductung 0:e87aa4c49e95 978 /* Check the parameters */
phungductung 0:e87aa4c49e95 979 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 980 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
phungductung 0:e87aa4c49e95 981 assert_param(IS_RTC_ALARM_MASK(sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 982 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_SEL(sAlarm->AlarmDateWeekDaySel));
phungductung 0:e87aa4c49e95 983 assert_param(IS_RTC_ALARM_SUB_SECOND_VALUE(sAlarm->AlarmTime.SubSeconds));
phungductung 0:e87aa4c49e95 984 assert_param(IS_RTC_ALARM_SUB_SECOND_MASK(sAlarm->AlarmSubSecondMask));
phungductung 0:e87aa4c49e95 985
phungductung 0:e87aa4c49e95 986 /* Process Locked */
phungductung 0:e87aa4c49e95 987 __HAL_LOCK(hrtc);
phungductung 0:e87aa4c49e95 988
phungductung 0:e87aa4c49e95 989 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 990
phungductung 0:e87aa4c49e95 991 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 992 {
phungductung 0:e87aa4c49e95 993 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 994 {
phungductung 0:e87aa4c49e95 995 assert_param(IS_RTC_HOUR12(sAlarm->AlarmTime.Hours));
phungductung 0:e87aa4c49e95 996 assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat));
phungductung 0:e87aa4c49e95 997 }
phungductung 0:e87aa4c49e95 998 else
phungductung 0:e87aa4c49e95 999 {
phungductung 0:e87aa4c49e95 1000 sAlarm->AlarmTime.TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 1001 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
phungductung 0:e87aa4c49e95 1002 }
phungductung 0:e87aa4c49e95 1003 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
phungductung 0:e87aa4c49e95 1004 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
phungductung 0:e87aa4c49e95 1005
phungductung 0:e87aa4c49e95 1006 if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE)
phungductung 0:e87aa4c49e95 1007 {
phungductung 0:e87aa4c49e95 1008 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(sAlarm->AlarmDateWeekDay));
phungductung 0:e87aa4c49e95 1009 }
phungductung 0:e87aa4c49e95 1010 else
phungductung 0:e87aa4c49e95 1011 {
phungductung 0:e87aa4c49e95 1012 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(sAlarm->AlarmDateWeekDay));
phungductung 0:e87aa4c49e95 1013 }
phungductung 0:e87aa4c49e95 1014 tmpreg = (((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Hours) << 16) | \
phungductung 0:e87aa4c49e95 1015 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes) << 8) | \
phungductung 0:e87aa4c49e95 1016 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds)) | \
phungductung 0:e87aa4c49e95 1017 ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << 16) | \
phungductung 0:e87aa4c49e95 1018 ((uint32_t)RTC_ByteToBcd2(sAlarm->AlarmDateWeekDay) << 24) | \
phungductung 0:e87aa4c49e95 1019 ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \
phungductung 0:e87aa4c49e95 1020 ((uint32_t)sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 1021 }
phungductung 0:e87aa4c49e95 1022 else
phungductung 0:e87aa4c49e95 1023 {
phungductung 0:e87aa4c49e95 1024 if((hrtc->Instance->CR & RTC_CR_FMT) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1025 {
phungductung 0:e87aa4c49e95 1026 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours);
phungductung 0:e87aa4c49e95 1027 assert_param(IS_RTC_HOUR12(tmpreg));
phungductung 0:e87aa4c49e95 1028 assert_param(IS_RTC_HOURFORMAT12(sAlarm->AlarmTime.TimeFormat));
phungductung 0:e87aa4c49e95 1029 }
phungductung 0:e87aa4c49e95 1030 else
phungductung 0:e87aa4c49e95 1031 {
phungductung 0:e87aa4c49e95 1032 sAlarm->AlarmTime.TimeFormat = 0x00;
phungductung 0:e87aa4c49e95 1033 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
phungductung 0:e87aa4c49e95 1034 }
phungductung 0:e87aa4c49e95 1035
phungductung 0:e87aa4c49e95 1036 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
phungductung 0:e87aa4c49e95 1037 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
phungductung 0:e87aa4c49e95 1038
phungductung 0:e87aa4c49e95 1039 if(sAlarm->AlarmDateWeekDaySel == RTC_ALARMDATEWEEKDAYSEL_DATE)
phungductung 0:e87aa4c49e95 1040 {
phungductung 0:e87aa4c49e95 1041 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay);
phungductung 0:e87aa4c49e95 1042 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_DATE(tmpreg));
phungductung 0:e87aa4c49e95 1043 }
phungductung 0:e87aa4c49e95 1044 else
phungductung 0:e87aa4c49e95 1045 {
phungductung 0:e87aa4c49e95 1046 tmpreg = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay);
phungductung 0:e87aa4c49e95 1047 assert_param(IS_RTC_ALARM_DATE_WEEKDAY_WEEKDAY(tmpreg));
phungductung 0:e87aa4c49e95 1048 }
phungductung 0:e87aa4c49e95 1049 tmpreg = (((uint32_t)(sAlarm->AlarmTime.Hours) << 16) | \
phungductung 0:e87aa4c49e95 1050 ((uint32_t)(sAlarm->AlarmTime.Minutes) << 8) | \
phungductung 0:e87aa4c49e95 1051 ((uint32_t) sAlarm->AlarmTime.Seconds) | \
phungductung 0:e87aa4c49e95 1052 ((uint32_t)(sAlarm->AlarmTime.TimeFormat) << 16) | \
phungductung 0:e87aa4c49e95 1053 ((uint32_t)(sAlarm->AlarmDateWeekDay) << 24) | \
phungductung 0:e87aa4c49e95 1054 ((uint32_t)sAlarm->AlarmDateWeekDaySel) | \
phungductung 0:e87aa4c49e95 1055 ((uint32_t)sAlarm->AlarmMask));
phungductung 0:e87aa4c49e95 1056 }
phungductung 0:e87aa4c49e95 1057 /* Configure the Alarm A or Alarm B Sub Second registers */
phungductung 0:e87aa4c49e95 1058 subsecondtmpreg = (uint32_t)((uint32_t)(sAlarm->AlarmTime.SubSeconds) | (uint32_t)(sAlarm->AlarmSubSecondMask));
phungductung 0:e87aa4c49e95 1059
phungductung 0:e87aa4c49e95 1060 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1061 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1062
phungductung 0:e87aa4c49e95 1063 /* Configure the Alarm register */
phungductung 0:e87aa4c49e95 1064 if(sAlarm->Alarm == RTC_ALARM_A)
phungductung 0:e87aa4c49e95 1065 {
phungductung 0:e87aa4c49e95 1066 /* Disable the Alarm A interrupt */
phungductung 0:e87aa4c49e95 1067 __HAL_RTC_ALARMA_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1068
phungductung 0:e87aa4c49e95 1069 /* Clear flag alarm A */
phungductung 0:e87aa4c49e95 1070 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
phungductung 0:e87aa4c49e95 1071
phungductung 0:e87aa4c49e95 1072 /* Get tick */
phungductung 0:e87aa4c49e95 1073 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1074
phungductung 0:e87aa4c49e95 1075 /* Wait till RTC ALRAWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 1076 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == RESET)
phungductung 0:e87aa4c49e95 1077 {
phungductung 0:e87aa4c49e95 1078 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1079 {
phungductung 0:e87aa4c49e95 1080 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1081 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1082
phungductung 0:e87aa4c49e95 1083 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 1084
phungductung 0:e87aa4c49e95 1085 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1086 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1087
phungductung 0:e87aa4c49e95 1088 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1089 }
phungductung 0:e87aa4c49e95 1090 }
phungductung 0:e87aa4c49e95 1091
phungductung 0:e87aa4c49e95 1092 hrtc->Instance->ALRMAR = (uint32_t)tmpreg;
phungductung 0:e87aa4c49e95 1093 /* Configure the Alarm A Sub Second register */
phungductung 0:e87aa4c49e95 1094 hrtc->Instance->ALRMASSR = subsecondtmpreg;
phungductung 0:e87aa4c49e95 1095 /* Configure the Alarm state: Enable Alarm */
phungductung 0:e87aa4c49e95 1096 __HAL_RTC_ALARMA_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1097 /* Configure the Alarm interrupt */
phungductung 0:e87aa4c49e95 1098 __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA);
phungductung 0:e87aa4c49e95 1099 }
phungductung 0:e87aa4c49e95 1100 else
phungductung 0:e87aa4c49e95 1101 {
phungductung 0:e87aa4c49e95 1102 /* Disable the Alarm B interrupt */
phungductung 0:e87aa4c49e95 1103 __HAL_RTC_ALARMB_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1104
phungductung 0:e87aa4c49e95 1105 /* Clear flag alarm B */
phungductung 0:e87aa4c49e95 1106 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRBF);
phungductung 0:e87aa4c49e95 1107
phungductung 0:e87aa4c49e95 1108 /* Get tick */
phungductung 0:e87aa4c49e95 1109 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1110
phungductung 0:e87aa4c49e95 1111 /* Wait till RTC ALRBWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 1112 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == RESET)
phungductung 0:e87aa4c49e95 1113 {
phungductung 0:e87aa4c49e95 1114 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1115 {
phungductung 0:e87aa4c49e95 1116 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1117 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1118
phungductung 0:e87aa4c49e95 1119 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 1120
phungductung 0:e87aa4c49e95 1121 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1122 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1123
phungductung 0:e87aa4c49e95 1124 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1125 }
phungductung 0:e87aa4c49e95 1126 }
phungductung 0:e87aa4c49e95 1127
phungductung 0:e87aa4c49e95 1128 hrtc->Instance->ALRMBR = (uint32_t)tmpreg;
phungductung 0:e87aa4c49e95 1129 /* Configure the Alarm B Sub Second register */
phungductung 0:e87aa4c49e95 1130 hrtc->Instance->ALRMBSSR = subsecondtmpreg;
phungductung 0:e87aa4c49e95 1131 /* Configure the Alarm state: Enable Alarm */
phungductung 0:e87aa4c49e95 1132 __HAL_RTC_ALARMB_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1133 /* Configure the Alarm interrupt */
phungductung 0:e87aa4c49e95 1134 __HAL_RTC_ALARM_ENABLE_IT(hrtc, RTC_IT_ALRB);
phungductung 0:e87aa4c49e95 1135 }
phungductung 0:e87aa4c49e95 1136
phungductung 0:e87aa4c49e95 1137 /* RTC Alarm Interrupt Configuration: EXTI configuration */
phungductung 0:e87aa4c49e95 1138 __HAL_RTC_ALARM_EXTI_ENABLE_IT();
phungductung 0:e87aa4c49e95 1139
phungductung 0:e87aa4c49e95 1140 EXTI->RTSR |= RTC_EXTI_LINE_ALARM_EVENT;
phungductung 0:e87aa4c49e95 1141
phungductung 0:e87aa4c49e95 1142 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1143 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1144
phungductung 0:e87aa4c49e95 1145 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 1146
phungductung 0:e87aa4c49e95 1147 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1148 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1149
phungductung 0:e87aa4c49e95 1150 return HAL_OK;
phungductung 0:e87aa4c49e95 1151 }
phungductung 0:e87aa4c49e95 1152
phungductung 0:e87aa4c49e95 1153 /**
phungductung 0:e87aa4c49e95 1154 * @brief Deactive the specified RTC Alarm
phungductung 0:e87aa4c49e95 1155 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1156 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1157 * @param Alarm: Specifies the Alarm.
phungductung 0:e87aa4c49e95 1158 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 1159 * @arg RTC_ALARM_A: AlarmA
phungductung 0:e87aa4c49e95 1160 * @arg RTC_ALARM_B: AlarmB
phungductung 0:e87aa4c49e95 1161 * @retval HAL status
phungductung 0:e87aa4c49e95 1162 */
phungductung 0:e87aa4c49e95 1163 HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm)
phungductung 0:e87aa4c49e95 1164 {
phungductung 0:e87aa4c49e95 1165 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 1166
phungductung 0:e87aa4c49e95 1167 /* Check the parameters */
phungductung 0:e87aa4c49e95 1168 assert_param(IS_RTC_ALARM(Alarm));
phungductung 0:e87aa4c49e95 1169
phungductung 0:e87aa4c49e95 1170 /* Process Locked */
phungductung 0:e87aa4c49e95 1171 __HAL_LOCK(hrtc);
phungductung 0:e87aa4c49e95 1172
phungductung 0:e87aa4c49e95 1173 hrtc->State = HAL_RTC_STATE_BUSY;
phungductung 0:e87aa4c49e95 1174
phungductung 0:e87aa4c49e95 1175 /* Disable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1176 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1177
phungductung 0:e87aa4c49e95 1178 if(Alarm == RTC_ALARM_A)
phungductung 0:e87aa4c49e95 1179 {
phungductung 0:e87aa4c49e95 1180 /* AlarmA */
phungductung 0:e87aa4c49e95 1181 __HAL_RTC_ALARMA_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1182
phungductung 0:e87aa4c49e95 1183 /* In case of interrupt mode is used, the interrupt source must disabled */
phungductung 0:e87aa4c49e95 1184 __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA);
phungductung 0:e87aa4c49e95 1185
phungductung 0:e87aa4c49e95 1186 /* Get tick */
phungductung 0:e87aa4c49e95 1187 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1188
phungductung 0:e87aa4c49e95 1189 /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 1190 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAWF) == RESET)
phungductung 0:e87aa4c49e95 1191 {
phungductung 0:e87aa4c49e95 1192 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1193 {
phungductung 0:e87aa4c49e95 1194 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1195 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1196
phungductung 0:e87aa4c49e95 1197 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 1198
phungductung 0:e87aa4c49e95 1199 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1200 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1201
phungductung 0:e87aa4c49e95 1202 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1203 }
phungductung 0:e87aa4c49e95 1204 }
phungductung 0:e87aa4c49e95 1205 }
phungductung 0:e87aa4c49e95 1206 else
phungductung 0:e87aa4c49e95 1207 {
phungductung 0:e87aa4c49e95 1208 /* AlarmB */
phungductung 0:e87aa4c49e95 1209 __HAL_RTC_ALARMB_DISABLE(hrtc);
phungductung 0:e87aa4c49e95 1210
phungductung 0:e87aa4c49e95 1211 /* In case of interrupt mode is used, the interrupt source must disabled */
phungductung 0:e87aa4c49e95 1212 __HAL_RTC_ALARM_DISABLE_IT(hrtc,RTC_IT_ALRB);
phungductung 0:e87aa4c49e95 1213
phungductung 0:e87aa4c49e95 1214 /* Get tick */
phungductung 0:e87aa4c49e95 1215 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1216
phungductung 0:e87aa4c49e95 1217 /* Wait till RTC ALRxWF flag is set and if Time out is reached exit */
phungductung 0:e87aa4c49e95 1218 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRBWF) == RESET)
phungductung 0:e87aa4c49e95 1219 {
phungductung 0:e87aa4c49e95 1220 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1221 {
phungductung 0:e87aa4c49e95 1222 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1223 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1224
phungductung 0:e87aa4c49e95 1225 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 1226
phungductung 0:e87aa4c49e95 1227 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1228 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1229
phungductung 0:e87aa4c49e95 1230 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1231 }
phungductung 0:e87aa4c49e95 1232 }
phungductung 0:e87aa4c49e95 1233 }
phungductung 0:e87aa4c49e95 1234 /* Enable the write protection for RTC registers */
phungductung 0:e87aa4c49e95 1235 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
phungductung 0:e87aa4c49e95 1236
phungductung 0:e87aa4c49e95 1237 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 1238
phungductung 0:e87aa4c49e95 1239 /* Process Unlocked */
phungductung 0:e87aa4c49e95 1240 __HAL_UNLOCK(hrtc);
phungductung 0:e87aa4c49e95 1241
phungductung 0:e87aa4c49e95 1242 return HAL_OK;
phungductung 0:e87aa4c49e95 1243 }
phungductung 0:e87aa4c49e95 1244
phungductung 0:e87aa4c49e95 1245 /**
phungductung 0:e87aa4c49e95 1246 * @brief Gets the RTC Alarm value and masks.
phungductung 0:e87aa4c49e95 1247 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1248 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1249 * @param sAlarm: Pointer to Date structure
phungductung 0:e87aa4c49e95 1250 * @param Alarm: Specifies the Alarm.
phungductung 0:e87aa4c49e95 1251 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 1252 * @arg RTC_ALARM_A: AlarmA
phungductung 0:e87aa4c49e95 1253 * @arg RTC_ALARM_B: AlarmB
phungductung 0:e87aa4c49e95 1254 * @param Format: Specifies the format of the entered parameters.
phungductung 0:e87aa4c49e95 1255 * This parameter can be one of the following values:
phungductung 0:e87aa4c49e95 1256 * @arg RTC_FORMAT_BIN: Binary data format
phungductung 0:e87aa4c49e95 1257 * @arg RTC_FORMAT_BCD: BCD data format
phungductung 0:e87aa4c49e95 1258 * @retval HAL status
phungductung 0:e87aa4c49e95 1259 */
phungductung 0:e87aa4c49e95 1260 HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format)
phungductung 0:e87aa4c49e95 1261 {
phungductung 0:e87aa4c49e95 1262 uint32_t tmpreg = 0, subsecondtmpreg = 0;
phungductung 0:e87aa4c49e95 1263
phungductung 0:e87aa4c49e95 1264 /* Check the parameters */
phungductung 0:e87aa4c49e95 1265 assert_param(IS_RTC_FORMAT(Format));
phungductung 0:e87aa4c49e95 1266 assert_param(IS_RTC_ALARM(Alarm));
phungductung 0:e87aa4c49e95 1267
phungductung 0:e87aa4c49e95 1268 if(Alarm == RTC_ALARM_A)
phungductung 0:e87aa4c49e95 1269 {
phungductung 0:e87aa4c49e95 1270 /* AlarmA */
phungductung 0:e87aa4c49e95 1271 sAlarm->Alarm = RTC_ALARM_A;
phungductung 0:e87aa4c49e95 1272
phungductung 0:e87aa4c49e95 1273 tmpreg = (uint32_t)(hrtc->Instance->ALRMAR);
phungductung 0:e87aa4c49e95 1274 subsecondtmpreg = (uint32_t)((hrtc->Instance->ALRMASSR ) & RTC_ALRMASSR_SS);
phungductung 0:e87aa4c49e95 1275 }
phungductung 0:e87aa4c49e95 1276 else
phungductung 0:e87aa4c49e95 1277 {
phungductung 0:e87aa4c49e95 1278 sAlarm->Alarm = RTC_ALARM_B;
phungductung 0:e87aa4c49e95 1279
phungductung 0:e87aa4c49e95 1280 tmpreg = (uint32_t)(hrtc->Instance->ALRMBR);
phungductung 0:e87aa4c49e95 1281 subsecondtmpreg = (uint32_t)((hrtc->Instance->ALRMBSSR) & RTC_ALRMBSSR_SS);
phungductung 0:e87aa4c49e95 1282 }
phungductung 0:e87aa4c49e95 1283
phungductung 0:e87aa4c49e95 1284 /* Fill the structure with the read parameters */
phungductung 0:e87aa4c49e95 1285 sAlarm->AlarmTime.Hours = (uint32_t)((tmpreg & (RTC_ALRMAR_HT | RTC_ALRMAR_HU)) >> 16);
phungductung 0:e87aa4c49e95 1286 sAlarm->AlarmTime.Minutes = (uint32_t)((tmpreg & (RTC_ALRMAR_MNT | RTC_ALRMAR_MNU)) >> 8);
phungductung 0:e87aa4c49e95 1287 sAlarm->AlarmTime.Seconds = (uint32_t)(tmpreg & (RTC_ALRMAR_ST | RTC_ALRMAR_SU));
phungductung 0:e87aa4c49e95 1288 sAlarm->AlarmTime.TimeFormat = (uint32_t)((tmpreg & RTC_ALRMAR_PM) >> 16);
phungductung 0:e87aa4c49e95 1289 sAlarm->AlarmTime.SubSeconds = (uint32_t) subsecondtmpreg;
phungductung 0:e87aa4c49e95 1290 sAlarm->AlarmDateWeekDay = (uint32_t)((tmpreg & (RTC_ALRMAR_DT | RTC_ALRMAR_DU)) >> 24);
phungductung 0:e87aa4c49e95 1291 sAlarm->AlarmDateWeekDaySel = (uint32_t)(tmpreg & RTC_ALRMAR_WDSEL);
phungductung 0:e87aa4c49e95 1292 sAlarm->AlarmMask = (uint32_t)(tmpreg & RTC_ALARMMASK_ALL);
phungductung 0:e87aa4c49e95 1293
phungductung 0:e87aa4c49e95 1294 if(Format == RTC_FORMAT_BIN)
phungductung 0:e87aa4c49e95 1295 {
phungductung 0:e87aa4c49e95 1296 sAlarm->AlarmTime.Hours = RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours);
phungductung 0:e87aa4c49e95 1297 sAlarm->AlarmTime.Minutes = RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes);
phungductung 0:e87aa4c49e95 1298 sAlarm->AlarmTime.Seconds = RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds);
phungductung 0:e87aa4c49e95 1299 sAlarm->AlarmDateWeekDay = RTC_Bcd2ToByte(sAlarm->AlarmDateWeekDay);
phungductung 0:e87aa4c49e95 1300 }
phungductung 0:e87aa4c49e95 1301
phungductung 0:e87aa4c49e95 1302 return HAL_OK;
phungductung 0:e87aa4c49e95 1303 }
phungductung 0:e87aa4c49e95 1304
phungductung 0:e87aa4c49e95 1305 /**
phungductung 0:e87aa4c49e95 1306 * @brief This function handles Alarm interrupt request.
phungductung 0:e87aa4c49e95 1307 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1308 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1309 * @retval None
phungductung 0:e87aa4c49e95 1310 */
phungductung 0:e87aa4c49e95 1311 void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 1312 {
phungductung 0:e87aa4c49e95 1313 if(__HAL_RTC_ALARM_GET_IT(hrtc, RTC_IT_ALRA))
phungductung 0:e87aa4c49e95 1314 {
phungductung 0:e87aa4c49e95 1315 /* Get the status of the Interrupt */
phungductung 0:e87aa4c49e95 1316 if((uint32_t)(hrtc->Instance->CR & RTC_IT_ALRA) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1317 {
phungductung 0:e87aa4c49e95 1318 /* AlarmA callback */
phungductung 0:e87aa4c49e95 1319 HAL_RTC_AlarmAEventCallback(hrtc);
phungductung 0:e87aa4c49e95 1320
phungductung 0:e87aa4c49e95 1321 /* Clear the Alarm interrupt pending bit */
phungductung 0:e87aa4c49e95 1322 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc,RTC_FLAG_ALRAF);
phungductung 0:e87aa4c49e95 1323 }
phungductung 0:e87aa4c49e95 1324 }
phungductung 0:e87aa4c49e95 1325
phungductung 0:e87aa4c49e95 1326 if(__HAL_RTC_ALARM_GET_IT(hrtc, RTC_IT_ALRB))
phungductung 0:e87aa4c49e95 1327 {
phungductung 0:e87aa4c49e95 1328 /* Get the status of the Interrupt */
phungductung 0:e87aa4c49e95 1329 if((uint32_t)(hrtc->Instance->CR & RTC_IT_ALRB) != (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1330 {
phungductung 0:e87aa4c49e95 1331 /* AlarmB callback */
phungductung 0:e87aa4c49e95 1332 HAL_RTCEx_AlarmBEventCallback(hrtc);
phungductung 0:e87aa4c49e95 1333
phungductung 0:e87aa4c49e95 1334 /* Clear the Alarm interrupt pending bit */
phungductung 0:e87aa4c49e95 1335 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc,RTC_FLAG_ALRBF);
phungductung 0:e87aa4c49e95 1336 }
phungductung 0:e87aa4c49e95 1337 }
phungductung 0:e87aa4c49e95 1338
phungductung 0:e87aa4c49e95 1339 /* Clear the EXTI's line Flag for RTC Alarm */
phungductung 0:e87aa4c49e95 1340 __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();
phungductung 0:e87aa4c49e95 1341
phungductung 0:e87aa4c49e95 1342 /* Change RTC state */
phungductung 0:e87aa4c49e95 1343 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 1344 }
phungductung 0:e87aa4c49e95 1345
phungductung 0:e87aa4c49e95 1346 /**
phungductung 0:e87aa4c49e95 1347 * @brief Alarm A callback.
phungductung 0:e87aa4c49e95 1348 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1349 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1350 * @retval None
phungductung 0:e87aa4c49e95 1351 */
phungductung 0:e87aa4c49e95 1352 __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
phungductung 0:e87aa4c49e95 1353 {
phungductung 0:e87aa4c49e95 1354 /* Prevent unused argument(s) compilation warning */
phungductung 0:e87aa4c49e95 1355 UNUSED(hrtc);
phungductung 0:e87aa4c49e95 1356
phungductung 0:e87aa4c49e95 1357 /* NOTE : This function Should not be modified, when the callback is needed,
phungductung 0:e87aa4c49e95 1358 the HAL_RTC_AlarmAEventCallback could be implemented in the user file
phungductung 0:e87aa4c49e95 1359 */
phungductung 0:e87aa4c49e95 1360 }
phungductung 0:e87aa4c49e95 1361
phungductung 0:e87aa4c49e95 1362 /**
phungductung 0:e87aa4c49e95 1363 * @brief This function handles AlarmA Polling request.
phungductung 0:e87aa4c49e95 1364 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1365 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1366 * @param Timeout: Timeout duration
phungductung 0:e87aa4c49e95 1367 * @retval HAL status
phungductung 0:e87aa4c49e95 1368 */
phungductung 0:e87aa4c49e95 1369 HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
phungductung 0:e87aa4c49e95 1370 {
phungductung 0:e87aa4c49e95 1371 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 1372
phungductung 0:e87aa4c49e95 1373 /* Get tick */
phungductung 0:e87aa4c49e95 1374 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1375
phungductung 0:e87aa4c49e95 1376 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) == RESET)
phungductung 0:e87aa4c49e95 1377 {
phungductung 0:e87aa4c49e95 1378 if(Timeout != HAL_MAX_DELAY)
phungductung 0:e87aa4c49e95 1379 {
phungductung 0:e87aa4c49e95 1380 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
phungductung 0:e87aa4c49e95 1381 {
phungductung 0:e87aa4c49e95 1382 hrtc->State = HAL_RTC_STATE_TIMEOUT;
phungductung 0:e87aa4c49e95 1383 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1384 }
phungductung 0:e87aa4c49e95 1385 }
phungductung 0:e87aa4c49e95 1386 }
phungductung 0:e87aa4c49e95 1387
phungductung 0:e87aa4c49e95 1388 /* Clear the Alarm interrupt pending bit */
phungductung 0:e87aa4c49e95 1389 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
phungductung 0:e87aa4c49e95 1390
phungductung 0:e87aa4c49e95 1391 /* Change RTC state */
phungductung 0:e87aa4c49e95 1392 hrtc->State = HAL_RTC_STATE_READY;
phungductung 0:e87aa4c49e95 1393
phungductung 0:e87aa4c49e95 1394 return HAL_OK;
phungductung 0:e87aa4c49e95 1395 }
phungductung 0:e87aa4c49e95 1396
phungductung 0:e87aa4c49e95 1397 /**
phungductung 0:e87aa4c49e95 1398 * @}
phungductung 0:e87aa4c49e95 1399 */
phungductung 0:e87aa4c49e95 1400
phungductung 0:e87aa4c49e95 1401 /** @defgroup RTC_Group4 Peripheral Control functions
phungductung 0:e87aa4c49e95 1402 * @brief Peripheral Control functions
phungductung 0:e87aa4c49e95 1403 *
phungductung 0:e87aa4c49e95 1404 @verbatim
phungductung 0:e87aa4c49e95 1405 ===============================================================================
phungductung 0:e87aa4c49e95 1406 ##### Peripheral Control functions #####
phungductung 0:e87aa4c49e95 1407 ===============================================================================
phungductung 0:e87aa4c49e95 1408 [..]
phungductung 0:e87aa4c49e95 1409 This subsection provides functions allowing to
phungductung 0:e87aa4c49e95 1410 (+) Wait for RTC Time and Date Synchronization
phungductung 0:e87aa4c49e95 1411
phungductung 0:e87aa4c49e95 1412 @endverbatim
phungductung 0:e87aa4c49e95 1413 * @{
phungductung 0:e87aa4c49e95 1414 */
phungductung 0:e87aa4c49e95 1415
phungductung 0:e87aa4c49e95 1416 /**
phungductung 0:e87aa4c49e95 1417 * @brief Waits until the RTC Time and Date registers (RTC_TR and RTC_DR) are
phungductung 0:e87aa4c49e95 1418 * synchronized with RTC APB clock.
phungductung 0:e87aa4c49e95 1419 * @note The RTC Resynchronization mode is write protected, use the
phungductung 0:e87aa4c49e95 1420 * __HAL_RTC_WRITEPROTECTION_DISABLE() before calling this function.
phungductung 0:e87aa4c49e95 1421 * @note To read the calendar through the shadow registers after Calendar
phungductung 0:e87aa4c49e95 1422 * initialization, calendar update or after wakeup from low power modes
phungductung 0:e87aa4c49e95 1423 * the software must first clear the RSF flag.
phungductung 0:e87aa4c49e95 1424 * The software must then wait until it is set again before reading
phungductung 0:e87aa4c49e95 1425 * the calendar, which means that the calendar registers have been
phungductung 0:e87aa4c49e95 1426 * correctly copied into the RTC_TR and RTC_DR shadow registers.
phungductung 0:e87aa4c49e95 1427 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1428 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1429 * @retval HAL status
phungductung 0:e87aa4c49e95 1430 */
phungductung 0:e87aa4c49e95 1431 HAL_StatusTypeDef HAL_RTC_WaitForSynchro(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 1432 {
phungductung 0:e87aa4c49e95 1433 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 1434
phungductung 0:e87aa4c49e95 1435 /* Clear RSF flag */
phungductung 0:e87aa4c49e95 1436 hrtc->Instance->ISR &= (uint32_t)RTC_RSF_MASK;
phungductung 0:e87aa4c49e95 1437
phungductung 0:e87aa4c49e95 1438 /* Get tick */
phungductung 0:e87aa4c49e95 1439 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1440
phungductung 0:e87aa4c49e95 1441 /* Wait the registers to be synchronised */
phungductung 0:e87aa4c49e95 1442 while((hrtc->Instance->ISR & RTC_ISR_RSF) == (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1443 {
phungductung 0:e87aa4c49e95 1444 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1445 {
phungductung 0:e87aa4c49e95 1446 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1447 }
phungductung 0:e87aa4c49e95 1448 }
phungductung 0:e87aa4c49e95 1449
phungductung 0:e87aa4c49e95 1450 return HAL_OK;
phungductung 0:e87aa4c49e95 1451 }
phungductung 0:e87aa4c49e95 1452
phungductung 0:e87aa4c49e95 1453 /**
phungductung 0:e87aa4c49e95 1454 * @}
phungductung 0:e87aa4c49e95 1455 */
phungductung 0:e87aa4c49e95 1456
phungductung 0:e87aa4c49e95 1457 /** @defgroup RTC_Group5 Peripheral State functions
phungductung 0:e87aa4c49e95 1458 * @brief Peripheral State functions
phungductung 0:e87aa4c49e95 1459 *
phungductung 0:e87aa4c49e95 1460 @verbatim
phungductung 0:e87aa4c49e95 1461 ===============================================================================
phungductung 0:e87aa4c49e95 1462 ##### Peripheral State functions #####
phungductung 0:e87aa4c49e95 1463 ===============================================================================
phungductung 0:e87aa4c49e95 1464 [..]
phungductung 0:e87aa4c49e95 1465 This subsection provides functions allowing to
phungductung 0:e87aa4c49e95 1466 (+) Get RTC state
phungductung 0:e87aa4c49e95 1467
phungductung 0:e87aa4c49e95 1468 @endverbatim
phungductung 0:e87aa4c49e95 1469 * @{
phungductung 0:e87aa4c49e95 1470 */
phungductung 0:e87aa4c49e95 1471 /**
phungductung 0:e87aa4c49e95 1472 * @brief Returns the RTC state.
phungductung 0:e87aa4c49e95 1473 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1474 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1475 * @retval HAL state
phungductung 0:e87aa4c49e95 1476 */
phungductung 0:e87aa4c49e95 1477 HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 1478 {
phungductung 0:e87aa4c49e95 1479 return hrtc->State;
phungductung 0:e87aa4c49e95 1480 }
phungductung 0:e87aa4c49e95 1481
phungductung 0:e87aa4c49e95 1482 /**
phungductung 0:e87aa4c49e95 1483 * @}
phungductung 0:e87aa4c49e95 1484 */
phungductung 0:e87aa4c49e95 1485
phungductung 0:e87aa4c49e95 1486 /**
phungductung 0:e87aa4c49e95 1487 * @brief Enters the RTC Initialization mode.
phungductung 0:e87aa4c49e95 1488 * @note The RTC Initialization mode is write protected, use the
phungductung 0:e87aa4c49e95 1489 * __HAL_RTC_WRITEPROTECTION_DISABLE() before calling this function.
phungductung 0:e87aa4c49e95 1490 * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains
phungductung 0:e87aa4c49e95 1491 * the configuration information for RTC.
phungductung 0:e87aa4c49e95 1492 * @retval HAL status
phungductung 0:e87aa4c49e95 1493 */
phungductung 0:e87aa4c49e95 1494 HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc)
phungductung 0:e87aa4c49e95 1495 {
phungductung 0:e87aa4c49e95 1496 uint32_t tickstart = 0;
phungductung 0:e87aa4c49e95 1497
phungductung 0:e87aa4c49e95 1498 /* Check if the Initialization mode is set */
phungductung 0:e87aa4c49e95 1499 if((hrtc->Instance->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1500 {
phungductung 0:e87aa4c49e95 1501 /* Set the Initialization mode */
phungductung 0:e87aa4c49e95 1502 hrtc->Instance->ISR = (uint32_t)RTC_INIT_MASK;
phungductung 0:e87aa4c49e95 1503
phungductung 0:e87aa4c49e95 1504 /* Get tick */
phungductung 0:e87aa4c49e95 1505 tickstart = HAL_GetTick();
phungductung 0:e87aa4c49e95 1506
phungductung 0:e87aa4c49e95 1507 /* Wait till RTC is in INIT state and if Time out is reached exit */
phungductung 0:e87aa4c49e95 1508 while((hrtc->Instance->ISR & RTC_ISR_INITF) == (uint32_t)RESET)
phungductung 0:e87aa4c49e95 1509 {
phungductung 0:e87aa4c49e95 1510 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
phungductung 0:e87aa4c49e95 1511 {
phungductung 0:e87aa4c49e95 1512 return HAL_TIMEOUT;
phungductung 0:e87aa4c49e95 1513 }
phungductung 0:e87aa4c49e95 1514 }
phungductung 0:e87aa4c49e95 1515 }
phungductung 0:e87aa4c49e95 1516
phungductung 0:e87aa4c49e95 1517 return HAL_OK;
phungductung 0:e87aa4c49e95 1518 }
phungductung 0:e87aa4c49e95 1519
phungductung 0:e87aa4c49e95 1520
phungductung 0:e87aa4c49e95 1521 /**
phungductung 0:e87aa4c49e95 1522 * @brief Converts a 2 digit decimal to BCD format.
phungductung 0:e87aa4c49e95 1523 * @param Value: Byte to be converted
phungductung 0:e87aa4c49e95 1524 * @retval Converted byte
phungductung 0:e87aa4c49e95 1525 */
phungductung 0:e87aa4c49e95 1526 uint8_t RTC_ByteToBcd2(uint8_t Value)
phungductung 0:e87aa4c49e95 1527 {
phungductung 0:e87aa4c49e95 1528 uint32_t bcdhigh = 0;
phungductung 0:e87aa4c49e95 1529
phungductung 0:e87aa4c49e95 1530 while(Value >= 10)
phungductung 0:e87aa4c49e95 1531 {
phungductung 0:e87aa4c49e95 1532 bcdhigh++;
phungductung 0:e87aa4c49e95 1533 Value -= 10;
phungductung 0:e87aa4c49e95 1534 }
phungductung 0:e87aa4c49e95 1535
phungductung 0:e87aa4c49e95 1536 return ((uint8_t)(bcdhigh << 4) | Value);
phungductung 0:e87aa4c49e95 1537 }
phungductung 0:e87aa4c49e95 1538
phungductung 0:e87aa4c49e95 1539 /**
phungductung 0:e87aa4c49e95 1540 * @brief Converts from 2 digit BCD to Binary.
phungductung 0:e87aa4c49e95 1541 * @param Value: BCD value to be converted
phungductung 0:e87aa4c49e95 1542 * @retval Converted word
phungductung 0:e87aa4c49e95 1543 */
phungductung 0:e87aa4c49e95 1544 uint8_t RTC_Bcd2ToByte(uint8_t Value)
phungductung 0:e87aa4c49e95 1545 {
phungductung 0:e87aa4c49e95 1546 uint32_t tmp = 0;
phungductung 0:e87aa4c49e95 1547 tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
phungductung 0:e87aa4c49e95 1548 return (tmp + (Value & (uint8_t)0x0F));
phungductung 0:e87aa4c49e95 1549 }
phungductung 0:e87aa4c49e95 1550
phungductung 0:e87aa4c49e95 1551 /**
phungductung 0:e87aa4c49e95 1552 * @}
phungductung 0:e87aa4c49e95 1553 */
phungductung 0:e87aa4c49e95 1554
phungductung 0:e87aa4c49e95 1555 #endif /* HAL_RTC_MODULE_ENABLED */
phungductung 0:e87aa4c49e95 1556 /**
phungductung 0:e87aa4c49e95 1557 * @}
phungductung 0:e87aa4c49e95 1558 */
phungductung 0:e87aa4c49e95 1559
phungductung 0:e87aa4c49e95 1560 /**
phungductung 0:e87aa4c49e95 1561 * @}
phungductung 0:e87aa4c49e95 1562 */
phungductung 0:e87aa4c49e95 1563
phungductung 0:e87aa4c49e95 1564 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/