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