fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

Committer:
nameless129
Date:
Mon May 16 16:50:30 2016 +0000
Revision:
129:2e517c56bcfb
Parent:
124:6a4a5b7d7324
PWM Fix:Duty 0%??H???????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f1xx_hal_rtc.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
mbed_official 124:6a4a5b7d7324 5 * @version V1.0.4
mbed_official 124:6a4a5b7d7324 6 * @date 29-April-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 and de-initialization functions
bogdanm 0:9b334a45a8ff 11 * + RTC Time and Date functions
bogdanm 0:9b334a45a8ff 12 * + RTC Alarm functions
bogdanm 0:9b334a45a8ff 13 * + Peripheral Control functions
bogdanm 0:9b334a45a8ff 14 * + Peripheral State functions
bogdanm 0:9b334a45a8ff 15 *
bogdanm 0:9b334a45a8ff 16 @verbatim
bogdanm 0:9b334a45a8ff 17 ==============================================================================
bogdanm 0:9b334a45a8ff 18 ##### How to use this driver #####
bogdanm 0:9b334a45a8ff 19 ==================================================================
bogdanm 0:9b334a45a8ff 20 [..]
bogdanm 0:9b334a45a8ff 21 (+) Enable the RTC domain access (see description in the section above).
bogdanm 0:9b334a45a8ff 22 (+) Configure the RTC Prescaler (Asynchronous prescaler to generate RTC 1Hz time base)
bogdanm 0:9b334a45a8ff 23 using the HAL_RTC_Init() function.
bogdanm 0:9b334a45a8ff 24
bogdanm 0:9b334a45a8ff 25 *** Time and Date configuration ***
bogdanm 0:9b334a45a8ff 26 ===================================
bogdanm 0:9b334a45a8ff 27 [..]
bogdanm 0:9b334a45a8ff 28 (+) To configure the RTC Calendar (Time and Date) use the HAL_RTC_SetTime()
bogdanm 0:9b334a45a8ff 29 and HAL_RTC_SetDate() functions.
bogdanm 0:9b334a45a8ff 30 (+) To read the RTC Calendar, use the HAL_RTC_GetTime() and HAL_RTC_GetDate() functions.
bogdanm 0:9b334a45a8ff 31
bogdanm 0:9b334a45a8ff 32 *** Alarm configuration ***
bogdanm 0:9b334a45a8ff 33 ===========================
bogdanm 0:9b334a45a8ff 34 [..]
bogdanm 0:9b334a45a8ff 35 (+) To configure the RTC Alarm use the HAL_RTC_SetAlarm() function.
bogdanm 0:9b334a45a8ff 36 You can also configure the RTC Alarm with interrupt mode using the HAL_RTC_SetAlarm_IT() function.
bogdanm 0:9b334a45a8ff 37 (+) To read the RTC Alarm, use the HAL_RTC_GetAlarm() function.
bogdanm 0:9b334a45a8ff 38
bogdanm 0:9b334a45a8ff 39 *** Tamper configuration ***
bogdanm 0:9b334a45a8ff 40 ============================
bogdanm 0:9b334a45a8ff 41 [..]
bogdanm 0:9b334a45a8ff 42 (+) Enable the RTC Tamper and configure the Tamper Level using the
bogdanm 0:9b334a45a8ff 43 HAL_RTCEx_SetTamper() function. You can configure RTC Tamper with interrupt
bogdanm 0:9b334a45a8ff 44 mode using HAL_RTCEx_SetTamper_IT() function.
bogdanm 0:9b334a45a8ff 45 (+) The TAMPER1 alternate function can be mapped to PC13
bogdanm 0:9b334a45a8ff 46
bogdanm 0:9b334a45a8ff 47 *** Backup Data Registers configuration ***
bogdanm 0:9b334a45a8ff 48 ===========================================
bogdanm 0:9b334a45a8ff 49 [..]
bogdanm 0:9b334a45a8ff 50 (+) To write to the RTC Backup Data registers, use the HAL_RTCEx_BKUPWrite()
bogdanm 0:9b334a45a8ff 51 function.
bogdanm 0:9b334a45a8ff 52 (+) To read the RTC Backup Data registers, use the HAL_RTCEx_BKUPRead()
bogdanm 0:9b334a45a8ff 53 function.
bogdanm 0:9b334a45a8ff 54
bogdanm 0:9b334a45a8ff 55 ##### WARNING: Drivers Restrictions #####
bogdanm 0:9b334a45a8ff 56 ==================================================================
bogdanm 0:9b334a45a8ff 57 [..] RTC version used on STM32F1 families is version V1. All the features supported by V2
bogdanm 0:9b334a45a8ff 58 (other families) will be not supported on F1.
bogdanm 0:9b334a45a8ff 59 [..] As on V2, main RTC features are managed by HW. But on F1, date feature is completely
bogdanm 0:9b334a45a8ff 60 managed by SW.
bogdanm 0:9b334a45a8ff 61 [..] Then, there are some restrictions compared to other families:
bogdanm 0:9b334a45a8ff 62 (+) Only format 24 hours supported in HAL (format 12 hours not supported)
bogdanm 0:9b334a45a8ff 63 (+) Date is saved in SRAM. Then, when MCU is in STOP or STANDBY mode, date will be lost.
bogdanm 0:9b334a45a8ff 64 User should implement a way to save date before entering in low power mode (an
bogdanm 0:9b334a45a8ff 65 example is provided with firmware package based on backup registers)
bogdanm 0:9b334a45a8ff 66 (+) Date is automatically updated each time a HAL_RTC_GetTime or HAL_RTC_GetDate is called.
bogdanm 0:9b334a45a8ff 67 (+) Alarm detection is limited to 1 day. It will expire only 1 time (no alarm repetition, need
bogdanm 0:9b334a45a8ff 68 to program a new alarm)
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 ##### Backup Domain Operating Condition #####
bogdanm 0:9b334a45a8ff 71 ==============================================================================
bogdanm 0:9b334a45a8ff 72 [..] The real-time clock (RTC) and the RTC backup registers can be powered
bogdanm 0:9b334a45a8ff 73 from the VBAT voltage when the main VDD supply is powered off.
bogdanm 0:9b334a45a8ff 74 To retain the content of the RTC backup registers and supply the RTC
bogdanm 0:9b334a45a8ff 75 when VDD is turned off, VBAT pin can be connected to an optional
bogdanm 0:9b334a45a8ff 76 standby voltage supplied by a battery or by another source.
bogdanm 0:9b334a45a8ff 77
bogdanm 0:9b334a45a8ff 78 [..] To allow the RTC operating even when the main digital supply (VDD) is turned
bogdanm 0:9b334a45a8ff 79 off, the VBAT pin powers the following blocks:
bogdanm 0:9b334a45a8ff 80 (+) The RTC
bogdanm 0:9b334a45a8ff 81 (+) The LSE oscillator
bogdanm 0:9b334a45a8ff 82 (+) PC13 I/O
bogdanm 0:9b334a45a8ff 83
bogdanm 0:9b334a45a8ff 84 [..] When the backup domain is supplied by VDD (analog switch connected to VDD),
bogdanm 0:9b334a45a8ff 85 the following pins are available:
bogdanm 0:9b334a45a8ff 86 (+) PC13 can be used as a Tamper pin
bogdanm 0:9b334a45a8ff 87
bogdanm 0:9b334a45a8ff 88 [..] When the backup domain is supplied by VBAT (analog switch connected to VBAT
bogdanm 0:9b334a45a8ff 89 because VDD is not present), the following pins are available:
bogdanm 0:9b334a45a8ff 90 (+) PC13 can be used as the Tamper pin
bogdanm 0:9b334a45a8ff 91
bogdanm 0:9b334a45a8ff 92 ##### Backup Domain Reset #####
bogdanm 0:9b334a45a8ff 93 ==================================================================
bogdanm 0:9b334a45a8ff 94 [..] The backup domain reset sets all RTC registers and the RCC_BDCR register
bogdanm 0:9b334a45a8ff 95 to their reset values.
bogdanm 0:9b334a45a8ff 96 [..] A backup domain reset is generated when one of the following events occurs:
bogdanm 0:9b334a45a8ff 97 (#) Software reset, triggered by setting the BDRST bit in the
bogdanm 0:9b334a45a8ff 98 RCC Backup domain control register (RCC_BDCR).
bogdanm 0:9b334a45a8ff 99 (#) VDD or VBAT power on, if both supplies have previously been powered off.
bogdanm 0:9b334a45a8ff 100 (#) Tamper detection event resets all data backup registers.
bogdanm 0:9b334a45a8ff 101
bogdanm 0:9b334a45a8ff 102 ##### Backup Domain Access #####
bogdanm 0:9b334a45a8ff 103 ==================================================================
bogdanm 0:9b334a45a8ff 104 [..] After reset, the backup domain (RTC registers, RTC backup data
bogdanm 0:9b334a45a8ff 105 registers and backup SRAM) is protected against possible unwanted write
bogdanm 0:9b334a45a8ff 106 accesses.
bogdanm 0:9b334a45a8ff 107 [..] To enable access to the RTC Domain and RTC registers, proceed as follows:
bogdanm 0:9b334a45a8ff 108 (+) Call the function HAL_RCCEx_PeriphCLKConfig in using RCC_PERIPHCLK_RTC for
bogdanm 0:9b334a45a8ff 109 PeriphClockSelection and select RTCClockSelection (LSE, LSI or HSE)
bogdanm 0:9b334a45a8ff 110 (+) Enable the BKP clock in using __HAL_RCC_BKP_CLK_ENABLE()
bogdanm 0:9b334a45a8ff 111
bogdanm 0:9b334a45a8ff 112 ##### RTC and low power modes #####
bogdanm 0:9b334a45a8ff 113 ==================================================================
bogdanm 0:9b334a45a8ff 114 [..] The MCU can be woken up from a low power mode by an RTC alternate
bogdanm 0:9b334a45a8ff 115 function.
bogdanm 0:9b334a45a8ff 116 [..] The RTC alternate functions are the RTC alarms (Alarm A),
bogdanm 0:9b334a45a8ff 117 and RTC tamper event detection.
bogdanm 0:9b334a45a8ff 118 These RTC alternate functions can wake up the system from the Stop and
bogdanm 0:9b334a45a8ff 119 Standby low power modes.
bogdanm 0:9b334a45a8ff 120 [..] The system can also wake up from low power modes without depending
bogdanm 0:9b334a45a8ff 121 on an external interrupt (Auto-wakeup mode), by using the RTC alarm.
bogdanm 0:9b334a45a8ff 122
bogdanm 0:9b334a45a8ff 123 @endverbatim
bogdanm 0:9b334a45a8ff 124 ******************************************************************************
bogdanm 0:9b334a45a8ff 125 * @attention
bogdanm 0:9b334a45a8ff 126 *
mbed_official 124:6a4a5b7d7324 127 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
bogdanm 0:9b334a45a8ff 128 *
bogdanm 0:9b334a45a8ff 129 * Redistribution and use in source and binary forms, with or without modification,
bogdanm 0:9b334a45a8ff 130 * are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 131 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 132 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 133 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 134 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 135 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 136 * 3. Neither the name of STMicroelectronics nor the names of its contributors
bogdanm 0:9b334a45a8ff 137 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 138 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 139 *
bogdanm 0:9b334a45a8ff 140 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 141 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 142 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 143 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 144 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 145 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 146 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 147 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 148 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 149 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 150 *
bogdanm 0:9b334a45a8ff 151 ******************************************************************************
bogdanm 0:9b334a45a8ff 152 */
bogdanm 0:9b334a45a8ff 153
bogdanm 0:9b334a45a8ff 154 /* Includes ------------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 155 #include "stm32f1xx_hal.h"
bogdanm 0:9b334a45a8ff 156
bogdanm 0:9b334a45a8ff 157 /** @addtogroup STM32F1xx_HAL_Driver
bogdanm 0:9b334a45a8ff 158 * @{
bogdanm 0:9b334a45a8ff 159 */
bogdanm 0:9b334a45a8ff 160
bogdanm 0:9b334a45a8ff 161 /** @defgroup RTC RTC
bogdanm 0:9b334a45a8ff 162 * @brief RTC HAL module driver
bogdanm 0:9b334a45a8ff 163 * @{
bogdanm 0:9b334a45a8ff 164 */
bogdanm 0:9b334a45a8ff 165
bogdanm 0:9b334a45a8ff 166 #ifdef HAL_RTC_MODULE_ENABLED
bogdanm 0:9b334a45a8ff 167
bogdanm 0:9b334a45a8ff 168 /* Private typedef -----------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 169 /* Private define ------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 170 /** @defgroup RTC_Private_Constants RTC Private Constants
bogdanm 0:9b334a45a8ff 171 * @{
bogdanm 0:9b334a45a8ff 172 */
bogdanm 0:9b334a45a8ff 173 #define RTC_ALARM_RESETVALUE_REGISTER (uint16_t)0xFFFF
bogdanm 0:9b334a45a8ff 174 #define RTC_ALARM_RESETVALUE (uint32_t)0xFFFFFFFF
bogdanm 0:9b334a45a8ff 175
bogdanm 0:9b334a45a8ff 176 /**
bogdanm 0:9b334a45a8ff 177 * @}
bogdanm 0:9b334a45a8ff 178 */
bogdanm 0:9b334a45a8ff 179
bogdanm 0:9b334a45a8ff 180 /* Private macro -------------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 181 /** @defgroup RTC_Private_Macros RTC Private Macros
bogdanm 0:9b334a45a8ff 182 * @{
bogdanm 0:9b334a45a8ff 183 */
bogdanm 0:9b334a45a8ff 184 /**
bogdanm 0:9b334a45a8ff 185 * @}
bogdanm 0:9b334a45a8ff 186 */
bogdanm 0:9b334a45a8ff 187
bogdanm 0:9b334a45a8ff 188 /* Private variables ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 189 /* Private function prototypes -----------------------------------------------*/
bogdanm 0:9b334a45a8ff 190 /** @defgroup RTC_Private_Functions RTC Private Functions
bogdanm 0:9b334a45a8ff 191 * @{
bogdanm 0:9b334a45a8ff 192 */
bogdanm 0:9b334a45a8ff 193 static uint32_t RTC_ReadTimeCounter(RTC_HandleTypeDef* hrtc);
bogdanm 0:9b334a45a8ff 194 static HAL_StatusTypeDef RTC_WriteTimeCounter(RTC_HandleTypeDef* hrtc, uint32_t TimeCounter);
bogdanm 0:9b334a45a8ff 195 static uint32_t RTC_ReadAlarmCounter(RTC_HandleTypeDef* hrtc);
bogdanm 0:9b334a45a8ff 196 static HAL_StatusTypeDef RTC_WriteAlarmCounter(RTC_HandleTypeDef* hrtc, uint32_t AlarmCounter);
bogdanm 0:9b334a45a8ff 197 static HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc);
bogdanm 0:9b334a45a8ff 198 static HAL_StatusTypeDef RTC_ExitInitMode(RTC_HandleTypeDef* hrtc);
bogdanm 0:9b334a45a8ff 199 static uint8_t RTC_ByteToBcd2(uint8_t Value);
bogdanm 0:9b334a45a8ff 200 static uint8_t RTC_Bcd2ToByte(uint8_t Value);
bogdanm 0:9b334a45a8ff 201 static uint8_t RTC_IsLeapYear(uint16_t nYear);
bogdanm 0:9b334a45a8ff 202 static void RTC_DateUpdate(RTC_HandleTypeDef* hrtc, uint32_t DayElapsed);
bogdanm 0:9b334a45a8ff 203 static uint8_t RTC_WeekDayNum(uint32_t nYear, uint8_t nMonth, uint8_t nDay);
bogdanm 0:9b334a45a8ff 204
bogdanm 0:9b334a45a8ff 205 /**
bogdanm 0:9b334a45a8ff 206 * @}
bogdanm 0:9b334a45a8ff 207 */
bogdanm 0:9b334a45a8ff 208
bogdanm 0:9b334a45a8ff 209 /* Private functions ---------------------------------------------------------*/
bogdanm 0:9b334a45a8ff 210 /** @defgroup RTC_Exported_Functions RTC Exported Functions
bogdanm 0:9b334a45a8ff 211 * @{
bogdanm 0:9b334a45a8ff 212 */
bogdanm 0:9b334a45a8ff 213
bogdanm 0:9b334a45a8ff 214 /** @defgroup RTC_Exported_Functions_Group1 Initialization and de-initialization functions
bogdanm 0:9b334a45a8ff 215 * @brief Initialization and Configuration functions
bogdanm 0:9b334a45a8ff 216 *
bogdanm 0:9b334a45a8ff 217 @verbatim
bogdanm 0:9b334a45a8ff 218 ===============================================================================
bogdanm 0:9b334a45a8ff 219 ##### Initialization and de-initialization functions #####
bogdanm 0:9b334a45a8ff 220 ===============================================================================
bogdanm 0:9b334a45a8ff 221 [..] This section provides functions allowing to initialize and configure the
bogdanm 0:9b334a45a8ff 222 RTC Prescaler (Asynchronous), disable RTC registers Write protection,
bogdanm 0:9b334a45a8ff 223 enter and exit the RTC initialization mode,
bogdanm 0:9b334a45a8ff 224 RTC registers synchronization check and reference clock detection enable.
bogdanm 0:9b334a45a8ff 225 (#) The RTC Prescaler should be programmed to generate the RTC 1Hz time base.
bogdanm 0:9b334a45a8ff 226 (#) All RTC registers are Write protected. Writing to the RTC registers
bogdanm 0:9b334a45a8ff 227 is enabled by setting the CNF bit in the RTC_CRL register.
bogdanm 0:9b334a45a8ff 228 (#) To read the calendar after wakeup from low power modes (Standby or Stop)
bogdanm 0:9b334a45a8ff 229 the software must first wait for the RSF bit (Register Synchronized Flag)
bogdanm 0:9b334a45a8ff 230 in the RTC_CRL register to be set by hardware.
bogdanm 0:9b334a45a8ff 231 The HAL_RTC_WaitForSynchro() function implements the above software
bogdanm 0:9b334a45a8ff 232 sequence (RSF clear and RSF check).
bogdanm 0:9b334a45a8ff 233
bogdanm 0:9b334a45a8ff 234 @endverbatim
bogdanm 0:9b334a45a8ff 235 * @{
bogdanm 0:9b334a45a8ff 236 */
bogdanm 0:9b334a45a8ff 237
bogdanm 0:9b334a45a8ff 238 /**
bogdanm 0:9b334a45a8ff 239 * @brief Initializes the RTC peripheral
bogdanm 0:9b334a45a8ff 240 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 241 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 242 * @retval HAL status
bogdanm 0:9b334a45a8ff 243 */
bogdanm 0:9b334a45a8ff 244 HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc)
bogdanm 0:9b334a45a8ff 245 {
bogdanm 0:9b334a45a8ff 246 uint32_t prescaler = 0;
bogdanm 0:9b334a45a8ff 247 /* Check input parameters */
bogdanm 0:9b334a45a8ff 248 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 249 {
bogdanm 0:9b334a45a8ff 250 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 251 }
bogdanm 0:9b334a45a8ff 252
bogdanm 0:9b334a45a8ff 253 /* Check the parameters */
bogdanm 0:9b334a45a8ff 254 assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
bogdanm 0:9b334a45a8ff 255 assert_param(IS_RTC_CALIB_OUTPUT(hrtc->Init.OutPut));
bogdanm 0:9b334a45a8ff 256 assert_param(IS_RTC_ASYNCH_PREDIV(hrtc->Init.AsynchPrediv));
bogdanm 0:9b334a45a8ff 257
bogdanm 0:9b334a45a8ff 258 if(hrtc->State == HAL_RTC_STATE_RESET)
bogdanm 0:9b334a45a8ff 259 {
bogdanm 0:9b334a45a8ff 260 /* Allocate lock resource and initialize it */
mbed_official 124:6a4a5b7d7324 261 hrtc->Lock = HAL_UNLOCKED;
bogdanm 0:9b334a45a8ff 262
bogdanm 0:9b334a45a8ff 263 /* Initialize RTC MSP */
bogdanm 0:9b334a45a8ff 264 HAL_RTC_MspInit(hrtc);
bogdanm 0:9b334a45a8ff 265 }
bogdanm 0:9b334a45a8ff 266
bogdanm 0:9b334a45a8ff 267 /* Set RTC state */
bogdanm 0:9b334a45a8ff 268 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 269
bogdanm 0:9b334a45a8ff 270 /* Waiting for synchro */
bogdanm 0:9b334a45a8ff 271 if(HAL_RTC_WaitForSynchro(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 272 {
bogdanm 0:9b334a45a8ff 273 /* Set RTC state */
bogdanm 0:9b334a45a8ff 274 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 275
bogdanm 0:9b334a45a8ff 276 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 277 }
bogdanm 0:9b334a45a8ff 278
bogdanm 0:9b334a45a8ff 279 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 280 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 281 {
bogdanm 0:9b334a45a8ff 282 /* Set RTC state */
bogdanm 0:9b334a45a8ff 283 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 284
bogdanm 0:9b334a45a8ff 285 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 286 }
bogdanm 0:9b334a45a8ff 287 else
bogdanm 0:9b334a45a8ff 288 {
bogdanm 0:9b334a45a8ff 289 /* Clear Flags Bits */
bogdanm 0:9b334a45a8ff 290 CLEAR_BIT(hrtc->Instance->CRL, (RTC_FLAG_OW | RTC_FLAG_ALRAF | RTC_FLAG_SEC));
bogdanm 0:9b334a45a8ff 291
bogdanm 0:9b334a45a8ff 292 if(hrtc->Init.OutPut != RTC_OUTPUTSOURCE_NONE)
bogdanm 0:9b334a45a8ff 293 {
bogdanm 0:9b334a45a8ff 294 /* Disable the selected Tamper pin */
bogdanm 0:9b334a45a8ff 295 CLEAR_BIT(BKP->CR, BKP_CR_TPE);
bogdanm 0:9b334a45a8ff 296 }
bogdanm 0:9b334a45a8ff 297
bogdanm 0:9b334a45a8ff 298 /* Set the signal which will be routed to RTC Tamper pin*/
bogdanm 0:9b334a45a8ff 299 MODIFY_REG(BKP->RTCCR, (BKP_RTCCR_CCO | BKP_RTCCR_ASOE | BKP_RTCCR_ASOS), hrtc->Init.OutPut);
bogdanm 0:9b334a45a8ff 300
bogdanm 0:9b334a45a8ff 301 if (hrtc->Init.AsynchPrediv != RTC_AUTO_1_SECOND)
bogdanm 0:9b334a45a8ff 302 {
bogdanm 0:9b334a45a8ff 303 /* RTC Prescaler provided directly by end-user*/
bogdanm 0:9b334a45a8ff 304 prescaler = hrtc->Init.AsynchPrediv;
bogdanm 0:9b334a45a8ff 305 }
bogdanm 0:9b334a45a8ff 306 else
bogdanm 0:9b334a45a8ff 307 {
bogdanm 0:9b334a45a8ff 308 /* RTC Prescaler will be automatically calculated to get 1 second timebase */
bogdanm 0:9b334a45a8ff 309 /* Get the RTCCLK frequency */
bogdanm 0:9b334a45a8ff 310 prescaler = HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_RTC);
bogdanm 0:9b334a45a8ff 311
bogdanm 0:9b334a45a8ff 312 /* Check that RTC clock is enabled*/
bogdanm 0:9b334a45a8ff 313 if (prescaler == 0)
bogdanm 0:9b334a45a8ff 314 {
bogdanm 0:9b334a45a8ff 315 /* Should not happen. Frequency is not available*/
bogdanm 0:9b334a45a8ff 316 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 317 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 318 }
bogdanm 0:9b334a45a8ff 319 else
bogdanm 0:9b334a45a8ff 320 {
bogdanm 0:9b334a45a8ff 321 /* RTC period = RTCCLK/(RTC_PR + 1) */
bogdanm 0:9b334a45a8ff 322 prescaler = prescaler - 1;
bogdanm 0:9b334a45a8ff 323 }
bogdanm 0:9b334a45a8ff 324 }
bogdanm 0:9b334a45a8ff 325
bogdanm 0:9b334a45a8ff 326 /* Configure the RTC_PRLH / RTC_PRLL */
bogdanm 0:9b334a45a8ff 327 MODIFY_REG(hrtc->Instance->PRLH, RTC_PRLH_PRL, (prescaler >> 16));
bogdanm 0:9b334a45a8ff 328 MODIFY_REG(hrtc->Instance->PRLL, RTC_PRLL_PRL, (prescaler & RTC_PRLL_PRL));
bogdanm 0:9b334a45a8ff 329
bogdanm 0:9b334a45a8ff 330 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 331 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 332 {
bogdanm 0:9b334a45a8ff 333 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 334
bogdanm 0:9b334a45a8ff 335 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 336 }
bogdanm 0:9b334a45a8ff 337
bogdanm 0:9b334a45a8ff 338 /* Initialize date to 1st of January 2000 */
bogdanm 0:9b334a45a8ff 339 hrtc->DateToUpdate.Year = 0x00;
bogdanm 0:9b334a45a8ff 340 hrtc->DateToUpdate.Month = RTC_MONTH_JANUARY;
bogdanm 0:9b334a45a8ff 341 hrtc->DateToUpdate.Date = 0x01;
bogdanm 0:9b334a45a8ff 342
bogdanm 0:9b334a45a8ff 343 /* Set RTC state */
bogdanm 0:9b334a45a8ff 344 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 345
bogdanm 0:9b334a45a8ff 346 return HAL_OK;
bogdanm 0:9b334a45a8ff 347 }
bogdanm 0:9b334a45a8ff 348 }
bogdanm 0:9b334a45a8ff 349
bogdanm 0:9b334a45a8ff 350 /**
bogdanm 0:9b334a45a8ff 351 * @brief DeInitializes the RTC peripheral
bogdanm 0:9b334a45a8ff 352 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 353 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 354 * @note This function does not reset the RTC Backup Data registers.
bogdanm 0:9b334a45a8ff 355 * @retval HAL status
bogdanm 0:9b334a45a8ff 356 */
bogdanm 0:9b334a45a8ff 357 HAL_StatusTypeDef HAL_RTC_DeInit(RTC_HandleTypeDef *hrtc)
bogdanm 0:9b334a45a8ff 358 {
bogdanm 0:9b334a45a8ff 359 /* Check input parameters */
bogdanm 0:9b334a45a8ff 360 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 361 {
bogdanm 0:9b334a45a8ff 362 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 363 }
bogdanm 0:9b334a45a8ff 364
bogdanm 0:9b334a45a8ff 365 /* Check the parameters */
bogdanm 0:9b334a45a8ff 366 assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
bogdanm 0:9b334a45a8ff 367
bogdanm 0:9b334a45a8ff 368 /* Set RTC state */
bogdanm 0:9b334a45a8ff 369 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 370
bogdanm 0:9b334a45a8ff 371 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 372 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 373 {
bogdanm 0:9b334a45a8ff 374 /* Set RTC state */
bogdanm 0:9b334a45a8ff 375 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 376
bogdanm 0:9b334a45a8ff 377 /* Release Lock */
bogdanm 0:9b334a45a8ff 378 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 379
bogdanm 0:9b334a45a8ff 380 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 381 }
bogdanm 0:9b334a45a8ff 382 else
bogdanm 0:9b334a45a8ff 383 {
bogdanm 0:9b334a45a8ff 384 CLEAR_REG(hrtc->Instance->CNTL);
bogdanm 0:9b334a45a8ff 385 CLEAR_REG(hrtc->Instance->CNTH);
bogdanm 0:9b334a45a8ff 386 WRITE_REG(hrtc->Instance->PRLL, 0x00008000);
bogdanm 0:9b334a45a8ff 387 CLEAR_REG(hrtc->Instance->PRLH);
bogdanm 0:9b334a45a8ff 388
bogdanm 0:9b334a45a8ff 389 /* Reset All CRH/CRL bits */
bogdanm 0:9b334a45a8ff 390 CLEAR_REG(hrtc->Instance->CRH);
bogdanm 0:9b334a45a8ff 391 CLEAR_REG(hrtc->Instance->CRL);
bogdanm 0:9b334a45a8ff 392
bogdanm 0:9b334a45a8ff 393 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 394 {
bogdanm 0:9b334a45a8ff 395 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 396
bogdanm 0:9b334a45a8ff 397 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 398 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 399
bogdanm 0:9b334a45a8ff 400 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 401 }
bogdanm 0:9b334a45a8ff 402 }
bogdanm 0:9b334a45a8ff 403
bogdanm 0:9b334a45a8ff 404 /* Wait for synchro*/
bogdanm 0:9b334a45a8ff 405 HAL_RTC_WaitForSynchro(hrtc);
bogdanm 0:9b334a45a8ff 406
bogdanm 0:9b334a45a8ff 407 /* Clear RSF flag */
bogdanm 0:9b334a45a8ff 408 CLEAR_BIT(hrtc->Instance->CRL, RTC_FLAG_RSF);
bogdanm 0:9b334a45a8ff 409
bogdanm 0:9b334a45a8ff 410 /* De-Initialize RTC MSP */
bogdanm 0:9b334a45a8ff 411 HAL_RTC_MspDeInit(hrtc);
bogdanm 0:9b334a45a8ff 412
bogdanm 0:9b334a45a8ff 413 hrtc->State = HAL_RTC_STATE_RESET;
bogdanm 0:9b334a45a8ff 414
bogdanm 0:9b334a45a8ff 415 /* Release Lock */
bogdanm 0:9b334a45a8ff 416 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 417
bogdanm 0:9b334a45a8ff 418 return HAL_OK;
bogdanm 0:9b334a45a8ff 419 }
bogdanm 0:9b334a45a8ff 420
bogdanm 0:9b334a45a8ff 421 /**
bogdanm 0:9b334a45a8ff 422 * @brief Initializes the RTC MSP.
bogdanm 0:9b334a45a8ff 423 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 424 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 425 * @retval None
bogdanm 0:9b334a45a8ff 426 */
bogdanm 0:9b334a45a8ff 427 __weak void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 428 {
mbed_official 124:6a4a5b7d7324 429 /* Prevent unused argument(s) compilation warning */
mbed_official 124:6a4a5b7d7324 430 UNUSED(hrtc);
bogdanm 0:9b334a45a8ff 431 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 432 the HAL_RTC_MspInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 433 */
bogdanm 0:9b334a45a8ff 434 }
bogdanm 0:9b334a45a8ff 435
bogdanm 0:9b334a45a8ff 436 /**
bogdanm 0:9b334a45a8ff 437 * @brief DeInitializes the RTC MSP.
bogdanm 0:9b334a45a8ff 438 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 439 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 440 * @retval None
bogdanm 0:9b334a45a8ff 441 */
bogdanm 0:9b334a45a8ff 442 __weak void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 443 {
mbed_official 124:6a4a5b7d7324 444 /* Prevent unused argument(s) compilation warning */
mbed_official 124:6a4a5b7d7324 445 UNUSED(hrtc);
bogdanm 0:9b334a45a8ff 446 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 447 the HAL_RTC_MspDeInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 448 */
bogdanm 0:9b334a45a8ff 449 }
bogdanm 0:9b334a45a8ff 450
bogdanm 0:9b334a45a8ff 451 /**
bogdanm 0:9b334a45a8ff 452 * @}
bogdanm 0:9b334a45a8ff 453 */
bogdanm 0:9b334a45a8ff 454
bogdanm 0:9b334a45a8ff 455 /** @defgroup RTC_Exported_Functions_Group2 Time and Date functions
bogdanm 0:9b334a45a8ff 456 * @brief RTC Time and Date functions
bogdanm 0:9b334a45a8ff 457 *
bogdanm 0:9b334a45a8ff 458 @verbatim
bogdanm 0:9b334a45a8ff 459 ===============================================================================
bogdanm 0:9b334a45a8ff 460 ##### RTC Time and Date functions #####
bogdanm 0:9b334a45a8ff 461 ===============================================================================
bogdanm 0:9b334a45a8ff 462
bogdanm 0:9b334a45a8ff 463 [..] This section provides functions allowing to configure Time and Date features
bogdanm 0:9b334a45a8ff 464
bogdanm 0:9b334a45a8ff 465 @endverbatim
bogdanm 0:9b334a45a8ff 466 * @{
bogdanm 0:9b334a45a8ff 467 */
bogdanm 0:9b334a45a8ff 468
bogdanm 0:9b334a45a8ff 469 /**
bogdanm 0:9b334a45a8ff 470 * @brief Sets RTC current time.
bogdanm 0:9b334a45a8ff 471 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 472 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 473 * @param sTime: Pointer to Time structure
bogdanm 0:9b334a45a8ff 474 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 475 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 476 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 477 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 478 * @retval HAL status
bogdanm 0:9b334a45a8ff 479 */
bogdanm 0:9b334a45a8ff 480 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
bogdanm 0:9b334a45a8ff 481 {
bogdanm 0:9b334a45a8ff 482 uint32_t counter_time = 0, counter_alarm = 0;
bogdanm 0:9b334a45a8ff 483
bogdanm 0:9b334a45a8ff 484 /* Check input parameters */
bogdanm 0:9b334a45a8ff 485 if((hrtc == NULL) || (sTime == NULL))
bogdanm 0:9b334a45a8ff 486 {
bogdanm 0:9b334a45a8ff 487 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 488 }
bogdanm 0:9b334a45a8ff 489
bogdanm 0:9b334a45a8ff 490 /* Check the parameters */
bogdanm 0:9b334a45a8ff 491 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 492
bogdanm 0:9b334a45a8ff 493 /* Process Locked */
bogdanm 0:9b334a45a8ff 494 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 495
bogdanm 0:9b334a45a8ff 496 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 497
bogdanm 0:9b334a45a8ff 498 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 499 {
bogdanm 0:9b334a45a8ff 500 assert_param(IS_RTC_HOUR24(sTime->Hours));
bogdanm 0:9b334a45a8ff 501 assert_param(IS_RTC_MINUTES(sTime->Minutes));
bogdanm 0:9b334a45a8ff 502 assert_param(IS_RTC_SECONDS(sTime->Seconds));
bogdanm 0:9b334a45a8ff 503
bogdanm 0:9b334a45a8ff 504 counter_time = (uint32_t)(((uint32_t)sTime->Hours * 3600) + \
bogdanm 0:9b334a45a8ff 505 ((uint32_t)sTime->Minutes * 60) + \
bogdanm 0:9b334a45a8ff 506 ((uint32_t)sTime->Seconds));
bogdanm 0:9b334a45a8ff 507 }
bogdanm 0:9b334a45a8ff 508 else
bogdanm 0:9b334a45a8ff 509 {
bogdanm 0:9b334a45a8ff 510 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sTime->Hours)));
bogdanm 0:9b334a45a8ff 511 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sTime->Minutes)));
bogdanm 0:9b334a45a8ff 512 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sTime->Seconds)));
bogdanm 0:9b334a45a8ff 513
bogdanm 0:9b334a45a8ff 514 counter_time = (((uint32_t)(RTC_Bcd2ToByte(sTime->Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 515 ((uint32_t)(RTC_Bcd2ToByte(sTime->Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 516 ((uint32_t)(RTC_Bcd2ToByte(sTime->Seconds))));
bogdanm 0:9b334a45a8ff 517 }
bogdanm 0:9b334a45a8ff 518
bogdanm 0:9b334a45a8ff 519 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 520 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 521 {
bogdanm 0:9b334a45a8ff 522 /* Set RTC state */
bogdanm 0:9b334a45a8ff 523 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 524
bogdanm 0:9b334a45a8ff 525 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 526 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 527
bogdanm 0:9b334a45a8ff 528 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 529 }
bogdanm 0:9b334a45a8ff 530 else
bogdanm 0:9b334a45a8ff 531 {
bogdanm 0:9b334a45a8ff 532 /* Clear Second and overflow flags */
bogdanm 0:9b334a45a8ff 533 CLEAR_BIT(hrtc->Instance->CRL, (RTC_FLAG_SEC | RTC_FLAG_OW));
bogdanm 0:9b334a45a8ff 534
bogdanm 0:9b334a45a8ff 535 /* Read current Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 536 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 537
bogdanm 0:9b334a45a8ff 538 /* Set again alarm to match with new time if enabled */
bogdanm 0:9b334a45a8ff 539 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 540 {
bogdanm 0:9b334a45a8ff 541 if(counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 542 {
bogdanm 0:9b334a45a8ff 543 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 544 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 545
bogdanm 0:9b334a45a8ff 546 /* Write new Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 547 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 548 {
bogdanm 0:9b334a45a8ff 549 /* Set RTC state */
bogdanm 0:9b334a45a8ff 550 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 551
bogdanm 0:9b334a45a8ff 552 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 553 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 554
bogdanm 0:9b334a45a8ff 555 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 556 }
bogdanm 0:9b334a45a8ff 557 }
bogdanm 0:9b334a45a8ff 558 }
bogdanm 0:9b334a45a8ff 559
bogdanm 0:9b334a45a8ff 560 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 561
bogdanm 0:9b334a45a8ff 562 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 563
bogdanm 0:9b334a45a8ff 564 return HAL_OK;
bogdanm 0:9b334a45a8ff 565 }
bogdanm 0:9b334a45a8ff 566 }
bogdanm 0:9b334a45a8ff 567
bogdanm 0:9b334a45a8ff 568 /**
bogdanm 0:9b334a45a8ff 569 * @brief Gets RTC current time.
bogdanm 0:9b334a45a8ff 570 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 571 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 572 * @param sTime: Pointer to Time structure
bogdanm 0:9b334a45a8ff 573 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 574 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 575 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 576 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 577 * @retval HAL status
bogdanm 0:9b334a45a8ff 578 */
bogdanm 0:9b334a45a8ff 579 HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
bogdanm 0:9b334a45a8ff 580 {
bogdanm 0:9b334a45a8ff 581 uint32_t counter_time = 0, counter_alarm = 0, days_elapsed = 0, hours = 0;
bogdanm 0:9b334a45a8ff 582
bogdanm 0:9b334a45a8ff 583 /* Check input parameters */
bogdanm 0:9b334a45a8ff 584 if((hrtc == NULL) || (sTime == NULL))
bogdanm 0:9b334a45a8ff 585 {
bogdanm 0:9b334a45a8ff 586 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 587 }
bogdanm 0:9b334a45a8ff 588
bogdanm 0:9b334a45a8ff 589 /* Check the parameters */
bogdanm 0:9b334a45a8ff 590 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 591
bogdanm 0:9b334a45a8ff 592 /* Check if counter overflow occurred */
bogdanm 0:9b334a45a8ff 593 if (__HAL_RTC_OVERFLOW_GET_FLAG(hrtc, RTC_FLAG_OW))
bogdanm 0:9b334a45a8ff 594 {
bogdanm 0:9b334a45a8ff 595 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 596 }
bogdanm 0:9b334a45a8ff 597
bogdanm 0:9b334a45a8ff 598 /* Read the time counter*/
bogdanm 0:9b334a45a8ff 599 counter_time = RTC_ReadTimeCounter(hrtc);
bogdanm 0:9b334a45a8ff 600
bogdanm 0:9b334a45a8ff 601 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 602 hours = counter_time / 3600;
bogdanm 0:9b334a45a8ff 603 sTime->Minutes = (uint8_t)((counter_time % 3600) / 60);
bogdanm 0:9b334a45a8ff 604 sTime->Seconds = (uint8_t)((counter_time % 3600) % 60);
bogdanm 0:9b334a45a8ff 605
bogdanm 0:9b334a45a8ff 606 if (hours >= 24)
bogdanm 0:9b334a45a8ff 607 {
bogdanm 0:9b334a45a8ff 608 /* Get number of days elapsed from last calculation */
bogdanm 0:9b334a45a8ff 609 days_elapsed = (hours / 24);
bogdanm 0:9b334a45a8ff 610
bogdanm 0:9b334a45a8ff 611 /* Set Hours in RTC_TimeTypeDef structure*/
bogdanm 0:9b334a45a8ff 612 sTime->Hours = (hours % 24);
bogdanm 0:9b334a45a8ff 613
bogdanm 0:9b334a45a8ff 614 /* Read Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 615 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 616
bogdanm 0:9b334a45a8ff 617 /* Calculate remaining time to reach alarm (only if set and not yet expired)*/
bogdanm 0:9b334a45a8ff 618 if ((counter_alarm != RTC_ALARM_RESETVALUE) && (counter_alarm > counter_time))
bogdanm 0:9b334a45a8ff 619 {
bogdanm 0:9b334a45a8ff 620 counter_alarm -= counter_time;
bogdanm 0:9b334a45a8ff 621 }
bogdanm 0:9b334a45a8ff 622 else
bogdanm 0:9b334a45a8ff 623 {
bogdanm 0:9b334a45a8ff 624 /* In case of counter_alarm < counter_time */
bogdanm 0:9b334a45a8ff 625 /* Alarm expiration already occurred but alarm not deactivated */
bogdanm 0:9b334a45a8ff 626 counter_alarm = RTC_ALARM_RESETVALUE;
bogdanm 0:9b334a45a8ff 627 }
bogdanm 0:9b334a45a8ff 628
bogdanm 0:9b334a45a8ff 629 /* Set updated time in decreasing counter by number of days elapsed */
bogdanm 0:9b334a45a8ff 630 counter_time -= (days_elapsed * 24 * 3600);
bogdanm 0:9b334a45a8ff 631
bogdanm 0:9b334a45a8ff 632 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 633 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 634 {
bogdanm 0:9b334a45a8ff 635 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 636 }
bogdanm 0:9b334a45a8ff 637
bogdanm 0:9b334a45a8ff 638 /* Set updated alarm to be set */
bogdanm 0:9b334a45a8ff 639 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 640 {
bogdanm 0:9b334a45a8ff 641 counter_alarm += counter_time;
bogdanm 0:9b334a45a8ff 642
bogdanm 0:9b334a45a8ff 643 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 644 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 645 {
bogdanm 0:9b334a45a8ff 646 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 647 }
bogdanm 0:9b334a45a8ff 648 }
bogdanm 0:9b334a45a8ff 649 else
bogdanm 0:9b334a45a8ff 650 {
bogdanm 0:9b334a45a8ff 651 /* Alarm already occurred. Set it to reset values to avoid unexpected expiration */
bogdanm 0:9b334a45a8ff 652 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 653 {
bogdanm 0:9b334a45a8ff 654 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 655 }
bogdanm 0:9b334a45a8ff 656 }
bogdanm 0:9b334a45a8ff 657
bogdanm 0:9b334a45a8ff 658 /* Update date */
bogdanm 0:9b334a45a8ff 659 RTC_DateUpdate(hrtc, days_elapsed);
bogdanm 0:9b334a45a8ff 660 }
bogdanm 0:9b334a45a8ff 661 else
bogdanm 0:9b334a45a8ff 662 {
bogdanm 0:9b334a45a8ff 663 sTime->Hours = hours;
bogdanm 0:9b334a45a8ff 664 }
bogdanm 0:9b334a45a8ff 665
bogdanm 0:9b334a45a8ff 666 /* Check the input parameters format */
bogdanm 0:9b334a45a8ff 667 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 668 {
bogdanm 0:9b334a45a8ff 669 /* Convert the time structure parameters to BCD format */
bogdanm 0:9b334a45a8ff 670 sTime->Hours = (uint8_t)RTC_ByteToBcd2(sTime->Hours);
bogdanm 0:9b334a45a8ff 671 sTime->Minutes = (uint8_t)RTC_ByteToBcd2(sTime->Minutes);
bogdanm 0:9b334a45a8ff 672 sTime->Seconds = (uint8_t)RTC_ByteToBcd2(sTime->Seconds);
bogdanm 0:9b334a45a8ff 673 }
bogdanm 0:9b334a45a8ff 674
bogdanm 0:9b334a45a8ff 675 return HAL_OK;
bogdanm 0:9b334a45a8ff 676 }
bogdanm 0:9b334a45a8ff 677
bogdanm 0:9b334a45a8ff 678
bogdanm 0:9b334a45a8ff 679 /**
bogdanm 0:9b334a45a8ff 680 * @brief Sets RTC current date.
bogdanm 0:9b334a45a8ff 681 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 682 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 683 * @param sDate: Pointer to date structure
bogdanm 0:9b334a45a8ff 684 * @param Format: specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 685 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 686 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 687 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 688 * @retval HAL status
bogdanm 0:9b334a45a8ff 689 */
bogdanm 0:9b334a45a8ff 690 HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
bogdanm 0:9b334a45a8ff 691 {
bogdanm 0:9b334a45a8ff 692 uint32_t counter_time = 0, counter_alarm = 0, hours = 0;
bogdanm 0:9b334a45a8ff 693
bogdanm 0:9b334a45a8ff 694 /* Check input parameters */
bogdanm 0:9b334a45a8ff 695 if((hrtc == NULL) || (sDate == NULL))
bogdanm 0:9b334a45a8ff 696 {
bogdanm 0:9b334a45a8ff 697 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 698 }
bogdanm 0:9b334a45a8ff 699
bogdanm 0:9b334a45a8ff 700 /* Check the parameters */
bogdanm 0:9b334a45a8ff 701 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 702
bogdanm 0:9b334a45a8ff 703 /* Process Locked */
bogdanm 0:9b334a45a8ff 704 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 705
bogdanm 0:9b334a45a8ff 706 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 707
bogdanm 0:9b334a45a8ff 708 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 709 {
bogdanm 0:9b334a45a8ff 710 assert_param(IS_RTC_YEAR(sDate->Year));
bogdanm 0:9b334a45a8ff 711 assert_param(IS_RTC_MONTH(sDate->Month));
bogdanm 0:9b334a45a8ff 712 assert_param(IS_RTC_DATE(sDate->Date));
bogdanm 0:9b334a45a8ff 713
bogdanm 0:9b334a45a8ff 714 /* Change the current date */
bogdanm 0:9b334a45a8ff 715 hrtc->DateToUpdate.Year = sDate->Year;
bogdanm 0:9b334a45a8ff 716 hrtc->DateToUpdate.Month = sDate->Month;
bogdanm 0:9b334a45a8ff 717 hrtc->DateToUpdate.Date = sDate->Date;
bogdanm 0:9b334a45a8ff 718 }
bogdanm 0:9b334a45a8ff 719 else
bogdanm 0:9b334a45a8ff 720 {
bogdanm 0:9b334a45a8ff 721 assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
bogdanm 0:9b334a45a8ff 722 assert_param(IS_RTC_MONTH(RTC_Bcd2ToByte(sDate->Month)));
bogdanm 0:9b334a45a8ff 723 assert_param(IS_RTC_DATE(RTC_Bcd2ToByte(sDate->Date)));
bogdanm 0:9b334a45a8ff 724
bogdanm 0:9b334a45a8ff 725 /* Change the current date */
bogdanm 0:9b334a45a8ff 726 hrtc->DateToUpdate.Year = RTC_Bcd2ToByte(sDate->Year);
bogdanm 0:9b334a45a8ff 727 hrtc->DateToUpdate.Month = RTC_Bcd2ToByte(sDate->Month);
bogdanm 0:9b334a45a8ff 728 hrtc->DateToUpdate.Date = RTC_Bcd2ToByte(sDate->Date);
bogdanm 0:9b334a45a8ff 729 }
bogdanm 0:9b334a45a8ff 730
bogdanm 0:9b334a45a8ff 731 /* WeekDay set by user can be ignored because automatically calculated */
bogdanm 0:9b334a45a8ff 732 hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(hrtc->DateToUpdate.Year, hrtc->DateToUpdate.Month, hrtc->DateToUpdate.Date);
bogdanm 0:9b334a45a8ff 733 sDate->WeekDay = hrtc->DateToUpdate.WeekDay;
bogdanm 0:9b334a45a8ff 734
bogdanm 0:9b334a45a8ff 735 /* Reset time to be aligned on the same day */
bogdanm 0:9b334a45a8ff 736 /* Read the time counter*/
bogdanm 0:9b334a45a8ff 737 counter_time = RTC_ReadTimeCounter(hrtc);
bogdanm 0:9b334a45a8ff 738
bogdanm 0:9b334a45a8ff 739 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 740 hours = counter_time / 3600;
bogdanm 0:9b334a45a8ff 741 if (hours > 24)
bogdanm 0:9b334a45a8ff 742 {
bogdanm 0:9b334a45a8ff 743 /* Set updated time in decreasing counter by number of days elapsed */
bogdanm 0:9b334a45a8ff 744 counter_time -= ((hours / 24) * 24 * 3600);
bogdanm 0:9b334a45a8ff 745 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 746 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 747 {
bogdanm 0:9b334a45a8ff 748 /* Set RTC state */
bogdanm 0:9b334a45a8ff 749 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 750
bogdanm 0:9b334a45a8ff 751 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 752 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 753
bogdanm 0:9b334a45a8ff 754 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 755 }
bogdanm 0:9b334a45a8ff 756
bogdanm 0:9b334a45a8ff 757 /* Read current Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 758 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 759
bogdanm 0:9b334a45a8ff 760 /* Set again alarm to match with new time if enabled */
bogdanm 0:9b334a45a8ff 761 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 762 {
bogdanm 0:9b334a45a8ff 763 if(counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 764 {
bogdanm 0:9b334a45a8ff 765 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 766 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 767
bogdanm 0:9b334a45a8ff 768 /* Write new Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 769 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 770 {
bogdanm 0:9b334a45a8ff 771 /* Set RTC state */
bogdanm 0:9b334a45a8ff 772 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 773
bogdanm 0:9b334a45a8ff 774 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 775 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 776
bogdanm 0:9b334a45a8ff 777 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 778 }
bogdanm 0:9b334a45a8ff 779 }
bogdanm 0:9b334a45a8ff 780 }
bogdanm 0:9b334a45a8ff 781
bogdanm 0:9b334a45a8ff 782
bogdanm 0:9b334a45a8ff 783 }
bogdanm 0:9b334a45a8ff 784
bogdanm 0:9b334a45a8ff 785 hrtc->State = HAL_RTC_STATE_READY ;
bogdanm 0:9b334a45a8ff 786
bogdanm 0:9b334a45a8ff 787 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 788 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 789
bogdanm 0:9b334a45a8ff 790 return HAL_OK;
bogdanm 0:9b334a45a8ff 791 }
bogdanm 0:9b334a45a8ff 792
bogdanm 0:9b334a45a8ff 793 /**
bogdanm 0:9b334a45a8ff 794 * @brief Gets RTC current date.
bogdanm 0:9b334a45a8ff 795 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 796 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 797 * @param sDate: Pointer to Date structure
bogdanm 0:9b334a45a8ff 798 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 799 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 800 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 801 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 802 * @retval HAL status
bogdanm 0:9b334a45a8ff 803 */
bogdanm 0:9b334a45a8ff 804 HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
bogdanm 0:9b334a45a8ff 805 {
bogdanm 0:9b334a45a8ff 806 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 807
bogdanm 0:9b334a45a8ff 808 /* Check input parameters */
bogdanm 0:9b334a45a8ff 809 if((hrtc == NULL) || (sDate == NULL))
bogdanm 0:9b334a45a8ff 810 {
bogdanm 0:9b334a45a8ff 811 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 812 }
bogdanm 0:9b334a45a8ff 813
bogdanm 0:9b334a45a8ff 814 /* Check the parameters */
bogdanm 0:9b334a45a8ff 815 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 816
bogdanm 0:9b334a45a8ff 817 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 818 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 819 {
bogdanm 0:9b334a45a8ff 820 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 821 }
bogdanm 0:9b334a45a8ff 822
bogdanm 0:9b334a45a8ff 823 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 824 sDate->WeekDay = hrtc->DateToUpdate.WeekDay;
bogdanm 0:9b334a45a8ff 825 sDate->Year = hrtc->DateToUpdate.Year;
bogdanm 0:9b334a45a8ff 826 sDate->Month = hrtc->DateToUpdate.Month;
bogdanm 0:9b334a45a8ff 827 sDate->Date = hrtc->DateToUpdate.Date;
bogdanm 0:9b334a45a8ff 828
bogdanm 0:9b334a45a8ff 829 /* Check the input parameters format */
bogdanm 0:9b334a45a8ff 830 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 831 {
bogdanm 0:9b334a45a8ff 832 /* Convert the date structure parameters to BCD format */
bogdanm 0:9b334a45a8ff 833 sDate->Year = (uint8_t)RTC_ByteToBcd2(sDate->Year);
bogdanm 0:9b334a45a8ff 834 sDate->Month = (uint8_t)RTC_ByteToBcd2(sDate->Month);
bogdanm 0:9b334a45a8ff 835 sDate->Date = (uint8_t)RTC_ByteToBcd2(sDate->Date);
bogdanm 0:9b334a45a8ff 836 }
bogdanm 0:9b334a45a8ff 837 return HAL_OK;
bogdanm 0:9b334a45a8ff 838 }
bogdanm 0:9b334a45a8ff 839
bogdanm 0:9b334a45a8ff 840 /**
bogdanm 0:9b334a45a8ff 841 * @}
bogdanm 0:9b334a45a8ff 842 */
bogdanm 0:9b334a45a8ff 843
bogdanm 0:9b334a45a8ff 844 /** @defgroup RTC_Exported_Functions_Group3 Alarm functions
bogdanm 0:9b334a45a8ff 845 * @brief RTC Alarm functions
bogdanm 0:9b334a45a8ff 846 *
bogdanm 0:9b334a45a8ff 847 @verbatim
bogdanm 0:9b334a45a8ff 848 ===============================================================================
bogdanm 0:9b334a45a8ff 849 ##### RTC Alarm functions #####
bogdanm 0:9b334a45a8ff 850 ===============================================================================
bogdanm 0:9b334a45a8ff 851
bogdanm 0:9b334a45a8ff 852 [..] This section provides functions allowing to configure Alarm feature
bogdanm 0:9b334a45a8ff 853
bogdanm 0:9b334a45a8ff 854 @endverbatim
bogdanm 0:9b334a45a8ff 855 * @{
bogdanm 0:9b334a45a8ff 856 */
bogdanm 0:9b334a45a8ff 857
bogdanm 0:9b334a45a8ff 858 /**
bogdanm 0:9b334a45a8ff 859 * @brief Sets the specified RTC Alarm.
bogdanm 0:9b334a45a8ff 860 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 861 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 862 * @param sAlarm: Pointer to Alarm structure
bogdanm 0:9b334a45a8ff 863 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 864 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 865 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 866 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 867 * @retval HAL status
bogdanm 0:9b334a45a8ff 868 */
bogdanm 0:9b334a45a8ff 869 HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 870 {
bogdanm 0:9b334a45a8ff 871 uint32_t counter_alarm = 0, counter_time;
bogdanm 0:9b334a45a8ff 872 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 873
bogdanm 0:9b334a45a8ff 874 /* Check input parameters */
bogdanm 0:9b334a45a8ff 875 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 876 {
bogdanm 0:9b334a45a8ff 877 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 878 }
bogdanm 0:9b334a45a8ff 879
bogdanm 0:9b334a45a8ff 880 /* Check the parameters */
bogdanm 0:9b334a45a8ff 881 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 882 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
bogdanm 0:9b334a45a8ff 883
bogdanm 0:9b334a45a8ff 884 /* Process Locked */
bogdanm 0:9b334a45a8ff 885 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 886
bogdanm 0:9b334a45a8ff 887 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 888
bogdanm 0:9b334a45a8ff 889 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 890 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 891 {
bogdanm 0:9b334a45a8ff 892 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 893 }
bogdanm 0:9b334a45a8ff 894
bogdanm 0:9b334a45a8ff 895 /* Convert time in seconds */
bogdanm 0:9b334a45a8ff 896 counter_time = (uint32_t)(((uint32_t)stime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 897 ((uint32_t)stime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 898 ((uint32_t)stime.Seconds));
bogdanm 0:9b334a45a8ff 899
bogdanm 0:9b334a45a8ff 900 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 901 {
bogdanm 0:9b334a45a8ff 902 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
bogdanm 0:9b334a45a8ff 903 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
bogdanm 0:9b334a45a8ff 904 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 905
bogdanm 0:9b334a45a8ff 906 counter_alarm = (uint32_t)(((uint32_t)sAlarm->AlarmTime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 907 ((uint32_t)sAlarm->AlarmTime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 908 ((uint32_t)sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 909 }
bogdanm 0:9b334a45a8ff 910 else
bogdanm 0:9b334a45a8ff 911 {
bogdanm 0:9b334a45a8ff 912 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
bogdanm 0:9b334a45a8ff 913 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
bogdanm 0:9b334a45a8ff 914 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 915
bogdanm 0:9b334a45a8ff 916 counter_alarm = (((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 917 ((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 918 ((uint32_t)RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 919 }
bogdanm 0:9b334a45a8ff 920
bogdanm 0:9b334a45a8ff 921 /* Check that requested alarm should expire in the same day (otherwise add 1 day) */
bogdanm 0:9b334a45a8ff 922 if (counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 923 {
bogdanm 0:9b334a45a8ff 924 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 925 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 926 }
bogdanm 0:9b334a45a8ff 927
bogdanm 0:9b334a45a8ff 928 /* Write Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 929 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 930 {
bogdanm 0:9b334a45a8ff 931 /* Set RTC state */
bogdanm 0:9b334a45a8ff 932 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 933
bogdanm 0:9b334a45a8ff 934 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 935 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 936
bogdanm 0:9b334a45a8ff 937 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 938 }
bogdanm 0:9b334a45a8ff 939 else
bogdanm 0:9b334a45a8ff 940 {
bogdanm 0:9b334a45a8ff 941 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 942
bogdanm 0:9b334a45a8ff 943 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 944
bogdanm 0:9b334a45a8ff 945 return HAL_OK;
bogdanm 0:9b334a45a8ff 946 }
bogdanm 0:9b334a45a8ff 947 }
bogdanm 0:9b334a45a8ff 948
bogdanm 0:9b334a45a8ff 949 /**
bogdanm 0:9b334a45a8ff 950 * @brief Sets the specified RTC Alarm with Interrupt
bogdanm 0:9b334a45a8ff 951 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 952 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 953 * @param sAlarm: Pointer to Alarm structure
bogdanm 0:9b334a45a8ff 954 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 955 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 956 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 957 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 958 * @note The HAL_RTC_SetTime() must be called before enabling the Alarm feature.
bogdanm 0:9b334a45a8ff 959 * @retval HAL status
bogdanm 0:9b334a45a8ff 960 */
bogdanm 0:9b334a45a8ff 961 HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 962 {
bogdanm 0:9b334a45a8ff 963 uint32_t counter_alarm = 0, counter_time;
bogdanm 0:9b334a45a8ff 964 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 965
bogdanm 0:9b334a45a8ff 966 /* Check input parameters */
bogdanm 0:9b334a45a8ff 967 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 968 {
bogdanm 0:9b334a45a8ff 969 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 970 }
bogdanm 0:9b334a45a8ff 971
bogdanm 0:9b334a45a8ff 972 /* Check the parameters */
bogdanm 0:9b334a45a8ff 973 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 974 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
bogdanm 0:9b334a45a8ff 975
bogdanm 0:9b334a45a8ff 976 /* Process Locked */
bogdanm 0:9b334a45a8ff 977 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 978
bogdanm 0:9b334a45a8ff 979 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 980
bogdanm 0:9b334a45a8ff 981 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 982 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 983 {
bogdanm 0:9b334a45a8ff 984 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 985 }
bogdanm 0:9b334a45a8ff 986
bogdanm 0:9b334a45a8ff 987 /* Convert time in seconds */
bogdanm 0:9b334a45a8ff 988 counter_time = (uint32_t)(((uint32_t)stime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 989 ((uint32_t)stime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 990 ((uint32_t)stime.Seconds));
bogdanm 0:9b334a45a8ff 991
bogdanm 0:9b334a45a8ff 992 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 993 {
bogdanm 0:9b334a45a8ff 994 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
bogdanm 0:9b334a45a8ff 995 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
bogdanm 0:9b334a45a8ff 996 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 997
bogdanm 0:9b334a45a8ff 998 counter_alarm = (uint32_t)(((uint32_t)sAlarm->AlarmTime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 999 ((uint32_t)sAlarm->AlarmTime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 1000 ((uint32_t)sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 1001 }
bogdanm 0:9b334a45a8ff 1002 else
bogdanm 0:9b334a45a8ff 1003 {
bogdanm 0:9b334a45a8ff 1004 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
bogdanm 0:9b334a45a8ff 1005 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
bogdanm 0:9b334a45a8ff 1006 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 1007
bogdanm 0:9b334a45a8ff 1008 counter_alarm = (((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 1009 ((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 1010 ((uint32_t)RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 1011 }
bogdanm 0:9b334a45a8ff 1012
bogdanm 0:9b334a45a8ff 1013 /* Check that requested alarm should expire in the same day (otherwise add 1 day) */
bogdanm 0:9b334a45a8ff 1014 if (counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 1015 {
bogdanm 0:9b334a45a8ff 1016 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 1017 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 1018 }
bogdanm 0:9b334a45a8ff 1019
bogdanm 0:9b334a45a8ff 1020 /* Write alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 1021 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 1022 {
bogdanm 0:9b334a45a8ff 1023 /* Set RTC state */
bogdanm 0:9b334a45a8ff 1024 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1025
bogdanm 0:9b334a45a8ff 1026 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1027 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1028
bogdanm 0:9b334a45a8ff 1029 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1030 }
bogdanm 0:9b334a45a8ff 1031 else
bogdanm 0:9b334a45a8ff 1032 {
bogdanm 0:9b334a45a8ff 1033 /* Clear flag alarm A */
bogdanm 0:9b334a45a8ff 1034 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1035
bogdanm 0:9b334a45a8ff 1036 /* Configure the Alarm interrupt */
bogdanm 0:9b334a45a8ff 1037 __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA);
bogdanm 0:9b334a45a8ff 1038
bogdanm 0:9b334a45a8ff 1039 /* RTC Alarm Interrupt Configuration: EXTI configuration */
bogdanm 0:9b334a45a8ff 1040 __HAL_RTC_ALARM_EXTI_ENABLE_IT();
bogdanm 0:9b334a45a8ff 1041
bogdanm 0:9b334a45a8ff 1042 __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();
bogdanm 0:9b334a45a8ff 1043
bogdanm 0:9b334a45a8ff 1044 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1045
bogdanm 0:9b334a45a8ff 1046 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1047
bogdanm 0:9b334a45a8ff 1048 return HAL_OK;
bogdanm 0:9b334a45a8ff 1049 }
bogdanm 0:9b334a45a8ff 1050 }
bogdanm 0:9b334a45a8ff 1051
bogdanm 0:9b334a45a8ff 1052 /**
bogdanm 0:9b334a45a8ff 1053 * @brief Gets the RTC Alarm value and masks.
bogdanm 0:9b334a45a8ff 1054 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1055 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1056 * @param sAlarm: Pointer to Date structure
bogdanm 0:9b334a45a8ff 1057 * @param Alarm: Specifies the Alarm.
bogdanm 0:9b334a45a8ff 1058 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1059 * @arg RTC_ALARM_A: Alarm
bogdanm 0:9b334a45a8ff 1060 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 1061 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1062 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 1063 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 1064 * @retval HAL status
bogdanm 0:9b334a45a8ff 1065 */
bogdanm 0:9b334a45a8ff 1066 HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 1067 {
bogdanm 0:9b334a45a8ff 1068 uint32_t counter_alarm = 0;
bogdanm 0:9b334a45a8ff 1069
bogdanm 0:9b334a45a8ff 1070 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1071 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 1072 {
bogdanm 0:9b334a45a8ff 1073 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1074 }
bogdanm 0:9b334a45a8ff 1075
bogdanm 0:9b334a45a8ff 1076 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1077 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 1078 assert_param(IS_RTC_ALARM(Alarm));
bogdanm 0:9b334a45a8ff 1079
bogdanm 0:9b334a45a8ff 1080 /* Read Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 1081 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 1082
bogdanm 0:9b334a45a8ff 1083 /* Fill the structure with the read parameters */
bogdanm 0:9b334a45a8ff 1084 /* Set hours in a day range (between 0 to 24)*/
bogdanm 0:9b334a45a8ff 1085 sAlarm->AlarmTime.Hours = (uint32_t)((counter_alarm / 3600) % 24);
bogdanm 0:9b334a45a8ff 1086 sAlarm->AlarmTime.Minutes = (uint32_t)((counter_alarm % 3600) / 60);
bogdanm 0:9b334a45a8ff 1087 sAlarm->AlarmTime.Seconds = (uint32_t)((counter_alarm % 3600) % 60);
bogdanm 0:9b334a45a8ff 1088
bogdanm 0:9b334a45a8ff 1089 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 1090 {
bogdanm 0:9b334a45a8ff 1091 sAlarm->AlarmTime.Hours = RTC_ByteToBcd2(sAlarm->AlarmTime.Hours);
bogdanm 0:9b334a45a8ff 1092 sAlarm->AlarmTime.Minutes = RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes);
bogdanm 0:9b334a45a8ff 1093 sAlarm->AlarmTime.Seconds = RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds);
bogdanm 0:9b334a45a8ff 1094 }
bogdanm 0:9b334a45a8ff 1095
bogdanm 0:9b334a45a8ff 1096 return HAL_OK;
bogdanm 0:9b334a45a8ff 1097 }
bogdanm 0:9b334a45a8ff 1098
bogdanm 0:9b334a45a8ff 1099 /**
bogdanm 0:9b334a45a8ff 1100 * @brief Deactive the specified RTC Alarm
bogdanm 0:9b334a45a8ff 1101 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1102 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1103 * @param Alarm: Specifies the Alarm.
bogdanm 0:9b334a45a8ff 1104 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1105 * @arg RTC_ALARM_A: AlarmA
bogdanm 0:9b334a45a8ff 1106 * @retval HAL status
bogdanm 0:9b334a45a8ff 1107 */
bogdanm 0:9b334a45a8ff 1108 HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm)
bogdanm 0:9b334a45a8ff 1109 {
bogdanm 0:9b334a45a8ff 1110 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1111 assert_param(IS_RTC_ALARM(Alarm));
bogdanm 0:9b334a45a8ff 1112
bogdanm 0:9b334a45a8ff 1113 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1114 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1115 {
bogdanm 0:9b334a45a8ff 1116 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1117 }
bogdanm 0:9b334a45a8ff 1118
bogdanm 0:9b334a45a8ff 1119 /* Process Locked */
bogdanm 0:9b334a45a8ff 1120 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 1121
bogdanm 0:9b334a45a8ff 1122 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1123
bogdanm 0:9b334a45a8ff 1124 /* In case of interrupt mode is used, the interrupt source must disabled */
bogdanm 0:9b334a45a8ff 1125 __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA);
bogdanm 0:9b334a45a8ff 1126
bogdanm 0:9b334a45a8ff 1127 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1128 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1129 {
bogdanm 0:9b334a45a8ff 1130 /* Set RTC state */
bogdanm 0:9b334a45a8ff 1131 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1132
bogdanm 0:9b334a45a8ff 1133 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1134 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1135
bogdanm 0:9b334a45a8ff 1136 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1137 }
bogdanm 0:9b334a45a8ff 1138 else
bogdanm 0:9b334a45a8ff 1139 {
bogdanm 0:9b334a45a8ff 1140 /* Clear flag alarm A */
bogdanm 0:9b334a45a8ff 1141 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1142
bogdanm 0:9b334a45a8ff 1143 /* Set to default values ALRH & ALRL registers */
bogdanm 0:9b334a45a8ff 1144 WRITE_REG(hrtc->Instance->ALRH, RTC_ALARM_RESETVALUE_REGISTER);
bogdanm 0:9b334a45a8ff 1145 WRITE_REG(hrtc->Instance->ALRL, RTC_ALARM_RESETVALUE_REGISTER);
bogdanm 0:9b334a45a8ff 1146
bogdanm 0:9b334a45a8ff 1147 /* RTC Alarm Interrupt Configuration: Disable EXTI configuration */
bogdanm 0:9b334a45a8ff 1148 __HAL_RTC_ALARM_EXTI_DISABLE_IT();
bogdanm 0:9b334a45a8ff 1149
bogdanm 0:9b334a45a8ff 1150 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1151 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1152 {
bogdanm 0:9b334a45a8ff 1153 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1154
bogdanm 0:9b334a45a8ff 1155 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1156 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1157
bogdanm 0:9b334a45a8ff 1158 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1159 }
bogdanm 0:9b334a45a8ff 1160 }
bogdanm 0:9b334a45a8ff 1161 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1162
bogdanm 0:9b334a45a8ff 1163 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1164 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1165
bogdanm 0:9b334a45a8ff 1166 return HAL_OK;
bogdanm 0:9b334a45a8ff 1167 }
bogdanm 0:9b334a45a8ff 1168
bogdanm 0:9b334a45a8ff 1169 /**
bogdanm 0:9b334a45a8ff 1170 * @brief This function handles Alarm interrupt request.
bogdanm 0:9b334a45a8ff 1171 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1172 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1173 * @retval None
bogdanm 0:9b334a45a8ff 1174 */
bogdanm 0:9b334a45a8ff 1175 void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1176 {
bogdanm 0:9b334a45a8ff 1177 if(__HAL_RTC_ALARM_GET_IT_SOURCE(hrtc, RTC_IT_ALRA))
bogdanm 0:9b334a45a8ff 1178 {
bogdanm 0:9b334a45a8ff 1179 /* Get the status of the Interrupt */
bogdanm 0:9b334a45a8ff 1180 if(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) != (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1181 {
bogdanm 0:9b334a45a8ff 1182 /* AlarmA callback */
bogdanm 0:9b334a45a8ff 1183 HAL_RTC_AlarmAEventCallback(hrtc);
bogdanm 0:9b334a45a8ff 1184
bogdanm 0:9b334a45a8ff 1185 /* Clear the Alarm interrupt pending bit */
bogdanm 0:9b334a45a8ff 1186 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc,RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1187 }
bogdanm 0:9b334a45a8ff 1188 }
bogdanm 0:9b334a45a8ff 1189
bogdanm 0:9b334a45a8ff 1190 /* Clear the EXTI's line Flag for RTC Alarm */
bogdanm 0:9b334a45a8ff 1191 __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();
bogdanm 0:9b334a45a8ff 1192
bogdanm 0:9b334a45a8ff 1193 /* Change RTC state */
bogdanm 0:9b334a45a8ff 1194 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1195 }
bogdanm 0:9b334a45a8ff 1196
bogdanm 0:9b334a45a8ff 1197 /**
bogdanm 0:9b334a45a8ff 1198 * @brief Alarm A callback.
bogdanm 0:9b334a45a8ff 1199 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1200 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1201 * @retval None
bogdanm 0:9b334a45a8ff 1202 */
bogdanm 0:9b334a45a8ff 1203 __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
bogdanm 0:9b334a45a8ff 1204 {
mbed_official 124:6a4a5b7d7324 1205 /* Prevent unused argument(s) compilation warning */
mbed_official 124:6a4a5b7d7324 1206 UNUSED(hrtc);
bogdanm 0:9b334a45a8ff 1207 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1208 the HAL_RTC_AlarmAEventCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 1209 */
bogdanm 0:9b334a45a8ff 1210 }
bogdanm 0:9b334a45a8ff 1211
bogdanm 0:9b334a45a8ff 1212 /**
bogdanm 0:9b334a45a8ff 1213 * @brief This function handles AlarmA Polling request.
bogdanm 0:9b334a45a8ff 1214 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1215 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1216 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 1217 * @retval HAL status
bogdanm 0:9b334a45a8ff 1218 */
bogdanm 0:9b334a45a8ff 1219 HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1220 {
bogdanm 0:9b334a45a8ff 1221 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1222
bogdanm 0:9b334a45a8ff 1223 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1224 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1225 {
bogdanm 0:9b334a45a8ff 1226 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1227 }
bogdanm 0:9b334a45a8ff 1228
bogdanm 0:9b334a45a8ff 1229 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) == RESET)
bogdanm 0:9b334a45a8ff 1230 {
bogdanm 0:9b334a45a8ff 1231 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1232 {
bogdanm 0:9b334a45a8ff 1233 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1234 {
bogdanm 0:9b334a45a8ff 1235 hrtc->State = HAL_RTC_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1236 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1237 }
bogdanm 0:9b334a45a8ff 1238 }
bogdanm 0:9b334a45a8ff 1239 }
bogdanm 0:9b334a45a8ff 1240
bogdanm 0:9b334a45a8ff 1241 /* Clear the Alarm interrupt pending bit */
bogdanm 0:9b334a45a8ff 1242 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1243
bogdanm 0:9b334a45a8ff 1244 /* Change RTC state */
bogdanm 0:9b334a45a8ff 1245 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1246
bogdanm 0:9b334a45a8ff 1247 return HAL_OK;
bogdanm 0:9b334a45a8ff 1248 }
bogdanm 0:9b334a45a8ff 1249
bogdanm 0:9b334a45a8ff 1250 /**
bogdanm 0:9b334a45a8ff 1251 * @}
bogdanm 0:9b334a45a8ff 1252 */
bogdanm 0:9b334a45a8ff 1253
bogdanm 0:9b334a45a8ff 1254 /** @defgroup RTC_Exported_Functions_Group4 Peripheral State functions
bogdanm 0:9b334a45a8ff 1255 * @brief Peripheral State functions
bogdanm 0:9b334a45a8ff 1256 *
bogdanm 0:9b334a45a8ff 1257 @verbatim
bogdanm 0:9b334a45a8ff 1258 ===============================================================================
bogdanm 0:9b334a45a8ff 1259 ##### Peripheral State functions #####
bogdanm 0:9b334a45a8ff 1260 ===============================================================================
bogdanm 0:9b334a45a8ff 1261 [..]
bogdanm 0:9b334a45a8ff 1262 This subsection provides functions allowing to
bogdanm 0:9b334a45a8ff 1263 (+) Get RTC state
bogdanm 0:9b334a45a8ff 1264
bogdanm 0:9b334a45a8ff 1265 @endverbatim
bogdanm 0:9b334a45a8ff 1266 * @{
bogdanm 0:9b334a45a8ff 1267 */
bogdanm 0:9b334a45a8ff 1268 /**
bogdanm 0:9b334a45a8ff 1269 * @brief Returns the RTC state.
bogdanm 0:9b334a45a8ff 1270 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1271 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1272 * @retval HAL state
bogdanm 0:9b334a45a8ff 1273 */
bogdanm 0:9b334a45a8ff 1274 HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1275 {
bogdanm 0:9b334a45a8ff 1276 return hrtc->State;
bogdanm 0:9b334a45a8ff 1277 }
bogdanm 0:9b334a45a8ff 1278
bogdanm 0:9b334a45a8ff 1279 /**
bogdanm 0:9b334a45a8ff 1280 * @}
bogdanm 0:9b334a45a8ff 1281 */
bogdanm 0:9b334a45a8ff 1282
bogdanm 0:9b334a45a8ff 1283 /** @defgroup RTC_Exported_Functions_Group5 Peripheral Control functions
bogdanm 0:9b334a45a8ff 1284 * @brief Peripheral Control functions
bogdanm 0:9b334a45a8ff 1285 *
bogdanm 0:9b334a45a8ff 1286 @verbatim
bogdanm 0:9b334a45a8ff 1287 ===============================================================================
bogdanm 0:9b334a45a8ff 1288 ##### Peripheral Control functions #####
bogdanm 0:9b334a45a8ff 1289 ===============================================================================
bogdanm 0:9b334a45a8ff 1290 [..]
bogdanm 0:9b334a45a8ff 1291 This subsection provides functions allowing to
bogdanm 0:9b334a45a8ff 1292 (+) Wait for RTC Time and Date Synchronization
bogdanm 0:9b334a45a8ff 1293
bogdanm 0:9b334a45a8ff 1294 @endverbatim
bogdanm 0:9b334a45a8ff 1295 * @{
bogdanm 0:9b334a45a8ff 1296 */
bogdanm 0:9b334a45a8ff 1297
bogdanm 0:9b334a45a8ff 1298 /**
bogdanm 0:9b334a45a8ff 1299 * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL)
bogdanm 0:9b334a45a8ff 1300 * are synchronized with RTC APB clock.
bogdanm 0:9b334a45a8ff 1301 * @note This function must be called before any read operation after an APB reset
bogdanm 0:9b334a45a8ff 1302 * or an APB clock stop.
bogdanm 0:9b334a45a8ff 1303 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1304 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1305 * @retval HAL status
bogdanm 0:9b334a45a8ff 1306 */
bogdanm 0:9b334a45a8ff 1307 HAL_StatusTypeDef HAL_RTC_WaitForSynchro(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1308 {
bogdanm 0:9b334a45a8ff 1309 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1310
bogdanm 0:9b334a45a8ff 1311 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1312 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1313 {
bogdanm 0:9b334a45a8ff 1314 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1315 }
bogdanm 0:9b334a45a8ff 1316
bogdanm 0:9b334a45a8ff 1317 /* Clear RSF flag */
bogdanm 0:9b334a45a8ff 1318 CLEAR_BIT(hrtc->Instance->CRL, RTC_FLAG_RSF);
bogdanm 0:9b334a45a8ff 1319
bogdanm 0:9b334a45a8ff 1320 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1321
bogdanm 0:9b334a45a8ff 1322 /* Wait the registers to be synchronised */
bogdanm 0:9b334a45a8ff 1323 while((hrtc->Instance->CRL & RTC_FLAG_RSF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1324 {
bogdanm 0:9b334a45a8ff 1325 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1326 {
bogdanm 0:9b334a45a8ff 1327 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1328 }
bogdanm 0:9b334a45a8ff 1329 }
bogdanm 0:9b334a45a8ff 1330
bogdanm 0:9b334a45a8ff 1331 return HAL_OK;
bogdanm 0:9b334a45a8ff 1332 }
bogdanm 0:9b334a45a8ff 1333
bogdanm 0:9b334a45a8ff 1334 /**
bogdanm 0:9b334a45a8ff 1335 * @}
bogdanm 0:9b334a45a8ff 1336 */
bogdanm 0:9b334a45a8ff 1337
bogdanm 0:9b334a45a8ff 1338
bogdanm 0:9b334a45a8ff 1339 /**
bogdanm 0:9b334a45a8ff 1340 * @}
bogdanm 0:9b334a45a8ff 1341 */
bogdanm 0:9b334a45a8ff 1342
bogdanm 0:9b334a45a8ff 1343 /** @addtogroup RTC_Private_Functions
bogdanm 0:9b334a45a8ff 1344 * @{
bogdanm 0:9b334a45a8ff 1345 */
bogdanm 0:9b334a45a8ff 1346
bogdanm 0:9b334a45a8ff 1347
bogdanm 0:9b334a45a8ff 1348 /**
bogdanm 0:9b334a45a8ff 1349 * @brief Read the time counter available in RTC_CNT registers.
bogdanm 0:9b334a45a8ff 1350 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1351 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1352 * @retval Time counter
bogdanm 0:9b334a45a8ff 1353 */
bogdanm 0:9b334a45a8ff 1354 static uint32_t RTC_ReadTimeCounter(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1355 {
bogdanm 0:9b334a45a8ff 1356 uint16_t high1 = 0, high2 = 0, low = 0;
bogdanm 0:9b334a45a8ff 1357 uint32_t timecounter = 0;
bogdanm 0:9b334a45a8ff 1358
bogdanm 0:9b334a45a8ff 1359 high1 = READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1360 low = READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT);
bogdanm 0:9b334a45a8ff 1361 high2 = READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1362
bogdanm 0:9b334a45a8ff 1363 if (high1 != high2)
bogdanm 0:9b334a45a8ff 1364 { /* In this case the counter roll over during reading of CNTL and CNTH registers,
bogdanm 0:9b334a45a8ff 1365 read again CNTL register then return the counter value */
bogdanm 0:9b334a45a8ff 1366 timecounter = (((uint32_t) high2 << 16 ) | READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT));
bogdanm 0:9b334a45a8ff 1367 }
bogdanm 0:9b334a45a8ff 1368 else
bogdanm 0:9b334a45a8ff 1369 { /* No counter roll over during reading of CNTL and CNTH registers, counter
bogdanm 0:9b334a45a8ff 1370 value is equal to first value of CNTL and CNTH */
bogdanm 0:9b334a45a8ff 1371 timecounter = (((uint32_t) high1 << 16 ) | low);
bogdanm 0:9b334a45a8ff 1372 }
bogdanm 0:9b334a45a8ff 1373
bogdanm 0:9b334a45a8ff 1374 return timecounter;
bogdanm 0:9b334a45a8ff 1375 }
bogdanm 0:9b334a45a8ff 1376
bogdanm 0:9b334a45a8ff 1377 /**
bogdanm 0:9b334a45a8ff 1378 * @brief Write the time counter in RTC_CNT registers.
bogdanm 0:9b334a45a8ff 1379 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1380 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1381 * @param TimeCounter: Counter to write in RTC_CNT registers
bogdanm 0:9b334a45a8ff 1382 * @retval HAL status
bogdanm 0:9b334a45a8ff 1383 */
bogdanm 0:9b334a45a8ff 1384 static HAL_StatusTypeDef RTC_WriteTimeCounter(RTC_HandleTypeDef* hrtc, uint32_t TimeCounter)
bogdanm 0:9b334a45a8ff 1385 {
bogdanm 0:9b334a45a8ff 1386 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1387
bogdanm 0:9b334a45a8ff 1388 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1389 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1390 {
bogdanm 0:9b334a45a8ff 1391 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1392 }
bogdanm 0:9b334a45a8ff 1393 else
bogdanm 0:9b334a45a8ff 1394 {
bogdanm 0:9b334a45a8ff 1395 /* Set RTC COUNTER MSB word */
bogdanm 0:9b334a45a8ff 1396 WRITE_REG(hrtc->Instance->CNTH, (TimeCounter >> 16));
bogdanm 0:9b334a45a8ff 1397 /* Set RTC COUNTER LSB word */
bogdanm 0:9b334a45a8ff 1398 WRITE_REG(hrtc->Instance->CNTL, (TimeCounter & RTC_CNTL_RTC_CNT));
bogdanm 0:9b334a45a8ff 1399
bogdanm 0:9b334a45a8ff 1400 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1401 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1402 {
bogdanm 0:9b334a45a8ff 1403 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1404 }
bogdanm 0:9b334a45a8ff 1405 }
bogdanm 0:9b334a45a8ff 1406
bogdanm 0:9b334a45a8ff 1407 return status;
bogdanm 0:9b334a45a8ff 1408 }
bogdanm 0:9b334a45a8ff 1409
bogdanm 0:9b334a45a8ff 1410 /**
bogdanm 0:9b334a45a8ff 1411 * @brief Read the time counter available in RTC_ALR registers.
bogdanm 0:9b334a45a8ff 1412 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1413 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1414 * @retval Time counter
bogdanm 0:9b334a45a8ff 1415 */
bogdanm 0:9b334a45a8ff 1416 static uint32_t RTC_ReadAlarmCounter(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1417 {
bogdanm 0:9b334a45a8ff 1418 uint16_t high1 = 0, low = 0;
bogdanm 0:9b334a45a8ff 1419
bogdanm 0:9b334a45a8ff 1420 high1 = READ_REG(hrtc->Instance->ALRH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1421 low = READ_REG(hrtc->Instance->ALRL & RTC_CNTL_RTC_CNT);
bogdanm 0:9b334a45a8ff 1422
bogdanm 0:9b334a45a8ff 1423 return (((uint32_t) high1 << 16 ) | low);
bogdanm 0:9b334a45a8ff 1424 }
bogdanm 0:9b334a45a8ff 1425
bogdanm 0:9b334a45a8ff 1426 /**
bogdanm 0:9b334a45a8ff 1427 * @brief Write the time counter in RTC_ALR registers.
bogdanm 0:9b334a45a8ff 1428 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1429 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1430 * @param AlarmCounter: Counter to write in RTC_ALR registers
bogdanm 0:9b334a45a8ff 1431 * @retval HAL status
bogdanm 0:9b334a45a8ff 1432 */
bogdanm 0:9b334a45a8ff 1433 static HAL_StatusTypeDef RTC_WriteAlarmCounter(RTC_HandleTypeDef* hrtc, uint32_t AlarmCounter)
bogdanm 0:9b334a45a8ff 1434 {
bogdanm 0:9b334a45a8ff 1435 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1436
bogdanm 0:9b334a45a8ff 1437 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1438 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1439 {
bogdanm 0:9b334a45a8ff 1440 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1441 }
bogdanm 0:9b334a45a8ff 1442 else
bogdanm 0:9b334a45a8ff 1443 {
bogdanm 0:9b334a45a8ff 1444 /* Set RTC COUNTER MSB word */
bogdanm 0:9b334a45a8ff 1445 WRITE_REG(hrtc->Instance->ALRH, (AlarmCounter >> 16));
bogdanm 0:9b334a45a8ff 1446 /* Set RTC COUNTER LSB word */
bogdanm 0:9b334a45a8ff 1447 WRITE_REG(hrtc->Instance->ALRL, (AlarmCounter & RTC_ALRL_RTC_ALR));
bogdanm 0:9b334a45a8ff 1448
bogdanm 0:9b334a45a8ff 1449 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1450 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1451 {
bogdanm 0:9b334a45a8ff 1452 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1453 }
bogdanm 0:9b334a45a8ff 1454 }
bogdanm 0:9b334a45a8ff 1455
bogdanm 0:9b334a45a8ff 1456 return status;
bogdanm 0:9b334a45a8ff 1457 }
bogdanm 0:9b334a45a8ff 1458
bogdanm 0:9b334a45a8ff 1459 /**
bogdanm 0:9b334a45a8ff 1460 * @brief Enters the RTC Initialization mode.
bogdanm 0:9b334a45a8ff 1461 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1462 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1463 * @retval HAL status
bogdanm 0:9b334a45a8ff 1464 */
bogdanm 0:9b334a45a8ff 1465 static HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1466 {
bogdanm 0:9b334a45a8ff 1467 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1468
bogdanm 0:9b334a45a8ff 1469 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1470 /* Wait till RTC is in INIT state and if Time out is reached exit */
bogdanm 0:9b334a45a8ff 1471 while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1472 {
bogdanm 0:9b334a45a8ff 1473 if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1474 {
bogdanm 0:9b334a45a8ff 1475 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1476 }
bogdanm 0:9b334a45a8ff 1477 }
bogdanm 0:9b334a45a8ff 1478
bogdanm 0:9b334a45a8ff 1479 /* Disable the write protection for RTC registers */
bogdanm 0:9b334a45a8ff 1480 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
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 * @brief Exit the RTC Initialization mode.
bogdanm 0:9b334a45a8ff 1488 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1489 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1490 * @retval HAL status
bogdanm 0:9b334a45a8ff 1491 */
bogdanm 0:9b334a45a8ff 1492 static HAL_StatusTypeDef RTC_ExitInitMode(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1493 {
bogdanm 0:9b334a45a8ff 1494 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1495
bogdanm 0:9b334a45a8ff 1496 /* Disable the write protection for RTC registers */
bogdanm 0:9b334a45a8ff 1497 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
bogdanm 0:9b334a45a8ff 1498
bogdanm 0:9b334a45a8ff 1499 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1500 /* Wait till RTC is in INIT state and if Time out is reached exit */
bogdanm 0:9b334a45a8ff 1501 while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1502 {
bogdanm 0:9b334a45a8ff 1503 if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1504 {
bogdanm 0:9b334a45a8ff 1505 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1506 }
bogdanm 0:9b334a45a8ff 1507 }
bogdanm 0:9b334a45a8ff 1508
bogdanm 0:9b334a45a8ff 1509 return HAL_OK;
bogdanm 0:9b334a45a8ff 1510 }
bogdanm 0:9b334a45a8ff 1511
bogdanm 0:9b334a45a8ff 1512 /**
bogdanm 0:9b334a45a8ff 1513 * @brief Converts a 2 digit decimal to BCD format.
bogdanm 0:9b334a45a8ff 1514 * @param Value: Byte to be converted
bogdanm 0:9b334a45a8ff 1515 * @retval Converted byte
bogdanm 0:9b334a45a8ff 1516 */
bogdanm 0:9b334a45a8ff 1517 static uint8_t RTC_ByteToBcd2(uint8_t Value)
bogdanm 0:9b334a45a8ff 1518 {
bogdanm 0:9b334a45a8ff 1519 uint32_t bcdhigh = 0;
bogdanm 0:9b334a45a8ff 1520
bogdanm 0:9b334a45a8ff 1521 while(Value >= 10)
bogdanm 0:9b334a45a8ff 1522 {
bogdanm 0:9b334a45a8ff 1523 bcdhigh++;
bogdanm 0:9b334a45a8ff 1524 Value -= 10;
bogdanm 0:9b334a45a8ff 1525 }
bogdanm 0:9b334a45a8ff 1526
bogdanm 0:9b334a45a8ff 1527 return ((uint8_t)(bcdhigh << 4) | Value);
bogdanm 0:9b334a45a8ff 1528 }
bogdanm 0:9b334a45a8ff 1529
bogdanm 0:9b334a45a8ff 1530 /**
bogdanm 0:9b334a45a8ff 1531 * @brief Converts from 2 digit BCD to Binary.
bogdanm 0:9b334a45a8ff 1532 * @param Value: BCD value to be converted
bogdanm 0:9b334a45a8ff 1533 * @retval Converted word
bogdanm 0:9b334a45a8ff 1534 */
bogdanm 0:9b334a45a8ff 1535 static uint8_t RTC_Bcd2ToByte(uint8_t Value)
bogdanm 0:9b334a45a8ff 1536 {
bogdanm 0:9b334a45a8ff 1537 uint32_t tmp = 0;
bogdanm 0:9b334a45a8ff 1538 tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
bogdanm 0:9b334a45a8ff 1539 return (tmp + (Value & (uint8_t)0x0F));
bogdanm 0:9b334a45a8ff 1540 }
bogdanm 0:9b334a45a8ff 1541
bogdanm 0:9b334a45a8ff 1542 /**
bogdanm 0:9b334a45a8ff 1543 * @brief Updates date when time is 23:59:59.
bogdanm 0:9b334a45a8ff 1544 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1545 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1546 * @param DayElapsed: Number of days elapsed from last date update
bogdanm 0:9b334a45a8ff 1547 * @retval None
bogdanm 0:9b334a45a8ff 1548 */
bogdanm 0:9b334a45a8ff 1549 static void RTC_DateUpdate(RTC_HandleTypeDef* hrtc, uint32_t DayElapsed)
bogdanm 0:9b334a45a8ff 1550 {
bogdanm 0:9b334a45a8ff 1551 uint32_t year = 0, month = 0, day = 0;
bogdanm 0:9b334a45a8ff 1552 uint32_t loop = 0;
bogdanm 0:9b334a45a8ff 1553
bogdanm 0:9b334a45a8ff 1554 /* Get the current year*/
bogdanm 0:9b334a45a8ff 1555 year = hrtc->DateToUpdate.Year;
bogdanm 0:9b334a45a8ff 1556
bogdanm 0:9b334a45a8ff 1557 /* Get the current month and day */
bogdanm 0:9b334a45a8ff 1558 month = hrtc->DateToUpdate.Month;
bogdanm 0:9b334a45a8ff 1559 day = hrtc->DateToUpdate.Date;
bogdanm 0:9b334a45a8ff 1560
bogdanm 0:9b334a45a8ff 1561 for (loop = 0; loop < DayElapsed; loop++)
bogdanm 0:9b334a45a8ff 1562 {
bogdanm 0:9b334a45a8ff 1563 if((month == 1) || (month == 3) || (month == 5) || (month == 7) || \
bogdanm 0:9b334a45a8ff 1564 (month == 8) || (month == 10) || (month == 12))
bogdanm 0:9b334a45a8ff 1565 {
bogdanm 0:9b334a45a8ff 1566 if(day < 31)
bogdanm 0:9b334a45a8ff 1567 {
bogdanm 0:9b334a45a8ff 1568 day++;
bogdanm 0:9b334a45a8ff 1569 }
bogdanm 0:9b334a45a8ff 1570 /* Date structure member: day = 31 */
bogdanm 0:9b334a45a8ff 1571 else
bogdanm 0:9b334a45a8ff 1572 {
bogdanm 0:9b334a45a8ff 1573 if(month != 12)
bogdanm 0:9b334a45a8ff 1574 {
bogdanm 0:9b334a45a8ff 1575 month++;
bogdanm 0:9b334a45a8ff 1576 day = 1;
bogdanm 0:9b334a45a8ff 1577 }
bogdanm 0:9b334a45a8ff 1578 /* Date structure member: day = 31 & month =12 */
bogdanm 0:9b334a45a8ff 1579 else
bogdanm 0:9b334a45a8ff 1580 {
bogdanm 0:9b334a45a8ff 1581 month = 1;
bogdanm 0:9b334a45a8ff 1582 day = 1;
bogdanm 0:9b334a45a8ff 1583 year++;
bogdanm 0:9b334a45a8ff 1584 }
bogdanm 0:9b334a45a8ff 1585 }
bogdanm 0:9b334a45a8ff 1586 }
bogdanm 0:9b334a45a8ff 1587 else if((month == 4) || (month == 6) || (month == 9) || (month == 11))
bogdanm 0:9b334a45a8ff 1588 {
bogdanm 0:9b334a45a8ff 1589 if(day < 30)
bogdanm 0:9b334a45a8ff 1590 {
bogdanm 0:9b334a45a8ff 1591 day++;
bogdanm 0:9b334a45a8ff 1592 }
bogdanm 0:9b334a45a8ff 1593 /* Date structure member: day = 30 */
bogdanm 0:9b334a45a8ff 1594 else
bogdanm 0:9b334a45a8ff 1595 {
bogdanm 0:9b334a45a8ff 1596 month++;
bogdanm 0:9b334a45a8ff 1597 day = 1;
bogdanm 0:9b334a45a8ff 1598 }
bogdanm 0:9b334a45a8ff 1599 }
bogdanm 0:9b334a45a8ff 1600 else if(month == 2)
bogdanm 0:9b334a45a8ff 1601 {
bogdanm 0:9b334a45a8ff 1602 if(day < 28)
bogdanm 0:9b334a45a8ff 1603 {
bogdanm 0:9b334a45a8ff 1604 day++;
bogdanm 0:9b334a45a8ff 1605 }
bogdanm 0:9b334a45a8ff 1606 else if(day == 28)
bogdanm 0:9b334a45a8ff 1607 {
bogdanm 0:9b334a45a8ff 1608 /* Leap year */
bogdanm 0:9b334a45a8ff 1609 if(RTC_IsLeapYear(year))
bogdanm 0:9b334a45a8ff 1610 {
bogdanm 0:9b334a45a8ff 1611 day++;
bogdanm 0:9b334a45a8ff 1612 }
bogdanm 0:9b334a45a8ff 1613 else
bogdanm 0:9b334a45a8ff 1614 {
bogdanm 0:9b334a45a8ff 1615 month++;
bogdanm 0:9b334a45a8ff 1616 day = 1;
bogdanm 0:9b334a45a8ff 1617 }
bogdanm 0:9b334a45a8ff 1618 }
bogdanm 0:9b334a45a8ff 1619 else if(day == 29)
bogdanm 0:9b334a45a8ff 1620 {
bogdanm 0:9b334a45a8ff 1621 month++;
bogdanm 0:9b334a45a8ff 1622 day = 1;
bogdanm 0:9b334a45a8ff 1623 }
bogdanm 0:9b334a45a8ff 1624 }
bogdanm 0:9b334a45a8ff 1625 }
bogdanm 0:9b334a45a8ff 1626
bogdanm 0:9b334a45a8ff 1627 /* Update year */
bogdanm 0:9b334a45a8ff 1628 hrtc->DateToUpdate.Year = year;
bogdanm 0:9b334a45a8ff 1629
bogdanm 0:9b334a45a8ff 1630 /* Update day and month */
bogdanm 0:9b334a45a8ff 1631 hrtc->DateToUpdate.Month = month;
bogdanm 0:9b334a45a8ff 1632 hrtc->DateToUpdate.Date = day;
bogdanm 0:9b334a45a8ff 1633
bogdanm 0:9b334a45a8ff 1634 /* Update day of the week */
bogdanm 0:9b334a45a8ff 1635 hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(year, month, day);
bogdanm 0:9b334a45a8ff 1636 }
bogdanm 0:9b334a45a8ff 1637
bogdanm 0:9b334a45a8ff 1638 /**
bogdanm 0:9b334a45a8ff 1639 * @brief Check whether the passed year is Leap or not.
bogdanm 0:9b334a45a8ff 1640 * @param nYear year to check
bogdanm 0:9b334a45a8ff 1641 * @retval 1: leap year
bogdanm 0:9b334a45a8ff 1642 * 0: not leap year
bogdanm 0:9b334a45a8ff 1643 */
bogdanm 0:9b334a45a8ff 1644 static uint8_t RTC_IsLeapYear(uint16_t nYear)
bogdanm 0:9b334a45a8ff 1645 {
bogdanm 0:9b334a45a8ff 1646 if((nYear % 4) != 0)
bogdanm 0:9b334a45a8ff 1647 {
bogdanm 0:9b334a45a8ff 1648 return 0;
bogdanm 0:9b334a45a8ff 1649 }
bogdanm 0:9b334a45a8ff 1650
bogdanm 0:9b334a45a8ff 1651 if((nYear % 100) != 0)
bogdanm 0:9b334a45a8ff 1652 {
bogdanm 0:9b334a45a8ff 1653 return 1;
bogdanm 0:9b334a45a8ff 1654 }
bogdanm 0:9b334a45a8ff 1655
bogdanm 0:9b334a45a8ff 1656 if((nYear % 400) == 0)
bogdanm 0:9b334a45a8ff 1657 {
bogdanm 0:9b334a45a8ff 1658 return 1;
bogdanm 0:9b334a45a8ff 1659 }
bogdanm 0:9b334a45a8ff 1660 else
bogdanm 0:9b334a45a8ff 1661 {
bogdanm 0:9b334a45a8ff 1662 return 0;
bogdanm 0:9b334a45a8ff 1663 }
bogdanm 0:9b334a45a8ff 1664 }
bogdanm 0:9b334a45a8ff 1665
bogdanm 0:9b334a45a8ff 1666 /**
bogdanm 0:9b334a45a8ff 1667 * @brief Determines the week number, the day number and the week day number.
bogdanm 0:9b334a45a8ff 1668 * @param nYear year to check
bogdanm 0:9b334a45a8ff 1669 * @param nMonth Month to check
bogdanm 0:9b334a45a8ff 1670 * @param nDay Day to check
bogdanm 0:9b334a45a8ff 1671 * @note Day is calculated with hypothesis that year > 2000
bogdanm 0:9b334a45a8ff 1672 * @retval Value which can take one of the following parameters:
bogdanm 0:9b334a45a8ff 1673 * @arg RTC_WEEKDAY_MONDAY
bogdanm 0:9b334a45a8ff 1674 * @arg RTC_WEEKDAY_TUESDAY
bogdanm 0:9b334a45a8ff 1675 * @arg RTC_WEEKDAY_WEDNESDAY
bogdanm 0:9b334a45a8ff 1676 * @arg RTC_WEEKDAY_THURSDAY
bogdanm 0:9b334a45a8ff 1677 * @arg RTC_WEEKDAY_FRIDAY
bogdanm 0:9b334a45a8ff 1678 * @arg RTC_WEEKDAY_SATURDAY
bogdanm 0:9b334a45a8ff 1679 * @arg RTC_WEEKDAY_SUNDAY
bogdanm 0:9b334a45a8ff 1680 */
bogdanm 0:9b334a45a8ff 1681 static uint8_t RTC_WeekDayNum(uint32_t nYear, uint8_t nMonth, uint8_t nDay)
bogdanm 0:9b334a45a8ff 1682 {
bogdanm 0:9b334a45a8ff 1683 uint32_t year = 0, weekday = 0;
bogdanm 0:9b334a45a8ff 1684
bogdanm 0:9b334a45a8ff 1685 year = 2000 + nYear;
bogdanm 0:9b334a45a8ff 1686
bogdanm 0:9b334a45a8ff 1687 if(nMonth < 3)
bogdanm 0:9b334a45a8ff 1688 {
bogdanm 0:9b334a45a8ff 1689 /*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
bogdanm 0:9b334a45a8ff 1690 weekday = (((23 * nMonth)/9) + nDay + 4 + year + ((year-1)/4) - ((year-1)/100) + ((year-1)/400)) % 7;
bogdanm 0:9b334a45a8ff 1691 }
bogdanm 0:9b334a45a8ff 1692 else
bogdanm 0:9b334a45a8ff 1693 {
bogdanm 0:9b334a45a8ff 1694 /*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
bogdanm 0:9b334a45a8ff 1695 weekday = (((23 * nMonth)/9) + nDay + 4 + year + (year/4) - (year/100) + (year/400) - 2 ) % 7;
bogdanm 0:9b334a45a8ff 1696 }
bogdanm 0:9b334a45a8ff 1697
bogdanm 0:9b334a45a8ff 1698 return (uint8_t)weekday;
bogdanm 0:9b334a45a8ff 1699 }
bogdanm 0:9b334a45a8ff 1700
bogdanm 0:9b334a45a8ff 1701 /**
bogdanm 0:9b334a45a8ff 1702 * @}
bogdanm 0:9b334a45a8ff 1703 */
bogdanm 0:9b334a45a8ff 1704
bogdanm 0:9b334a45a8ff 1705 #endif /* HAL_RTC_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1706 /**
bogdanm 0:9b334a45a8ff 1707 * @}
bogdanm 0:9b334a45a8ff 1708 */
bogdanm 0:9b334a45a8ff 1709
bogdanm 0:9b334a45a8ff 1710 /**
bogdanm 0:9b334a45a8ff 1711 * @}
bogdanm 0:9b334a45a8ff 1712 */
bogdanm 0:9b334a45a8ff 1713
bogdanm 0:9b334a45a8ff 1714 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/