fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Tue Apr 19 11:15:15 2016 +0100
Revision:
113:b3775bf36a83
Parent:
0:9b334a45a8ff
Synchronized with git revision 896981126b34b6d9441e3eea77881c67a1ae3dbd

Full URL: https://github.com/mbedmicro/mbed/commit/896981126b34b6d9441e3eea77881c67a1ae3dbd/

Exporter tool addition for e2 studio

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