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