SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

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