fix LPC812 PWM

Dependents:   IR_LED_Send

Fork of mbed-dev by mbed official

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

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /**
bogdanm 0:9b334a45a8ff 2 ******************************************************************************
bogdanm 0:9b334a45a8ff 3 * @file stm32f1xx_hal_rtc.c
bogdanm 0:9b334a45a8ff 4 * @author MCD Application Team
bogdanm 0:9b334a45a8ff 5 * @version V1.0.0
bogdanm 0:9b334a45a8ff 6 * @date 15-December-2014
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 *
bogdanm 0:9b334a45a8ff 127 * <h2><center>&copy; COPYRIGHT(c) 2014 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 */
bogdanm 0:9b334a45a8ff 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 {
bogdanm 0:9b334a45a8ff 429 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 430 the HAL_RTC_MspInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 431 */
bogdanm 0:9b334a45a8ff 432 }
bogdanm 0:9b334a45a8ff 433
bogdanm 0:9b334a45a8ff 434 /**
bogdanm 0:9b334a45a8ff 435 * @brief DeInitializes the RTC MSP.
bogdanm 0:9b334a45a8ff 436 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 437 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 438 * @retval None
bogdanm 0:9b334a45a8ff 439 */
bogdanm 0:9b334a45a8ff 440 __weak void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 441 {
bogdanm 0:9b334a45a8ff 442 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 443 the HAL_RTC_MspDeInit could be implemented in the user file
bogdanm 0:9b334a45a8ff 444 */
bogdanm 0:9b334a45a8ff 445 }
bogdanm 0:9b334a45a8ff 446
bogdanm 0:9b334a45a8ff 447 /**
bogdanm 0:9b334a45a8ff 448 * @}
bogdanm 0:9b334a45a8ff 449 */
bogdanm 0:9b334a45a8ff 450
bogdanm 0:9b334a45a8ff 451 /** @defgroup RTC_Exported_Functions_Group2 Time and Date functions
bogdanm 0:9b334a45a8ff 452 * @brief RTC Time and Date functions
bogdanm 0:9b334a45a8ff 453 *
bogdanm 0:9b334a45a8ff 454 @verbatim
bogdanm 0:9b334a45a8ff 455 ===============================================================================
bogdanm 0:9b334a45a8ff 456 ##### RTC Time and Date functions #####
bogdanm 0:9b334a45a8ff 457 ===============================================================================
bogdanm 0:9b334a45a8ff 458
bogdanm 0:9b334a45a8ff 459 [..] This section provides functions allowing to configure Time and Date features
bogdanm 0:9b334a45a8ff 460
bogdanm 0:9b334a45a8ff 461 @endverbatim
bogdanm 0:9b334a45a8ff 462 * @{
bogdanm 0:9b334a45a8ff 463 */
bogdanm 0:9b334a45a8ff 464
bogdanm 0:9b334a45a8ff 465 /**
bogdanm 0:9b334a45a8ff 466 * @brief Sets RTC current time.
bogdanm 0:9b334a45a8ff 467 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 468 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 469 * @param sTime: Pointer to Time structure
bogdanm 0:9b334a45a8ff 470 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 471 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 472 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 473 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 474 * @retval HAL status
bogdanm 0:9b334a45a8ff 475 */
bogdanm 0:9b334a45a8ff 476 HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
bogdanm 0:9b334a45a8ff 477 {
bogdanm 0:9b334a45a8ff 478 uint32_t counter_time = 0, counter_alarm = 0;
bogdanm 0:9b334a45a8ff 479
bogdanm 0:9b334a45a8ff 480 /* Check input parameters */
bogdanm 0:9b334a45a8ff 481 if((hrtc == NULL) || (sTime == NULL))
bogdanm 0:9b334a45a8ff 482 {
bogdanm 0:9b334a45a8ff 483 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 484 }
bogdanm 0:9b334a45a8ff 485
bogdanm 0:9b334a45a8ff 486 /* Check the parameters */
bogdanm 0:9b334a45a8ff 487 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 488
bogdanm 0:9b334a45a8ff 489 /* Process Locked */
bogdanm 0:9b334a45a8ff 490 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 491
bogdanm 0:9b334a45a8ff 492 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 493
bogdanm 0:9b334a45a8ff 494 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 495 {
bogdanm 0:9b334a45a8ff 496 assert_param(IS_RTC_HOUR24(sTime->Hours));
bogdanm 0:9b334a45a8ff 497 assert_param(IS_RTC_MINUTES(sTime->Minutes));
bogdanm 0:9b334a45a8ff 498 assert_param(IS_RTC_SECONDS(sTime->Seconds));
bogdanm 0:9b334a45a8ff 499
bogdanm 0:9b334a45a8ff 500 counter_time = (uint32_t)(((uint32_t)sTime->Hours * 3600) + \
bogdanm 0:9b334a45a8ff 501 ((uint32_t)sTime->Minutes * 60) + \
bogdanm 0:9b334a45a8ff 502 ((uint32_t)sTime->Seconds));
bogdanm 0:9b334a45a8ff 503 }
bogdanm 0:9b334a45a8ff 504 else
bogdanm 0:9b334a45a8ff 505 {
bogdanm 0:9b334a45a8ff 506 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sTime->Hours)));
bogdanm 0:9b334a45a8ff 507 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sTime->Minutes)));
bogdanm 0:9b334a45a8ff 508 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sTime->Seconds)));
bogdanm 0:9b334a45a8ff 509
bogdanm 0:9b334a45a8ff 510 counter_time = (((uint32_t)(RTC_Bcd2ToByte(sTime->Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 511 ((uint32_t)(RTC_Bcd2ToByte(sTime->Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 512 ((uint32_t)(RTC_Bcd2ToByte(sTime->Seconds))));
bogdanm 0:9b334a45a8ff 513 }
bogdanm 0:9b334a45a8ff 514
bogdanm 0:9b334a45a8ff 515 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 516 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 517 {
bogdanm 0:9b334a45a8ff 518 /* Set RTC state */
bogdanm 0:9b334a45a8ff 519 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 520
bogdanm 0:9b334a45a8ff 521 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 522 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 523
bogdanm 0:9b334a45a8ff 524 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 525 }
bogdanm 0:9b334a45a8ff 526 else
bogdanm 0:9b334a45a8ff 527 {
bogdanm 0:9b334a45a8ff 528 /* Clear Second and overflow flags */
bogdanm 0:9b334a45a8ff 529 CLEAR_BIT(hrtc->Instance->CRL, (RTC_FLAG_SEC | RTC_FLAG_OW));
bogdanm 0:9b334a45a8ff 530
bogdanm 0:9b334a45a8ff 531 /* Read current Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 532 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 533
bogdanm 0:9b334a45a8ff 534 /* Set again alarm to match with new time if enabled */
bogdanm 0:9b334a45a8ff 535 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 536 {
bogdanm 0:9b334a45a8ff 537 if(counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 538 {
bogdanm 0:9b334a45a8ff 539 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 540 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 541
bogdanm 0:9b334a45a8ff 542 /* Write new Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 543 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 544 {
bogdanm 0:9b334a45a8ff 545 /* Set RTC state */
bogdanm 0:9b334a45a8ff 546 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 547
bogdanm 0:9b334a45a8ff 548 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 549 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 550
bogdanm 0:9b334a45a8ff 551 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 552 }
bogdanm 0:9b334a45a8ff 553 }
bogdanm 0:9b334a45a8ff 554 }
bogdanm 0:9b334a45a8ff 555
bogdanm 0:9b334a45a8ff 556 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 557
bogdanm 0:9b334a45a8ff 558 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 559
bogdanm 0:9b334a45a8ff 560 return HAL_OK;
bogdanm 0:9b334a45a8ff 561 }
bogdanm 0:9b334a45a8ff 562 }
bogdanm 0:9b334a45a8ff 563
bogdanm 0:9b334a45a8ff 564 /**
bogdanm 0:9b334a45a8ff 565 * @brief Gets RTC current time.
bogdanm 0:9b334a45a8ff 566 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 567 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 568 * @param sTime: Pointer to Time structure
bogdanm 0:9b334a45a8ff 569 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 570 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 571 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 572 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 573 * @retval HAL status
bogdanm 0:9b334a45a8ff 574 */
bogdanm 0:9b334a45a8ff 575 HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
bogdanm 0:9b334a45a8ff 576 {
bogdanm 0:9b334a45a8ff 577 uint32_t counter_time = 0, counter_alarm = 0, days_elapsed = 0, hours = 0;
bogdanm 0:9b334a45a8ff 578
bogdanm 0:9b334a45a8ff 579 /* Check input parameters */
bogdanm 0:9b334a45a8ff 580 if((hrtc == NULL) || (sTime == NULL))
bogdanm 0:9b334a45a8ff 581 {
bogdanm 0:9b334a45a8ff 582 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 583 }
bogdanm 0:9b334a45a8ff 584
bogdanm 0:9b334a45a8ff 585 /* Check the parameters */
bogdanm 0:9b334a45a8ff 586 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 587
bogdanm 0:9b334a45a8ff 588 /* Check if counter overflow occurred */
bogdanm 0:9b334a45a8ff 589 if (__HAL_RTC_OVERFLOW_GET_FLAG(hrtc, RTC_FLAG_OW))
bogdanm 0:9b334a45a8ff 590 {
bogdanm 0:9b334a45a8ff 591 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 592 }
bogdanm 0:9b334a45a8ff 593
bogdanm 0:9b334a45a8ff 594 /* Read the time counter*/
bogdanm 0:9b334a45a8ff 595 counter_time = RTC_ReadTimeCounter(hrtc);
bogdanm 0:9b334a45a8ff 596
bogdanm 0:9b334a45a8ff 597 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 598 hours = counter_time / 3600;
bogdanm 0:9b334a45a8ff 599 sTime->Minutes = (uint8_t)((counter_time % 3600) / 60);
bogdanm 0:9b334a45a8ff 600 sTime->Seconds = (uint8_t)((counter_time % 3600) % 60);
bogdanm 0:9b334a45a8ff 601
bogdanm 0:9b334a45a8ff 602 if (hours >= 24)
bogdanm 0:9b334a45a8ff 603 {
bogdanm 0:9b334a45a8ff 604 /* Get number of days elapsed from last calculation */
bogdanm 0:9b334a45a8ff 605 days_elapsed = (hours / 24);
bogdanm 0:9b334a45a8ff 606
bogdanm 0:9b334a45a8ff 607 /* Set Hours in RTC_TimeTypeDef structure*/
bogdanm 0:9b334a45a8ff 608 sTime->Hours = (hours % 24);
bogdanm 0:9b334a45a8ff 609
bogdanm 0:9b334a45a8ff 610 /* Read Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 611 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 612
bogdanm 0:9b334a45a8ff 613 /* Calculate remaining time to reach alarm (only if set and not yet expired)*/
bogdanm 0:9b334a45a8ff 614 if ((counter_alarm != RTC_ALARM_RESETVALUE) && (counter_alarm > counter_time))
bogdanm 0:9b334a45a8ff 615 {
bogdanm 0:9b334a45a8ff 616 counter_alarm -= counter_time;
bogdanm 0:9b334a45a8ff 617 }
bogdanm 0:9b334a45a8ff 618 else
bogdanm 0:9b334a45a8ff 619 {
bogdanm 0:9b334a45a8ff 620 /* In case of counter_alarm < counter_time */
bogdanm 0:9b334a45a8ff 621 /* Alarm expiration already occurred but alarm not deactivated */
bogdanm 0:9b334a45a8ff 622 counter_alarm = RTC_ALARM_RESETVALUE;
bogdanm 0:9b334a45a8ff 623 }
bogdanm 0:9b334a45a8ff 624
bogdanm 0:9b334a45a8ff 625 /* Set updated time in decreasing counter by number of days elapsed */
bogdanm 0:9b334a45a8ff 626 counter_time -= (days_elapsed * 24 * 3600);
bogdanm 0:9b334a45a8ff 627
bogdanm 0:9b334a45a8ff 628 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 629 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 630 {
bogdanm 0:9b334a45a8ff 631 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 632 }
bogdanm 0:9b334a45a8ff 633
bogdanm 0:9b334a45a8ff 634 /* Set updated alarm to be set */
bogdanm 0:9b334a45a8ff 635 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 636 {
bogdanm 0:9b334a45a8ff 637 counter_alarm += counter_time;
bogdanm 0:9b334a45a8ff 638
bogdanm 0:9b334a45a8ff 639 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 640 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 641 {
bogdanm 0:9b334a45a8ff 642 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 643 }
bogdanm 0:9b334a45a8ff 644 }
bogdanm 0:9b334a45a8ff 645 else
bogdanm 0:9b334a45a8ff 646 {
bogdanm 0:9b334a45a8ff 647 /* Alarm already occurred. Set it to reset values to avoid unexpected expiration */
bogdanm 0:9b334a45a8ff 648 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 649 {
bogdanm 0:9b334a45a8ff 650 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 651 }
bogdanm 0:9b334a45a8ff 652 }
bogdanm 0:9b334a45a8ff 653
bogdanm 0:9b334a45a8ff 654 /* Update date */
bogdanm 0:9b334a45a8ff 655 RTC_DateUpdate(hrtc, days_elapsed);
bogdanm 0:9b334a45a8ff 656 }
bogdanm 0:9b334a45a8ff 657 else
bogdanm 0:9b334a45a8ff 658 {
bogdanm 0:9b334a45a8ff 659 sTime->Hours = hours;
bogdanm 0:9b334a45a8ff 660 }
bogdanm 0:9b334a45a8ff 661
bogdanm 0:9b334a45a8ff 662 /* Check the input parameters format */
bogdanm 0:9b334a45a8ff 663 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 664 {
bogdanm 0:9b334a45a8ff 665 /* Convert the time structure parameters to BCD format */
bogdanm 0:9b334a45a8ff 666 sTime->Hours = (uint8_t)RTC_ByteToBcd2(sTime->Hours);
bogdanm 0:9b334a45a8ff 667 sTime->Minutes = (uint8_t)RTC_ByteToBcd2(sTime->Minutes);
bogdanm 0:9b334a45a8ff 668 sTime->Seconds = (uint8_t)RTC_ByteToBcd2(sTime->Seconds);
bogdanm 0:9b334a45a8ff 669 }
bogdanm 0:9b334a45a8ff 670
bogdanm 0:9b334a45a8ff 671 return HAL_OK;
bogdanm 0:9b334a45a8ff 672 }
bogdanm 0:9b334a45a8ff 673
bogdanm 0:9b334a45a8ff 674
bogdanm 0:9b334a45a8ff 675 /**
bogdanm 0:9b334a45a8ff 676 * @brief Sets RTC current date.
bogdanm 0:9b334a45a8ff 677 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 678 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 679 * @param sDate: Pointer to date structure
bogdanm 0:9b334a45a8ff 680 * @param Format: specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 681 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 682 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 683 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 684 * @retval HAL status
bogdanm 0:9b334a45a8ff 685 */
bogdanm 0:9b334a45a8ff 686 HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
bogdanm 0:9b334a45a8ff 687 {
bogdanm 0:9b334a45a8ff 688 uint32_t counter_time = 0, counter_alarm = 0, hours = 0;
bogdanm 0:9b334a45a8ff 689
bogdanm 0:9b334a45a8ff 690 /* Check input parameters */
bogdanm 0:9b334a45a8ff 691 if((hrtc == NULL) || (sDate == NULL))
bogdanm 0:9b334a45a8ff 692 {
bogdanm 0:9b334a45a8ff 693 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 694 }
bogdanm 0:9b334a45a8ff 695
bogdanm 0:9b334a45a8ff 696 /* Check the parameters */
bogdanm 0:9b334a45a8ff 697 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 698
bogdanm 0:9b334a45a8ff 699 /* Process Locked */
bogdanm 0:9b334a45a8ff 700 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 701
bogdanm 0:9b334a45a8ff 702 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 703
bogdanm 0:9b334a45a8ff 704 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 705 {
bogdanm 0:9b334a45a8ff 706 assert_param(IS_RTC_YEAR(sDate->Year));
bogdanm 0:9b334a45a8ff 707 assert_param(IS_RTC_MONTH(sDate->Month));
bogdanm 0:9b334a45a8ff 708 assert_param(IS_RTC_DATE(sDate->Date));
bogdanm 0:9b334a45a8ff 709
bogdanm 0:9b334a45a8ff 710 /* Change the current date */
bogdanm 0:9b334a45a8ff 711 hrtc->DateToUpdate.Year = sDate->Year;
bogdanm 0:9b334a45a8ff 712 hrtc->DateToUpdate.Month = sDate->Month;
bogdanm 0:9b334a45a8ff 713 hrtc->DateToUpdate.Date = sDate->Date;
bogdanm 0:9b334a45a8ff 714 }
bogdanm 0:9b334a45a8ff 715 else
bogdanm 0:9b334a45a8ff 716 {
bogdanm 0:9b334a45a8ff 717 assert_param(IS_RTC_YEAR(RTC_Bcd2ToByte(sDate->Year)));
bogdanm 0:9b334a45a8ff 718 assert_param(IS_RTC_MONTH(RTC_Bcd2ToByte(sDate->Month)));
bogdanm 0:9b334a45a8ff 719 assert_param(IS_RTC_DATE(RTC_Bcd2ToByte(sDate->Date)));
bogdanm 0:9b334a45a8ff 720
bogdanm 0:9b334a45a8ff 721 /* Change the current date */
bogdanm 0:9b334a45a8ff 722 hrtc->DateToUpdate.Year = RTC_Bcd2ToByte(sDate->Year);
bogdanm 0:9b334a45a8ff 723 hrtc->DateToUpdate.Month = RTC_Bcd2ToByte(sDate->Month);
bogdanm 0:9b334a45a8ff 724 hrtc->DateToUpdate.Date = RTC_Bcd2ToByte(sDate->Date);
bogdanm 0:9b334a45a8ff 725 }
bogdanm 0:9b334a45a8ff 726
bogdanm 0:9b334a45a8ff 727 /* WeekDay set by user can be ignored because automatically calculated */
bogdanm 0:9b334a45a8ff 728 hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(hrtc->DateToUpdate.Year, hrtc->DateToUpdate.Month, hrtc->DateToUpdate.Date);
bogdanm 0:9b334a45a8ff 729 sDate->WeekDay = hrtc->DateToUpdate.WeekDay;
bogdanm 0:9b334a45a8ff 730
bogdanm 0:9b334a45a8ff 731 /* Reset time to be aligned on the same day */
bogdanm 0:9b334a45a8ff 732 /* Read the time counter*/
bogdanm 0:9b334a45a8ff 733 counter_time = RTC_ReadTimeCounter(hrtc);
bogdanm 0:9b334a45a8ff 734
bogdanm 0:9b334a45a8ff 735 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 736 hours = counter_time / 3600;
bogdanm 0:9b334a45a8ff 737 if (hours > 24)
bogdanm 0:9b334a45a8ff 738 {
bogdanm 0:9b334a45a8ff 739 /* Set updated time in decreasing counter by number of days elapsed */
bogdanm 0:9b334a45a8ff 740 counter_time -= ((hours / 24) * 24 * 3600);
bogdanm 0:9b334a45a8ff 741 /* Write time counter in RTC registers */
bogdanm 0:9b334a45a8ff 742 if (RTC_WriteTimeCounter(hrtc, counter_time) != HAL_OK)
bogdanm 0:9b334a45a8ff 743 {
bogdanm 0:9b334a45a8ff 744 /* Set RTC state */
bogdanm 0:9b334a45a8ff 745 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 746
bogdanm 0:9b334a45a8ff 747 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 748 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 749
bogdanm 0:9b334a45a8ff 750 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 751 }
bogdanm 0:9b334a45a8ff 752
bogdanm 0:9b334a45a8ff 753 /* Read current Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 754 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 755
bogdanm 0:9b334a45a8ff 756 /* Set again alarm to match with new time if enabled */
bogdanm 0:9b334a45a8ff 757 if (counter_alarm != RTC_ALARM_RESETVALUE)
bogdanm 0:9b334a45a8ff 758 {
bogdanm 0:9b334a45a8ff 759 if(counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 760 {
bogdanm 0:9b334a45a8ff 761 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 762 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 763
bogdanm 0:9b334a45a8ff 764 /* Write new Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 765 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 766 {
bogdanm 0:9b334a45a8ff 767 /* Set RTC state */
bogdanm 0:9b334a45a8ff 768 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 769
bogdanm 0:9b334a45a8ff 770 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 771 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 772
bogdanm 0:9b334a45a8ff 773 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 774 }
bogdanm 0:9b334a45a8ff 775 }
bogdanm 0:9b334a45a8ff 776 }
bogdanm 0:9b334a45a8ff 777
bogdanm 0:9b334a45a8ff 778
bogdanm 0:9b334a45a8ff 779 }
bogdanm 0:9b334a45a8ff 780
bogdanm 0:9b334a45a8ff 781 hrtc->State = HAL_RTC_STATE_READY ;
bogdanm 0:9b334a45a8ff 782
bogdanm 0:9b334a45a8ff 783 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 784 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 785
bogdanm 0:9b334a45a8ff 786 return HAL_OK;
bogdanm 0:9b334a45a8ff 787 }
bogdanm 0:9b334a45a8ff 788
bogdanm 0:9b334a45a8ff 789 /**
bogdanm 0:9b334a45a8ff 790 * @brief Gets RTC current date.
bogdanm 0:9b334a45a8ff 791 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 792 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 793 * @param sDate: Pointer to Date structure
bogdanm 0:9b334a45a8ff 794 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 795 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 796 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 797 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 798 * @retval HAL status
bogdanm 0:9b334a45a8ff 799 */
bogdanm 0:9b334a45a8ff 800 HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
bogdanm 0:9b334a45a8ff 801 {
bogdanm 0:9b334a45a8ff 802 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 803
bogdanm 0:9b334a45a8ff 804 /* Check input parameters */
bogdanm 0:9b334a45a8ff 805 if((hrtc == NULL) || (sDate == NULL))
bogdanm 0:9b334a45a8ff 806 {
bogdanm 0:9b334a45a8ff 807 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 808 }
bogdanm 0:9b334a45a8ff 809
bogdanm 0:9b334a45a8ff 810 /* Check the parameters */
bogdanm 0:9b334a45a8ff 811 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 812
bogdanm 0:9b334a45a8ff 813 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 814 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 815 {
bogdanm 0:9b334a45a8ff 816 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 817 }
bogdanm 0:9b334a45a8ff 818
bogdanm 0:9b334a45a8ff 819 /* Fill the structure fields with the read parameters */
bogdanm 0:9b334a45a8ff 820 sDate->WeekDay = hrtc->DateToUpdate.WeekDay;
bogdanm 0:9b334a45a8ff 821 sDate->Year = hrtc->DateToUpdate.Year;
bogdanm 0:9b334a45a8ff 822 sDate->Month = hrtc->DateToUpdate.Month;
bogdanm 0:9b334a45a8ff 823 sDate->Date = hrtc->DateToUpdate.Date;
bogdanm 0:9b334a45a8ff 824
bogdanm 0:9b334a45a8ff 825 /* Check the input parameters format */
bogdanm 0:9b334a45a8ff 826 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 827 {
bogdanm 0:9b334a45a8ff 828 /* Convert the date structure parameters to BCD format */
bogdanm 0:9b334a45a8ff 829 sDate->Year = (uint8_t)RTC_ByteToBcd2(sDate->Year);
bogdanm 0:9b334a45a8ff 830 sDate->Month = (uint8_t)RTC_ByteToBcd2(sDate->Month);
bogdanm 0:9b334a45a8ff 831 sDate->Date = (uint8_t)RTC_ByteToBcd2(sDate->Date);
bogdanm 0:9b334a45a8ff 832 }
bogdanm 0:9b334a45a8ff 833 return HAL_OK;
bogdanm 0:9b334a45a8ff 834 }
bogdanm 0:9b334a45a8ff 835
bogdanm 0:9b334a45a8ff 836 /**
bogdanm 0:9b334a45a8ff 837 * @}
bogdanm 0:9b334a45a8ff 838 */
bogdanm 0:9b334a45a8ff 839
bogdanm 0:9b334a45a8ff 840 /** @defgroup RTC_Exported_Functions_Group3 Alarm functions
bogdanm 0:9b334a45a8ff 841 * @brief RTC Alarm functions
bogdanm 0:9b334a45a8ff 842 *
bogdanm 0:9b334a45a8ff 843 @verbatim
bogdanm 0:9b334a45a8ff 844 ===============================================================================
bogdanm 0:9b334a45a8ff 845 ##### RTC Alarm functions #####
bogdanm 0:9b334a45a8ff 846 ===============================================================================
bogdanm 0:9b334a45a8ff 847
bogdanm 0:9b334a45a8ff 848 [..] This section provides functions allowing to configure Alarm feature
bogdanm 0:9b334a45a8ff 849
bogdanm 0:9b334a45a8ff 850 @endverbatim
bogdanm 0:9b334a45a8ff 851 * @{
bogdanm 0:9b334a45a8ff 852 */
bogdanm 0:9b334a45a8ff 853
bogdanm 0:9b334a45a8ff 854 /**
bogdanm 0:9b334a45a8ff 855 * @brief Sets the specified RTC Alarm.
bogdanm 0:9b334a45a8ff 856 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 857 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 858 * @param sAlarm: Pointer to Alarm structure
bogdanm 0:9b334a45a8ff 859 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 860 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 861 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 862 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 863 * @retval HAL status
bogdanm 0:9b334a45a8ff 864 */
bogdanm 0:9b334a45a8ff 865 HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 866 {
bogdanm 0:9b334a45a8ff 867 uint32_t counter_alarm = 0, counter_time;
bogdanm 0:9b334a45a8ff 868 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 869
bogdanm 0:9b334a45a8ff 870 /* Check input parameters */
bogdanm 0:9b334a45a8ff 871 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 872 {
bogdanm 0:9b334a45a8ff 873 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 874 }
bogdanm 0:9b334a45a8ff 875
bogdanm 0:9b334a45a8ff 876 /* Check the parameters */
bogdanm 0:9b334a45a8ff 877 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 878 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
bogdanm 0:9b334a45a8ff 879
bogdanm 0:9b334a45a8ff 880 /* Process Locked */
bogdanm 0:9b334a45a8ff 881 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 882
bogdanm 0:9b334a45a8ff 883 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 884
bogdanm 0:9b334a45a8ff 885 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 886 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 887 {
bogdanm 0:9b334a45a8ff 888 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 889 }
bogdanm 0:9b334a45a8ff 890
bogdanm 0:9b334a45a8ff 891 /* Convert time in seconds */
bogdanm 0:9b334a45a8ff 892 counter_time = (uint32_t)(((uint32_t)stime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 893 ((uint32_t)stime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 894 ((uint32_t)stime.Seconds));
bogdanm 0:9b334a45a8ff 895
bogdanm 0:9b334a45a8ff 896 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 897 {
bogdanm 0:9b334a45a8ff 898 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
bogdanm 0:9b334a45a8ff 899 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
bogdanm 0:9b334a45a8ff 900 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 901
bogdanm 0:9b334a45a8ff 902 counter_alarm = (uint32_t)(((uint32_t)sAlarm->AlarmTime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 903 ((uint32_t)sAlarm->AlarmTime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 904 ((uint32_t)sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 905 }
bogdanm 0:9b334a45a8ff 906 else
bogdanm 0:9b334a45a8ff 907 {
bogdanm 0:9b334a45a8ff 908 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
bogdanm 0:9b334a45a8ff 909 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
bogdanm 0:9b334a45a8ff 910 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 911
bogdanm 0:9b334a45a8ff 912 counter_alarm = (((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 913 ((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 914 ((uint32_t)RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 915 }
bogdanm 0:9b334a45a8ff 916
bogdanm 0:9b334a45a8ff 917 /* Check that requested alarm should expire in the same day (otherwise add 1 day) */
bogdanm 0:9b334a45a8ff 918 if (counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 919 {
bogdanm 0:9b334a45a8ff 920 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 921 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 922 }
bogdanm 0:9b334a45a8ff 923
bogdanm 0:9b334a45a8ff 924 /* Write Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 925 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 926 {
bogdanm 0:9b334a45a8ff 927 /* Set RTC state */
bogdanm 0:9b334a45a8ff 928 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 929
bogdanm 0:9b334a45a8ff 930 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 931 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 932
bogdanm 0:9b334a45a8ff 933 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 934 }
bogdanm 0:9b334a45a8ff 935 else
bogdanm 0:9b334a45a8ff 936 {
bogdanm 0:9b334a45a8ff 937 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 938
bogdanm 0:9b334a45a8ff 939 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 940
bogdanm 0:9b334a45a8ff 941 return HAL_OK;
bogdanm 0:9b334a45a8ff 942 }
bogdanm 0:9b334a45a8ff 943 }
bogdanm 0:9b334a45a8ff 944
bogdanm 0:9b334a45a8ff 945 /**
bogdanm 0:9b334a45a8ff 946 * @brief Sets the specified RTC Alarm with Interrupt
bogdanm 0:9b334a45a8ff 947 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 948 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 949 * @param sAlarm: Pointer to Alarm structure
bogdanm 0:9b334a45a8ff 950 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 951 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 952 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 953 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 954 * @note The HAL_RTC_SetTime() must be called before enabling the Alarm feature.
bogdanm 0:9b334a45a8ff 955 * @retval HAL status
bogdanm 0:9b334a45a8ff 956 */
bogdanm 0:9b334a45a8ff 957 HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 958 {
bogdanm 0:9b334a45a8ff 959 uint32_t counter_alarm = 0, counter_time;
bogdanm 0:9b334a45a8ff 960 RTC_TimeTypeDef stime = {0};
bogdanm 0:9b334a45a8ff 961
bogdanm 0:9b334a45a8ff 962 /* Check input parameters */
bogdanm 0:9b334a45a8ff 963 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 964 {
bogdanm 0:9b334a45a8ff 965 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 966 }
bogdanm 0:9b334a45a8ff 967
bogdanm 0:9b334a45a8ff 968 /* Check the parameters */
bogdanm 0:9b334a45a8ff 969 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 970 assert_param(IS_RTC_ALARM(sAlarm->Alarm));
bogdanm 0:9b334a45a8ff 971
bogdanm 0:9b334a45a8ff 972 /* Process Locked */
bogdanm 0:9b334a45a8ff 973 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 974
bogdanm 0:9b334a45a8ff 975 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 976
bogdanm 0:9b334a45a8ff 977 /* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */
bogdanm 0:9b334a45a8ff 978 if (HAL_RTC_GetTime(hrtc, &stime, RTC_FORMAT_BIN) != HAL_OK)
bogdanm 0:9b334a45a8ff 979 {
bogdanm 0:9b334a45a8ff 980 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 981 }
bogdanm 0:9b334a45a8ff 982
bogdanm 0:9b334a45a8ff 983 /* Convert time in seconds */
bogdanm 0:9b334a45a8ff 984 counter_time = (uint32_t)(((uint32_t)stime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 985 ((uint32_t)stime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 986 ((uint32_t)stime.Seconds));
bogdanm 0:9b334a45a8ff 987
bogdanm 0:9b334a45a8ff 988 if(Format == RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 989 {
bogdanm 0:9b334a45a8ff 990 assert_param(IS_RTC_HOUR24(sAlarm->AlarmTime.Hours));
bogdanm 0:9b334a45a8ff 991 assert_param(IS_RTC_MINUTES(sAlarm->AlarmTime.Minutes));
bogdanm 0:9b334a45a8ff 992 assert_param(IS_RTC_SECONDS(sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 993
bogdanm 0:9b334a45a8ff 994 counter_alarm = (uint32_t)(((uint32_t)sAlarm->AlarmTime.Hours * 3600) + \
bogdanm 0:9b334a45a8ff 995 ((uint32_t)sAlarm->AlarmTime.Minutes * 60) + \
bogdanm 0:9b334a45a8ff 996 ((uint32_t)sAlarm->AlarmTime.Seconds));
bogdanm 0:9b334a45a8ff 997 }
bogdanm 0:9b334a45a8ff 998 else
bogdanm 0:9b334a45a8ff 999 {
bogdanm 0:9b334a45a8ff 1000 assert_param(IS_RTC_HOUR24(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)));
bogdanm 0:9b334a45a8ff 1001 assert_param(IS_RTC_MINUTES(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)));
bogdanm 0:9b334a45a8ff 1002 assert_param(IS_RTC_SECONDS(RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 1003
bogdanm 0:9b334a45a8ff 1004 counter_alarm = (((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Hours)) * 3600) + \
bogdanm 0:9b334a45a8ff 1005 ((uint32_t)(RTC_Bcd2ToByte(sAlarm->AlarmTime.Minutes)) * 60) + \
bogdanm 0:9b334a45a8ff 1006 ((uint32_t)RTC_Bcd2ToByte(sAlarm->AlarmTime.Seconds)));
bogdanm 0:9b334a45a8ff 1007 }
bogdanm 0:9b334a45a8ff 1008
bogdanm 0:9b334a45a8ff 1009 /* Check that requested alarm should expire in the same day (otherwise add 1 day) */
bogdanm 0:9b334a45a8ff 1010 if (counter_alarm < counter_time)
bogdanm 0:9b334a45a8ff 1011 {
bogdanm 0:9b334a45a8ff 1012 /* Add 1 day to alarm counter*/
bogdanm 0:9b334a45a8ff 1013 counter_alarm += (uint32_t)(24 * 3600);
bogdanm 0:9b334a45a8ff 1014 }
bogdanm 0:9b334a45a8ff 1015
bogdanm 0:9b334a45a8ff 1016 /* Write alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 1017 if (RTC_WriteAlarmCounter(hrtc, counter_alarm) != HAL_OK)
bogdanm 0:9b334a45a8ff 1018 {
bogdanm 0:9b334a45a8ff 1019 /* Set RTC state */
bogdanm 0:9b334a45a8ff 1020 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1021
bogdanm 0:9b334a45a8ff 1022 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1023 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1024
bogdanm 0:9b334a45a8ff 1025 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1026 }
bogdanm 0:9b334a45a8ff 1027 else
bogdanm 0:9b334a45a8ff 1028 {
bogdanm 0:9b334a45a8ff 1029 /* Clear flag alarm A */
bogdanm 0:9b334a45a8ff 1030 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1031
bogdanm 0:9b334a45a8ff 1032 /* Configure the Alarm interrupt */
bogdanm 0:9b334a45a8ff 1033 __HAL_RTC_ALARM_ENABLE_IT(hrtc,RTC_IT_ALRA);
bogdanm 0:9b334a45a8ff 1034
bogdanm 0:9b334a45a8ff 1035 /* RTC Alarm Interrupt Configuration: EXTI configuration */
bogdanm 0:9b334a45a8ff 1036 __HAL_RTC_ALARM_EXTI_ENABLE_IT();
bogdanm 0:9b334a45a8ff 1037
bogdanm 0:9b334a45a8ff 1038 __HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();
bogdanm 0:9b334a45a8ff 1039
bogdanm 0:9b334a45a8ff 1040 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1041
bogdanm 0:9b334a45a8ff 1042 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1043
bogdanm 0:9b334a45a8ff 1044 return HAL_OK;
bogdanm 0:9b334a45a8ff 1045 }
bogdanm 0:9b334a45a8ff 1046 }
bogdanm 0:9b334a45a8ff 1047
bogdanm 0:9b334a45a8ff 1048 /**
bogdanm 0:9b334a45a8ff 1049 * @brief Gets the RTC Alarm value and masks.
bogdanm 0:9b334a45a8ff 1050 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1051 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1052 * @param sAlarm: Pointer to Date structure
bogdanm 0:9b334a45a8ff 1053 * @param Alarm: Specifies the Alarm.
bogdanm 0:9b334a45a8ff 1054 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1055 * @arg RTC_ALARM_A: Alarm
bogdanm 0:9b334a45a8ff 1056 * @param Format: Specifies the format of the entered parameters.
bogdanm 0:9b334a45a8ff 1057 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1058 * @arg RTC_FORMAT_BIN: Binary data format
bogdanm 0:9b334a45a8ff 1059 * @arg RTC_FORMAT_BCD: BCD data format
bogdanm 0:9b334a45a8ff 1060 * @retval HAL status
bogdanm 0:9b334a45a8ff 1061 */
bogdanm 0:9b334a45a8ff 1062 HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format)
bogdanm 0:9b334a45a8ff 1063 {
bogdanm 0:9b334a45a8ff 1064 uint32_t counter_alarm = 0;
bogdanm 0:9b334a45a8ff 1065
bogdanm 0:9b334a45a8ff 1066 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1067 if((hrtc == NULL) || (sAlarm == NULL))
bogdanm 0:9b334a45a8ff 1068 {
bogdanm 0:9b334a45a8ff 1069 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1070 }
bogdanm 0:9b334a45a8ff 1071
bogdanm 0:9b334a45a8ff 1072 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1073 assert_param(IS_RTC_FORMAT(Format));
bogdanm 0:9b334a45a8ff 1074 assert_param(IS_RTC_ALARM(Alarm));
bogdanm 0:9b334a45a8ff 1075
bogdanm 0:9b334a45a8ff 1076 /* Read Alarm counter in RTC registers */
bogdanm 0:9b334a45a8ff 1077 counter_alarm = RTC_ReadAlarmCounter(hrtc);
bogdanm 0:9b334a45a8ff 1078
bogdanm 0:9b334a45a8ff 1079 /* Fill the structure with the read parameters */
bogdanm 0:9b334a45a8ff 1080 /* Set hours in a day range (between 0 to 24)*/
bogdanm 0:9b334a45a8ff 1081 sAlarm->AlarmTime.Hours = (uint32_t)((counter_alarm / 3600) % 24);
bogdanm 0:9b334a45a8ff 1082 sAlarm->AlarmTime.Minutes = (uint32_t)((counter_alarm % 3600) / 60);
bogdanm 0:9b334a45a8ff 1083 sAlarm->AlarmTime.Seconds = (uint32_t)((counter_alarm % 3600) % 60);
bogdanm 0:9b334a45a8ff 1084
bogdanm 0:9b334a45a8ff 1085 if(Format != RTC_FORMAT_BIN)
bogdanm 0:9b334a45a8ff 1086 {
bogdanm 0:9b334a45a8ff 1087 sAlarm->AlarmTime.Hours = RTC_ByteToBcd2(sAlarm->AlarmTime.Hours);
bogdanm 0:9b334a45a8ff 1088 sAlarm->AlarmTime.Minutes = RTC_ByteToBcd2(sAlarm->AlarmTime.Minutes);
bogdanm 0:9b334a45a8ff 1089 sAlarm->AlarmTime.Seconds = RTC_ByteToBcd2(sAlarm->AlarmTime.Seconds);
bogdanm 0:9b334a45a8ff 1090 }
bogdanm 0:9b334a45a8ff 1091
bogdanm 0:9b334a45a8ff 1092 return HAL_OK;
bogdanm 0:9b334a45a8ff 1093 }
bogdanm 0:9b334a45a8ff 1094
bogdanm 0:9b334a45a8ff 1095 /**
bogdanm 0:9b334a45a8ff 1096 * @brief Deactive the specified RTC Alarm
bogdanm 0:9b334a45a8ff 1097 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1098 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1099 * @param Alarm: Specifies the Alarm.
bogdanm 0:9b334a45a8ff 1100 * This parameter can be one of the following values:
bogdanm 0:9b334a45a8ff 1101 * @arg RTC_ALARM_A: AlarmA
bogdanm 0:9b334a45a8ff 1102 * @retval HAL status
bogdanm 0:9b334a45a8ff 1103 */
bogdanm 0:9b334a45a8ff 1104 HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm)
bogdanm 0:9b334a45a8ff 1105 {
bogdanm 0:9b334a45a8ff 1106 /* Check the parameters */
bogdanm 0:9b334a45a8ff 1107 assert_param(IS_RTC_ALARM(Alarm));
bogdanm 0:9b334a45a8ff 1108
bogdanm 0:9b334a45a8ff 1109 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1110 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1111 {
bogdanm 0:9b334a45a8ff 1112 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1113 }
bogdanm 0:9b334a45a8ff 1114
bogdanm 0:9b334a45a8ff 1115 /* Process Locked */
bogdanm 0:9b334a45a8ff 1116 __HAL_LOCK(hrtc);
bogdanm 0:9b334a45a8ff 1117
bogdanm 0:9b334a45a8ff 1118 hrtc->State = HAL_RTC_STATE_BUSY;
bogdanm 0:9b334a45a8ff 1119
bogdanm 0:9b334a45a8ff 1120 /* In case of interrupt mode is used, the interrupt source must disabled */
bogdanm 0:9b334a45a8ff 1121 __HAL_RTC_ALARM_DISABLE_IT(hrtc, RTC_IT_ALRA);
bogdanm 0:9b334a45a8ff 1122
bogdanm 0:9b334a45a8ff 1123 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1124 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1125 {
bogdanm 0:9b334a45a8ff 1126 /* Set RTC state */
bogdanm 0:9b334a45a8ff 1127 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1128
bogdanm 0:9b334a45a8ff 1129 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1130 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1131
bogdanm 0:9b334a45a8ff 1132 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1133 }
bogdanm 0:9b334a45a8ff 1134 else
bogdanm 0:9b334a45a8ff 1135 {
bogdanm 0:9b334a45a8ff 1136 /* Clear flag alarm A */
bogdanm 0:9b334a45a8ff 1137 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1138
bogdanm 0:9b334a45a8ff 1139 /* Set to default values ALRH & ALRL registers */
bogdanm 0:9b334a45a8ff 1140 WRITE_REG(hrtc->Instance->ALRH, RTC_ALARM_RESETVALUE_REGISTER);
bogdanm 0:9b334a45a8ff 1141 WRITE_REG(hrtc->Instance->ALRL, RTC_ALARM_RESETVALUE_REGISTER);
bogdanm 0:9b334a45a8ff 1142
bogdanm 0:9b334a45a8ff 1143 /* RTC Alarm Interrupt Configuration: Disable EXTI configuration */
bogdanm 0:9b334a45a8ff 1144 __HAL_RTC_ALARM_EXTI_DISABLE_IT();
bogdanm 0:9b334a45a8ff 1145
bogdanm 0:9b334a45a8ff 1146 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1147 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1148 {
bogdanm 0:9b334a45a8ff 1149 hrtc->State = HAL_RTC_STATE_ERROR;
bogdanm 0:9b334a45a8ff 1150
bogdanm 0:9b334a45a8ff 1151 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1152 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1153
bogdanm 0:9b334a45a8ff 1154 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1155 }
bogdanm 0:9b334a45a8ff 1156 }
bogdanm 0:9b334a45a8ff 1157 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1158
bogdanm 0:9b334a45a8ff 1159 /* Process Unlocked */
bogdanm 0:9b334a45a8ff 1160 __HAL_UNLOCK(hrtc);
bogdanm 0:9b334a45a8ff 1161
bogdanm 0:9b334a45a8ff 1162 return HAL_OK;
bogdanm 0:9b334a45a8ff 1163 }
bogdanm 0:9b334a45a8ff 1164
bogdanm 0:9b334a45a8ff 1165 /**
bogdanm 0:9b334a45a8ff 1166 * @brief This function handles Alarm interrupt request.
bogdanm 0:9b334a45a8ff 1167 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1168 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1169 * @retval None
bogdanm 0:9b334a45a8ff 1170 */
bogdanm 0:9b334a45a8ff 1171 void HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1172 {
bogdanm 0:9b334a45a8ff 1173 if(__HAL_RTC_ALARM_GET_IT_SOURCE(hrtc, RTC_IT_ALRA))
bogdanm 0:9b334a45a8ff 1174 {
bogdanm 0:9b334a45a8ff 1175 /* Get the status of the Interrupt */
bogdanm 0:9b334a45a8ff 1176 if(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) != (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1177 {
bogdanm 0:9b334a45a8ff 1178 /* AlarmA callback */
bogdanm 0:9b334a45a8ff 1179 HAL_RTC_AlarmAEventCallback(hrtc);
bogdanm 0:9b334a45a8ff 1180
bogdanm 0:9b334a45a8ff 1181 /* Clear the Alarm interrupt pending bit */
bogdanm 0:9b334a45a8ff 1182 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc,RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1183 }
bogdanm 0:9b334a45a8ff 1184 }
bogdanm 0:9b334a45a8ff 1185
bogdanm 0:9b334a45a8ff 1186 /* Clear the EXTI's line Flag for RTC Alarm */
bogdanm 0:9b334a45a8ff 1187 __HAL_RTC_ALARM_EXTI_CLEAR_FLAG();
bogdanm 0:9b334a45a8ff 1188
bogdanm 0:9b334a45a8ff 1189 /* Change RTC state */
bogdanm 0:9b334a45a8ff 1190 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1191 }
bogdanm 0:9b334a45a8ff 1192
bogdanm 0:9b334a45a8ff 1193 /**
bogdanm 0:9b334a45a8ff 1194 * @brief Alarm A callback.
bogdanm 0:9b334a45a8ff 1195 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1196 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1197 * @retval None
bogdanm 0:9b334a45a8ff 1198 */
bogdanm 0:9b334a45a8ff 1199 __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
bogdanm 0:9b334a45a8ff 1200 {
bogdanm 0:9b334a45a8ff 1201 /* NOTE : This function Should not be modified, when the callback is needed,
bogdanm 0:9b334a45a8ff 1202 the HAL_RTC_AlarmAEventCallback could be implemented in the user file
bogdanm 0:9b334a45a8ff 1203 */
bogdanm 0:9b334a45a8ff 1204 }
bogdanm 0:9b334a45a8ff 1205
bogdanm 0:9b334a45a8ff 1206 /**
bogdanm 0:9b334a45a8ff 1207 * @brief This function handles AlarmA Polling request.
bogdanm 0:9b334a45a8ff 1208 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1209 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1210 * @param Timeout: Timeout duration
bogdanm 0:9b334a45a8ff 1211 * @retval HAL status
bogdanm 0:9b334a45a8ff 1212 */
bogdanm 0:9b334a45a8ff 1213 HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout)
bogdanm 0:9b334a45a8ff 1214 {
bogdanm 0:9b334a45a8ff 1215 uint32_t tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1216
bogdanm 0:9b334a45a8ff 1217 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1218 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1219 {
bogdanm 0:9b334a45a8ff 1220 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1221 }
bogdanm 0:9b334a45a8ff 1222
bogdanm 0:9b334a45a8ff 1223 while(__HAL_RTC_ALARM_GET_FLAG(hrtc, RTC_FLAG_ALRAF) == RESET)
bogdanm 0:9b334a45a8ff 1224 {
bogdanm 0:9b334a45a8ff 1225 if(Timeout != HAL_MAX_DELAY)
bogdanm 0:9b334a45a8ff 1226 {
bogdanm 0:9b334a45a8ff 1227 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
bogdanm 0:9b334a45a8ff 1228 {
bogdanm 0:9b334a45a8ff 1229 hrtc->State = HAL_RTC_STATE_TIMEOUT;
bogdanm 0:9b334a45a8ff 1230 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1231 }
bogdanm 0:9b334a45a8ff 1232 }
bogdanm 0:9b334a45a8ff 1233 }
bogdanm 0:9b334a45a8ff 1234
bogdanm 0:9b334a45a8ff 1235 /* Clear the Alarm interrupt pending bit */
bogdanm 0:9b334a45a8ff 1236 __HAL_RTC_ALARM_CLEAR_FLAG(hrtc, RTC_FLAG_ALRAF);
bogdanm 0:9b334a45a8ff 1237
bogdanm 0:9b334a45a8ff 1238 /* Change RTC state */
bogdanm 0:9b334a45a8ff 1239 hrtc->State = HAL_RTC_STATE_READY;
bogdanm 0:9b334a45a8ff 1240
bogdanm 0:9b334a45a8ff 1241 return HAL_OK;
bogdanm 0:9b334a45a8ff 1242 }
bogdanm 0:9b334a45a8ff 1243
bogdanm 0:9b334a45a8ff 1244 /**
bogdanm 0:9b334a45a8ff 1245 * @}
bogdanm 0:9b334a45a8ff 1246 */
bogdanm 0:9b334a45a8ff 1247
bogdanm 0:9b334a45a8ff 1248 /** @defgroup RTC_Exported_Functions_Group4 Peripheral State functions
bogdanm 0:9b334a45a8ff 1249 * @brief Peripheral State functions
bogdanm 0:9b334a45a8ff 1250 *
bogdanm 0:9b334a45a8ff 1251 @verbatim
bogdanm 0:9b334a45a8ff 1252 ===============================================================================
bogdanm 0:9b334a45a8ff 1253 ##### Peripheral State functions #####
bogdanm 0:9b334a45a8ff 1254 ===============================================================================
bogdanm 0:9b334a45a8ff 1255 [..]
bogdanm 0:9b334a45a8ff 1256 This subsection provides functions allowing to
bogdanm 0:9b334a45a8ff 1257 (+) Get RTC state
bogdanm 0:9b334a45a8ff 1258
bogdanm 0:9b334a45a8ff 1259 @endverbatim
bogdanm 0:9b334a45a8ff 1260 * @{
bogdanm 0:9b334a45a8ff 1261 */
bogdanm 0:9b334a45a8ff 1262 /**
bogdanm 0:9b334a45a8ff 1263 * @brief Returns the RTC state.
bogdanm 0:9b334a45a8ff 1264 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1265 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1266 * @retval HAL state
bogdanm 0:9b334a45a8ff 1267 */
bogdanm 0:9b334a45a8ff 1268 HAL_RTCStateTypeDef HAL_RTC_GetState(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1269 {
bogdanm 0:9b334a45a8ff 1270 return hrtc->State;
bogdanm 0:9b334a45a8ff 1271 }
bogdanm 0:9b334a45a8ff 1272
bogdanm 0:9b334a45a8ff 1273 /**
bogdanm 0:9b334a45a8ff 1274 * @}
bogdanm 0:9b334a45a8ff 1275 */
bogdanm 0:9b334a45a8ff 1276
bogdanm 0:9b334a45a8ff 1277 /** @defgroup RTC_Exported_Functions_Group5 Peripheral Control functions
bogdanm 0:9b334a45a8ff 1278 * @brief Peripheral Control functions
bogdanm 0:9b334a45a8ff 1279 *
bogdanm 0:9b334a45a8ff 1280 @verbatim
bogdanm 0:9b334a45a8ff 1281 ===============================================================================
bogdanm 0:9b334a45a8ff 1282 ##### Peripheral Control functions #####
bogdanm 0:9b334a45a8ff 1283 ===============================================================================
bogdanm 0:9b334a45a8ff 1284 [..]
bogdanm 0:9b334a45a8ff 1285 This subsection provides functions allowing to
bogdanm 0:9b334a45a8ff 1286 (+) Wait for RTC Time and Date Synchronization
bogdanm 0:9b334a45a8ff 1287
bogdanm 0:9b334a45a8ff 1288 @endverbatim
bogdanm 0:9b334a45a8ff 1289 * @{
bogdanm 0:9b334a45a8ff 1290 */
bogdanm 0:9b334a45a8ff 1291
bogdanm 0:9b334a45a8ff 1292 /**
bogdanm 0:9b334a45a8ff 1293 * @brief Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL)
bogdanm 0:9b334a45a8ff 1294 * are synchronized with RTC APB clock.
bogdanm 0:9b334a45a8ff 1295 * @note This function must be called before any read operation after an APB reset
bogdanm 0:9b334a45a8ff 1296 * or an APB clock stop.
bogdanm 0:9b334a45a8ff 1297 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1298 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1299 * @retval HAL status
bogdanm 0:9b334a45a8ff 1300 */
bogdanm 0:9b334a45a8ff 1301 HAL_StatusTypeDef HAL_RTC_WaitForSynchro(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1302 {
bogdanm 0:9b334a45a8ff 1303 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1304
bogdanm 0:9b334a45a8ff 1305 /* Check input parameters */
bogdanm 0:9b334a45a8ff 1306 if(hrtc == NULL)
bogdanm 0:9b334a45a8ff 1307 {
bogdanm 0:9b334a45a8ff 1308 return HAL_ERROR;
bogdanm 0:9b334a45a8ff 1309 }
bogdanm 0:9b334a45a8ff 1310
bogdanm 0:9b334a45a8ff 1311 /* Clear RSF flag */
bogdanm 0:9b334a45a8ff 1312 CLEAR_BIT(hrtc->Instance->CRL, RTC_FLAG_RSF);
bogdanm 0:9b334a45a8ff 1313
bogdanm 0:9b334a45a8ff 1314 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1315
bogdanm 0:9b334a45a8ff 1316 /* Wait the registers to be synchronised */
bogdanm 0:9b334a45a8ff 1317 while((hrtc->Instance->CRL & RTC_FLAG_RSF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1318 {
bogdanm 0:9b334a45a8ff 1319 if((HAL_GetTick() - tickstart ) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1320 {
bogdanm 0:9b334a45a8ff 1321 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1322 }
bogdanm 0:9b334a45a8ff 1323 }
bogdanm 0:9b334a45a8ff 1324
bogdanm 0:9b334a45a8ff 1325 return HAL_OK;
bogdanm 0:9b334a45a8ff 1326 }
bogdanm 0:9b334a45a8ff 1327
bogdanm 0:9b334a45a8ff 1328 /**
bogdanm 0:9b334a45a8ff 1329 * @}
bogdanm 0:9b334a45a8ff 1330 */
bogdanm 0:9b334a45a8ff 1331
bogdanm 0:9b334a45a8ff 1332
bogdanm 0:9b334a45a8ff 1333 /**
bogdanm 0:9b334a45a8ff 1334 * @}
bogdanm 0:9b334a45a8ff 1335 */
bogdanm 0:9b334a45a8ff 1336
bogdanm 0:9b334a45a8ff 1337 /** @addtogroup RTC_Private_Functions
bogdanm 0:9b334a45a8ff 1338 * @{
bogdanm 0:9b334a45a8ff 1339 */
bogdanm 0:9b334a45a8ff 1340
bogdanm 0:9b334a45a8ff 1341
bogdanm 0:9b334a45a8ff 1342 /**
bogdanm 0:9b334a45a8ff 1343 * @brief Read the time counter available in RTC_CNT registers.
bogdanm 0:9b334a45a8ff 1344 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1345 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1346 * @retval Time counter
bogdanm 0:9b334a45a8ff 1347 */
bogdanm 0:9b334a45a8ff 1348 static uint32_t RTC_ReadTimeCounter(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1349 {
bogdanm 0:9b334a45a8ff 1350 uint16_t high1 = 0, high2 = 0, low = 0;
bogdanm 0:9b334a45a8ff 1351 uint32_t timecounter = 0;
bogdanm 0:9b334a45a8ff 1352
bogdanm 0:9b334a45a8ff 1353 high1 = READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1354 low = READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT);
bogdanm 0:9b334a45a8ff 1355 high2 = READ_REG(hrtc->Instance->CNTH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1356
bogdanm 0:9b334a45a8ff 1357 if (high1 != high2)
bogdanm 0:9b334a45a8ff 1358 { /* In this case the counter roll over during reading of CNTL and CNTH registers,
bogdanm 0:9b334a45a8ff 1359 read again CNTL register then return the counter value */
bogdanm 0:9b334a45a8ff 1360 timecounter = (((uint32_t) high2 << 16 ) | READ_REG(hrtc->Instance->CNTL & RTC_CNTL_RTC_CNT));
bogdanm 0:9b334a45a8ff 1361 }
bogdanm 0:9b334a45a8ff 1362 else
bogdanm 0:9b334a45a8ff 1363 { /* No counter roll over during reading of CNTL and CNTH registers, counter
bogdanm 0:9b334a45a8ff 1364 value is equal to first value of CNTL and CNTH */
bogdanm 0:9b334a45a8ff 1365 timecounter = (((uint32_t) high1 << 16 ) | low);
bogdanm 0:9b334a45a8ff 1366 }
bogdanm 0:9b334a45a8ff 1367
bogdanm 0:9b334a45a8ff 1368 return timecounter;
bogdanm 0:9b334a45a8ff 1369 }
bogdanm 0:9b334a45a8ff 1370
bogdanm 0:9b334a45a8ff 1371 /**
bogdanm 0:9b334a45a8ff 1372 * @brief Write the time counter in RTC_CNT registers.
bogdanm 0:9b334a45a8ff 1373 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1374 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1375 * @param TimeCounter: Counter to write in RTC_CNT registers
bogdanm 0:9b334a45a8ff 1376 * @retval HAL status
bogdanm 0:9b334a45a8ff 1377 */
bogdanm 0:9b334a45a8ff 1378 static HAL_StatusTypeDef RTC_WriteTimeCounter(RTC_HandleTypeDef* hrtc, uint32_t TimeCounter)
bogdanm 0:9b334a45a8ff 1379 {
bogdanm 0:9b334a45a8ff 1380 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1381
bogdanm 0:9b334a45a8ff 1382 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1383 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1384 {
bogdanm 0:9b334a45a8ff 1385 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1386 }
bogdanm 0:9b334a45a8ff 1387 else
bogdanm 0:9b334a45a8ff 1388 {
bogdanm 0:9b334a45a8ff 1389 /* Set RTC COUNTER MSB word */
bogdanm 0:9b334a45a8ff 1390 WRITE_REG(hrtc->Instance->CNTH, (TimeCounter >> 16));
bogdanm 0:9b334a45a8ff 1391 /* Set RTC COUNTER LSB word */
bogdanm 0:9b334a45a8ff 1392 WRITE_REG(hrtc->Instance->CNTL, (TimeCounter & RTC_CNTL_RTC_CNT));
bogdanm 0:9b334a45a8ff 1393
bogdanm 0:9b334a45a8ff 1394 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1395 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1396 {
bogdanm 0:9b334a45a8ff 1397 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1398 }
bogdanm 0:9b334a45a8ff 1399 }
bogdanm 0:9b334a45a8ff 1400
bogdanm 0:9b334a45a8ff 1401 return status;
bogdanm 0:9b334a45a8ff 1402 }
bogdanm 0:9b334a45a8ff 1403
bogdanm 0:9b334a45a8ff 1404 /**
bogdanm 0:9b334a45a8ff 1405 * @brief Read the time counter available in RTC_ALR registers.
bogdanm 0:9b334a45a8ff 1406 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1407 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1408 * @retval Time counter
bogdanm 0:9b334a45a8ff 1409 */
bogdanm 0:9b334a45a8ff 1410 static uint32_t RTC_ReadAlarmCounter(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1411 {
bogdanm 0:9b334a45a8ff 1412 uint16_t high1 = 0, low = 0;
bogdanm 0:9b334a45a8ff 1413
bogdanm 0:9b334a45a8ff 1414 high1 = READ_REG(hrtc->Instance->ALRH & RTC_CNTH_RTC_CNT);
bogdanm 0:9b334a45a8ff 1415 low = READ_REG(hrtc->Instance->ALRL & RTC_CNTL_RTC_CNT);
bogdanm 0:9b334a45a8ff 1416
bogdanm 0:9b334a45a8ff 1417 return (((uint32_t) high1 << 16 ) | low);
bogdanm 0:9b334a45a8ff 1418 }
bogdanm 0:9b334a45a8ff 1419
bogdanm 0:9b334a45a8ff 1420 /**
bogdanm 0:9b334a45a8ff 1421 * @brief Write the time counter in RTC_ALR registers.
bogdanm 0:9b334a45a8ff 1422 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1423 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1424 * @param AlarmCounter: Counter to write in RTC_ALR registers
bogdanm 0:9b334a45a8ff 1425 * @retval HAL status
bogdanm 0:9b334a45a8ff 1426 */
bogdanm 0:9b334a45a8ff 1427 static HAL_StatusTypeDef RTC_WriteAlarmCounter(RTC_HandleTypeDef* hrtc, uint32_t AlarmCounter)
bogdanm 0:9b334a45a8ff 1428 {
bogdanm 0:9b334a45a8ff 1429 HAL_StatusTypeDef status = HAL_OK;
bogdanm 0:9b334a45a8ff 1430
bogdanm 0:9b334a45a8ff 1431 /* Set Initialization mode */
bogdanm 0:9b334a45a8ff 1432 if(RTC_EnterInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1433 {
bogdanm 0:9b334a45a8ff 1434 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1435 }
bogdanm 0:9b334a45a8ff 1436 else
bogdanm 0:9b334a45a8ff 1437 {
bogdanm 0:9b334a45a8ff 1438 /* Set RTC COUNTER MSB word */
bogdanm 0:9b334a45a8ff 1439 WRITE_REG(hrtc->Instance->ALRH, (AlarmCounter >> 16));
bogdanm 0:9b334a45a8ff 1440 /* Set RTC COUNTER LSB word */
bogdanm 0:9b334a45a8ff 1441 WRITE_REG(hrtc->Instance->ALRL, (AlarmCounter & RTC_ALRL_RTC_ALR));
bogdanm 0:9b334a45a8ff 1442
bogdanm 0:9b334a45a8ff 1443 /* Wait for synchro */
bogdanm 0:9b334a45a8ff 1444 if(RTC_ExitInitMode(hrtc) != HAL_OK)
bogdanm 0:9b334a45a8ff 1445 {
bogdanm 0:9b334a45a8ff 1446 status = HAL_ERROR;
bogdanm 0:9b334a45a8ff 1447 }
bogdanm 0:9b334a45a8ff 1448 }
bogdanm 0:9b334a45a8ff 1449
bogdanm 0:9b334a45a8ff 1450 return status;
bogdanm 0:9b334a45a8ff 1451 }
bogdanm 0:9b334a45a8ff 1452
bogdanm 0:9b334a45a8ff 1453 /**
bogdanm 0:9b334a45a8ff 1454 * @brief Enters the RTC Initialization mode.
bogdanm 0:9b334a45a8ff 1455 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1456 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1457 * @retval HAL status
bogdanm 0:9b334a45a8ff 1458 */
bogdanm 0:9b334a45a8ff 1459 static HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1460 {
bogdanm 0:9b334a45a8ff 1461 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1462
bogdanm 0:9b334a45a8ff 1463 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1464 /* Wait till RTC is in INIT state and if Time out is reached exit */
bogdanm 0:9b334a45a8ff 1465 while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1466 {
bogdanm 0:9b334a45a8ff 1467 if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1468 {
bogdanm 0:9b334a45a8ff 1469 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1470 }
bogdanm 0:9b334a45a8ff 1471 }
bogdanm 0:9b334a45a8ff 1472
bogdanm 0:9b334a45a8ff 1473 /* Disable the write protection for RTC registers */
bogdanm 0:9b334a45a8ff 1474 __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);
bogdanm 0:9b334a45a8ff 1475
bogdanm 0:9b334a45a8ff 1476
bogdanm 0:9b334a45a8ff 1477 return HAL_OK;
bogdanm 0:9b334a45a8ff 1478 }
bogdanm 0:9b334a45a8ff 1479
bogdanm 0:9b334a45a8ff 1480 /**
bogdanm 0:9b334a45a8ff 1481 * @brief Exit the RTC Initialization mode.
bogdanm 0:9b334a45a8ff 1482 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1483 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1484 * @retval HAL status
bogdanm 0:9b334a45a8ff 1485 */
bogdanm 0:9b334a45a8ff 1486 static HAL_StatusTypeDef RTC_ExitInitMode(RTC_HandleTypeDef* hrtc)
bogdanm 0:9b334a45a8ff 1487 {
bogdanm 0:9b334a45a8ff 1488 uint32_t tickstart = 0;
bogdanm 0:9b334a45a8ff 1489
bogdanm 0:9b334a45a8ff 1490 /* Disable the write protection for RTC registers */
bogdanm 0:9b334a45a8ff 1491 __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
bogdanm 0:9b334a45a8ff 1492
bogdanm 0:9b334a45a8ff 1493 tickstart = HAL_GetTick();
bogdanm 0:9b334a45a8ff 1494 /* Wait till RTC is in INIT state and if Time out is reached exit */
bogdanm 0:9b334a45a8ff 1495 while((hrtc->Instance->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET)
bogdanm 0:9b334a45a8ff 1496 {
bogdanm 0:9b334a45a8ff 1497 if((HAL_GetTick() - tickstart) > RTC_TIMEOUT_VALUE)
bogdanm 0:9b334a45a8ff 1498 {
bogdanm 0:9b334a45a8ff 1499 return HAL_TIMEOUT;
bogdanm 0:9b334a45a8ff 1500 }
bogdanm 0:9b334a45a8ff 1501 }
bogdanm 0:9b334a45a8ff 1502
bogdanm 0:9b334a45a8ff 1503 return HAL_OK;
bogdanm 0:9b334a45a8ff 1504 }
bogdanm 0:9b334a45a8ff 1505
bogdanm 0:9b334a45a8ff 1506 /**
bogdanm 0:9b334a45a8ff 1507 * @brief Converts a 2 digit decimal to BCD format.
bogdanm 0:9b334a45a8ff 1508 * @param Value: Byte to be converted
bogdanm 0:9b334a45a8ff 1509 * @retval Converted byte
bogdanm 0:9b334a45a8ff 1510 */
bogdanm 0:9b334a45a8ff 1511 static uint8_t RTC_ByteToBcd2(uint8_t Value)
bogdanm 0:9b334a45a8ff 1512 {
bogdanm 0:9b334a45a8ff 1513 uint32_t bcdhigh = 0;
bogdanm 0:9b334a45a8ff 1514
bogdanm 0:9b334a45a8ff 1515 while(Value >= 10)
bogdanm 0:9b334a45a8ff 1516 {
bogdanm 0:9b334a45a8ff 1517 bcdhigh++;
bogdanm 0:9b334a45a8ff 1518 Value -= 10;
bogdanm 0:9b334a45a8ff 1519 }
bogdanm 0:9b334a45a8ff 1520
bogdanm 0:9b334a45a8ff 1521 return ((uint8_t)(bcdhigh << 4) | Value);
bogdanm 0:9b334a45a8ff 1522 }
bogdanm 0:9b334a45a8ff 1523
bogdanm 0:9b334a45a8ff 1524 /**
bogdanm 0:9b334a45a8ff 1525 * @brief Converts from 2 digit BCD to Binary.
bogdanm 0:9b334a45a8ff 1526 * @param Value: BCD value to be converted
bogdanm 0:9b334a45a8ff 1527 * @retval Converted word
bogdanm 0:9b334a45a8ff 1528 */
bogdanm 0:9b334a45a8ff 1529 static uint8_t RTC_Bcd2ToByte(uint8_t Value)
bogdanm 0:9b334a45a8ff 1530 {
bogdanm 0:9b334a45a8ff 1531 uint32_t tmp = 0;
bogdanm 0:9b334a45a8ff 1532 tmp = ((uint8_t)(Value & (uint8_t)0xF0) >> (uint8_t)0x4) * 10;
bogdanm 0:9b334a45a8ff 1533 return (tmp + (Value & (uint8_t)0x0F));
bogdanm 0:9b334a45a8ff 1534 }
bogdanm 0:9b334a45a8ff 1535
bogdanm 0:9b334a45a8ff 1536 /**
bogdanm 0:9b334a45a8ff 1537 * @brief Updates date when time is 23:59:59.
bogdanm 0:9b334a45a8ff 1538 * @param hrtc pointer to a RTC_HandleTypeDef structure that contains
bogdanm 0:9b334a45a8ff 1539 * the configuration information for RTC.
bogdanm 0:9b334a45a8ff 1540 * @param DayElapsed: Number of days elapsed from last date update
bogdanm 0:9b334a45a8ff 1541 * @retval None
bogdanm 0:9b334a45a8ff 1542 */
bogdanm 0:9b334a45a8ff 1543 static void RTC_DateUpdate(RTC_HandleTypeDef* hrtc, uint32_t DayElapsed)
bogdanm 0:9b334a45a8ff 1544 {
bogdanm 0:9b334a45a8ff 1545 uint32_t year = 0, month = 0, day = 0;
bogdanm 0:9b334a45a8ff 1546 uint32_t loop = 0;
bogdanm 0:9b334a45a8ff 1547
bogdanm 0:9b334a45a8ff 1548 /* Get the current year*/
bogdanm 0:9b334a45a8ff 1549 year = hrtc->DateToUpdate.Year;
bogdanm 0:9b334a45a8ff 1550
bogdanm 0:9b334a45a8ff 1551 /* Get the current month and day */
bogdanm 0:9b334a45a8ff 1552 month = hrtc->DateToUpdate.Month;
bogdanm 0:9b334a45a8ff 1553 day = hrtc->DateToUpdate.Date;
bogdanm 0:9b334a45a8ff 1554
bogdanm 0:9b334a45a8ff 1555 for (loop = 0; loop < DayElapsed; loop++)
bogdanm 0:9b334a45a8ff 1556 {
bogdanm 0:9b334a45a8ff 1557 if((month == 1) || (month == 3) || (month == 5) || (month == 7) || \
bogdanm 0:9b334a45a8ff 1558 (month == 8) || (month == 10) || (month == 12))
bogdanm 0:9b334a45a8ff 1559 {
bogdanm 0:9b334a45a8ff 1560 if(day < 31)
bogdanm 0:9b334a45a8ff 1561 {
bogdanm 0:9b334a45a8ff 1562 day++;
bogdanm 0:9b334a45a8ff 1563 }
bogdanm 0:9b334a45a8ff 1564 /* Date structure member: day = 31 */
bogdanm 0:9b334a45a8ff 1565 else
bogdanm 0:9b334a45a8ff 1566 {
bogdanm 0:9b334a45a8ff 1567 if(month != 12)
bogdanm 0:9b334a45a8ff 1568 {
bogdanm 0:9b334a45a8ff 1569 month++;
bogdanm 0:9b334a45a8ff 1570 day = 1;
bogdanm 0:9b334a45a8ff 1571 }
bogdanm 0:9b334a45a8ff 1572 /* Date structure member: day = 31 & month =12 */
bogdanm 0:9b334a45a8ff 1573 else
bogdanm 0:9b334a45a8ff 1574 {
bogdanm 0:9b334a45a8ff 1575 month = 1;
bogdanm 0:9b334a45a8ff 1576 day = 1;
bogdanm 0:9b334a45a8ff 1577 year++;
bogdanm 0:9b334a45a8ff 1578 }
bogdanm 0:9b334a45a8ff 1579 }
bogdanm 0:9b334a45a8ff 1580 }
bogdanm 0:9b334a45a8ff 1581 else if((month == 4) || (month == 6) || (month == 9) || (month == 11))
bogdanm 0:9b334a45a8ff 1582 {
bogdanm 0:9b334a45a8ff 1583 if(day < 30)
bogdanm 0:9b334a45a8ff 1584 {
bogdanm 0:9b334a45a8ff 1585 day++;
bogdanm 0:9b334a45a8ff 1586 }
bogdanm 0:9b334a45a8ff 1587 /* Date structure member: day = 30 */
bogdanm 0:9b334a45a8ff 1588 else
bogdanm 0:9b334a45a8ff 1589 {
bogdanm 0:9b334a45a8ff 1590 month++;
bogdanm 0:9b334a45a8ff 1591 day = 1;
bogdanm 0:9b334a45a8ff 1592 }
bogdanm 0:9b334a45a8ff 1593 }
bogdanm 0:9b334a45a8ff 1594 else if(month == 2)
bogdanm 0:9b334a45a8ff 1595 {
bogdanm 0:9b334a45a8ff 1596 if(day < 28)
bogdanm 0:9b334a45a8ff 1597 {
bogdanm 0:9b334a45a8ff 1598 day++;
bogdanm 0:9b334a45a8ff 1599 }
bogdanm 0:9b334a45a8ff 1600 else if(day == 28)
bogdanm 0:9b334a45a8ff 1601 {
bogdanm 0:9b334a45a8ff 1602 /* Leap year */
bogdanm 0:9b334a45a8ff 1603 if(RTC_IsLeapYear(year))
bogdanm 0:9b334a45a8ff 1604 {
bogdanm 0:9b334a45a8ff 1605 day++;
bogdanm 0:9b334a45a8ff 1606 }
bogdanm 0:9b334a45a8ff 1607 else
bogdanm 0:9b334a45a8ff 1608 {
bogdanm 0:9b334a45a8ff 1609 month++;
bogdanm 0:9b334a45a8ff 1610 day = 1;
bogdanm 0:9b334a45a8ff 1611 }
bogdanm 0:9b334a45a8ff 1612 }
bogdanm 0:9b334a45a8ff 1613 else if(day == 29)
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 }
bogdanm 0:9b334a45a8ff 1620
bogdanm 0:9b334a45a8ff 1621 /* Update year */
bogdanm 0:9b334a45a8ff 1622 hrtc->DateToUpdate.Year = year;
bogdanm 0:9b334a45a8ff 1623
bogdanm 0:9b334a45a8ff 1624 /* Update day and month */
bogdanm 0:9b334a45a8ff 1625 hrtc->DateToUpdate.Month = month;
bogdanm 0:9b334a45a8ff 1626 hrtc->DateToUpdate.Date = day;
bogdanm 0:9b334a45a8ff 1627
bogdanm 0:9b334a45a8ff 1628 /* Update day of the week */
bogdanm 0:9b334a45a8ff 1629 hrtc->DateToUpdate.WeekDay = RTC_WeekDayNum(year, month, day);
bogdanm 0:9b334a45a8ff 1630 }
bogdanm 0:9b334a45a8ff 1631
bogdanm 0:9b334a45a8ff 1632 /**
bogdanm 0:9b334a45a8ff 1633 * @brief Check whether the passed year is Leap or not.
bogdanm 0:9b334a45a8ff 1634 * @param nYear year to check
bogdanm 0:9b334a45a8ff 1635 * @retval 1: leap year
bogdanm 0:9b334a45a8ff 1636 * 0: not leap year
bogdanm 0:9b334a45a8ff 1637 */
bogdanm 0:9b334a45a8ff 1638 static uint8_t RTC_IsLeapYear(uint16_t nYear)
bogdanm 0:9b334a45a8ff 1639 {
bogdanm 0:9b334a45a8ff 1640 if((nYear % 4) != 0)
bogdanm 0:9b334a45a8ff 1641 {
bogdanm 0:9b334a45a8ff 1642 return 0;
bogdanm 0:9b334a45a8ff 1643 }
bogdanm 0:9b334a45a8ff 1644
bogdanm 0:9b334a45a8ff 1645 if((nYear % 100) != 0)
bogdanm 0:9b334a45a8ff 1646 {
bogdanm 0:9b334a45a8ff 1647 return 1;
bogdanm 0:9b334a45a8ff 1648 }
bogdanm 0:9b334a45a8ff 1649
bogdanm 0:9b334a45a8ff 1650 if((nYear % 400) == 0)
bogdanm 0:9b334a45a8ff 1651 {
bogdanm 0:9b334a45a8ff 1652 return 1;
bogdanm 0:9b334a45a8ff 1653 }
bogdanm 0:9b334a45a8ff 1654 else
bogdanm 0:9b334a45a8ff 1655 {
bogdanm 0:9b334a45a8ff 1656 return 0;
bogdanm 0:9b334a45a8ff 1657 }
bogdanm 0:9b334a45a8ff 1658 }
bogdanm 0:9b334a45a8ff 1659
bogdanm 0:9b334a45a8ff 1660 /**
bogdanm 0:9b334a45a8ff 1661 * @brief Determines the week number, the day number and the week day number.
bogdanm 0:9b334a45a8ff 1662 * @param nYear year to check
bogdanm 0:9b334a45a8ff 1663 * @param nMonth Month to check
bogdanm 0:9b334a45a8ff 1664 * @param nDay Day to check
bogdanm 0:9b334a45a8ff 1665 * @note Day is calculated with hypothesis that year > 2000
bogdanm 0:9b334a45a8ff 1666 * @retval Value which can take one of the following parameters:
bogdanm 0:9b334a45a8ff 1667 * @arg RTC_WEEKDAY_MONDAY
bogdanm 0:9b334a45a8ff 1668 * @arg RTC_WEEKDAY_TUESDAY
bogdanm 0:9b334a45a8ff 1669 * @arg RTC_WEEKDAY_WEDNESDAY
bogdanm 0:9b334a45a8ff 1670 * @arg RTC_WEEKDAY_THURSDAY
bogdanm 0:9b334a45a8ff 1671 * @arg RTC_WEEKDAY_FRIDAY
bogdanm 0:9b334a45a8ff 1672 * @arg RTC_WEEKDAY_SATURDAY
bogdanm 0:9b334a45a8ff 1673 * @arg RTC_WEEKDAY_SUNDAY
bogdanm 0:9b334a45a8ff 1674 */
bogdanm 0:9b334a45a8ff 1675 static uint8_t RTC_WeekDayNum(uint32_t nYear, uint8_t nMonth, uint8_t nDay)
bogdanm 0:9b334a45a8ff 1676 {
bogdanm 0:9b334a45a8ff 1677 uint32_t year = 0, weekday = 0;
bogdanm 0:9b334a45a8ff 1678
bogdanm 0:9b334a45a8ff 1679 year = 2000 + nYear;
bogdanm 0:9b334a45a8ff 1680
bogdanm 0:9b334a45a8ff 1681 if(nMonth < 3)
bogdanm 0:9b334a45a8ff 1682 {
bogdanm 0:9b334a45a8ff 1683 /*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
bogdanm 0:9b334a45a8ff 1684 weekday = (((23 * nMonth)/9) + nDay + 4 + year + ((year-1)/4) - ((year-1)/100) + ((year-1)/400)) % 7;
bogdanm 0:9b334a45a8ff 1685 }
bogdanm 0:9b334a45a8ff 1686 else
bogdanm 0:9b334a45a8ff 1687 {
bogdanm 0:9b334a45a8ff 1688 /*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
bogdanm 0:9b334a45a8ff 1689 weekday = (((23 * nMonth)/9) + nDay + 4 + year + (year/4) - (year/100) + (year/400) - 2 ) % 7;
bogdanm 0:9b334a45a8ff 1690 }
bogdanm 0:9b334a45a8ff 1691
bogdanm 0:9b334a45a8ff 1692 return (uint8_t)weekday;
bogdanm 0:9b334a45a8ff 1693 }
bogdanm 0:9b334a45a8ff 1694
bogdanm 0:9b334a45a8ff 1695 /**
bogdanm 0:9b334a45a8ff 1696 * @}
bogdanm 0:9b334a45a8ff 1697 */
bogdanm 0:9b334a45a8ff 1698
bogdanm 0:9b334a45a8ff 1699 #endif /* HAL_RTC_MODULE_ENABLED */
bogdanm 0:9b334a45a8ff 1700 /**
bogdanm 0:9b334a45a8ff 1701 * @}
bogdanm 0:9b334a45a8ff 1702 */
bogdanm 0:9b334a45a8ff 1703
bogdanm 0:9b334a45a8ff 1704 /**
bogdanm 0:9b334a45a8ff 1705 * @}
bogdanm 0:9b334a45a8ff 1706 */
bogdanm 0:9b334a45a8ff 1707
bogdanm 0:9b334a45a8ff 1708 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/