fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
19:112740acecfa
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

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