2015-03-12 09:20:56 +00:00
/* mbed Microcontroller Library
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2017-11-07 16:24:34 +00:00
* Copyright ( c ) 2017 , STMicroelectronics
2015-03-12 09:20:56 +00:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
*
* 1. Redistributions of source code must retain the above copyright notice ,
* this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright notice ,
* this list of conditions and the following disclaimer in the documentation
* and / or other materials provided with the distribution .
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS "
* AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
* DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY ,
* OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
2017-11-07 16:24:34 +00:00
2015-03-12 09:20:56 +00:00
# if DEVICE_RTC
2016-11-23 15:41:32 +00:00
# include "rtc_api_hal.h"
2017-06-08 02:59:17 +00:00
# include "mbed_mktime.h"
2015-03-12 09:20:56 +00:00
static RTC_HandleTypeDef RtcHandle ;
2018-01-09 13:10:14 +00:00
# if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
2018-01-12 10:52:47 +00:00
# define GET_TICK_PERIOD(VALUE) (2048 * 1000000 / VALUE) /* 1s / SynchPrediv value * 2^11 (value to get the maximum precision value with no u32 overflow) */
2016-12-06 08:54:24 +00:00
static void ( * irq_handler ) ( void ) ;
static void RTC_IRQHandler ( void ) ;
2018-01-12 10:52:47 +00:00
static uint32_t lp_TickPeriod_us = GET_TICK_PERIOD ( 4095 ) ; /* default SynchPrediv value = 4095 */
2018-01-09 13:10:14 +00:00
# endif /* DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM */
2016-09-15 12:00:24 +00:00
2015-03-12 09:20:56 +00:00
void rtc_init ( void )
{
2017-10-06 13:44:16 +00:00
RCC_OscInitTypeDef RCC_OscInitStruct = { 0 } ;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 } ;
2015-03-12 09:20:56 +00:00
2016-04-14 12:48:11 +00:00
// Enable access to Backup domain
2017-11-17 11:11:22 +00:00
__HAL_RCC_PWR_CLK_ENABLE ( ) ;
2016-04-14 12:48:11 +00:00
HAL_PWR_EnableBkUpAccess ( ) ;
2018-04-24 08:56:49 +00:00
# if DEVICE_LOWPOWERTIMER
if ( ( rtc_isenabled ( ) ) & & ( ( RTC - > PRER & RTC_PRER_PREDIV_S ) = = PREDIV_S_VALUE ) ) {
# else /* DEVICE_LOWPOWERTIMER */
2017-11-17 11:11:22 +00:00
if ( rtc_isenabled ( ) ) {
2018-04-24 08:56:49 +00:00
# endif /* DEVICE_LOWPOWERTIMER */
2017-11-17 11:11:22 +00:00
return ;
}
2017-12-04 13:00:30 +00:00
# if MBED_CONF_TARGET_LSE_AVAILABLE
2018-03-14 10:12:29 +00:00
RCC_OscInitStruct . OscillatorType = RCC_OSCILLATORTYPE_LSE ;
2015-03-12 09:20:56 +00:00
RCC_OscInitStruct . PLL . PLLState = RCC_PLL_NONE ; // Mandatory, otherwise the PLL is reconfigured!
2016-11-23 15:41:32 +00:00
RCC_OscInitStruct . LSEState = RCC_LSE_ON ;
2017-11-07 16:24:34 +00:00
if ( HAL_RCC_OscConfig ( & RCC_OscInitStruct ) ! = HAL_OK ) {
2016-12-06 08:54:24 +00:00
error ( " Cannot initialize RTC with LSE \n " ) ;
2016-11-23 15:41:32 +00:00
}
2017-11-07 16:24:34 +00:00
__HAL_RCC_RTC_CLKPRESCALER ( RCC_RTCCLKSOURCE_LSE ) ;
__HAL_RCC_RTC_CONFIG ( RCC_RTCCLKSOURCE_LSE ) ;
2016-04-14 12:48:11 +00:00
PeriphClkInitStruct . PeriphClockSelection = RCC_PERIPHCLK_RTC ;
PeriphClkInitStruct . RTCClockSelection = RCC_RTCCLKSOURCE_LSE ;
2016-12-06 08:54:24 +00:00
if ( HAL_RCCEx_PeriphCLKConfig ( & PeriphClkInitStruct ) ! = HAL_OK ) {
2016-11-23 15:41:32 +00:00
error ( " PeriphClkInitStruct RTC failed with LSE \n " ) ;
2016-04-15 12:37:08 +00:00
}
2017-12-04 13:00:30 +00:00
# else /* MBED_CONF_TARGET_LSE_AVAILABLE */
2016-04-04 09:05:52 +00:00
// Reset Backup domain
__HAL_RCC_BACKUPRESET_FORCE ( ) ;
__HAL_RCC_BACKUPRESET_RELEASE ( ) ;
2016-03-25 13:56:56 +00:00
// Enable LSI clock
2018-03-14 10:12:29 +00:00
RCC_OscInitStruct . OscillatorType = RCC_OSCILLATORTYPE_LSI ;
2016-03-25 13:56:56 +00:00
RCC_OscInitStruct . PLL . PLLState = RCC_PLL_NONE ; // Mandatory, otherwise the PLL is reconfigured!
RCC_OscInitStruct . LSIState = RCC_LSI_ON ;
2016-12-06 08:54:24 +00:00
if ( HAL_RCC_OscConfig ( & RCC_OscInitStruct ) ! = HAL_OK ) {
2016-11-23 15:41:32 +00:00
error ( " Cannot initialize RTC with LSI \n " ) ;
2016-03-25 13:56:56 +00:00
}
2016-11-23 15:41:32 +00:00
__HAL_RCC_RTC_CLKPRESCALER ( RCC_RTCCLKSOURCE_LSI ) ;
__HAL_RCC_RTC_CONFIG ( RCC_RTCCLKSOURCE_LSI ) ;
2016-04-14 12:48:11 +00:00
PeriphClkInitStruct . PeriphClockSelection = RCC_PERIPHCLK_RTC ;
2016-04-15 12:37:08 +00:00
PeriphClkInitStruct . RTCClockSelection = RCC_RTCCLKSOURCE_LSI ;
2016-12-06 08:54:24 +00:00
if ( HAL_RCCEx_PeriphCLKConfig ( & PeriphClkInitStruct ) ! = HAL_OK ) {
2016-11-23 15:41:32 +00:00
error ( " PeriphClkInitStruct RTC failed with LSI \n " ) ;
2016-04-15 12:37:08 +00:00
}
2017-12-04 13:00:30 +00:00
# endif /* MBED_CONF_TARGET_LSE_AVAILABLE */
2016-01-11 17:11:19 +00:00
2015-03-12 09:20:56 +00:00
// Enable RTC
__HAL_RCC_RTC_ENABLE ( ) ;
2017-11-07 16:24:34 +00:00
RtcHandle . Instance = RTC ;
RtcHandle . State = HAL_RTC_STATE_RESET ;
2016-11-23 15:41:32 +00:00
# if TARGET_STM32F1
RtcHandle . Init . AsynchPrediv = RTC_AUTO_1_SECOND ;
# else /* TARGET_STM32F1 */
2015-03-12 09:20:56 +00:00
RtcHandle . Init . HourFormat = RTC_HOURFORMAT_24 ;
2018-04-24 08:56:49 +00:00
RtcHandle . Init . AsynchPrediv = PREDIV_A_VALUE ;
RtcHandle . Init . SynchPrediv = PREDIV_S_VALUE ;
2015-03-12 09:20:56 +00:00
RtcHandle . Init . OutPut = RTC_OUTPUT_DISABLE ;
RtcHandle . Init . OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH ;
RtcHandle . Init . OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN ;
2016-11-23 15:41:32 +00:00
# endif /* TARGET_STM32F1 */
2015-03-12 09:20:56 +00:00
2018-01-12 10:52:47 +00:00
# if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
lp_TickPeriod_us = GET_TICK_PERIOD ( RtcHandle . Init . SynchPrediv ) ;
# endif
2015-03-12 09:20:56 +00:00
if ( HAL_RTC_Init ( & RtcHandle ) ! = HAL_OK ) {
2017-11-07 16:24:34 +00:00
error ( " RTC initialization failed " ) ;
2015-03-12 09:20:56 +00:00
}
2016-09-15 12:00:24 +00:00
2017-11-07 16:24:34 +00:00
rtc_synchronize ( ) ; // Wait for RSF
2016-11-23 15:41:32 +00:00
2017-11-07 16:24:34 +00:00
if ( ! rtc_isenabled ( ) ) {
2016-09-15 12:00:24 +00:00
rtc_write ( 0 ) ;
}
2015-03-12 09:20:56 +00:00
}
void rtc_free ( void )
{
// Disable access to Backup domain
HAL_PWR_DisableBkUpAccess ( ) ;
}
/*
2017-02-22 07:50:29 +00:00
ST RTC_DateTypeDef structure
WeekDay 1 = monday , 2 = tuesday , . . . , 7 = sunday
Month 0x1 = january , 0x2 = february , . . . , 0x12 = december
Date day of the month 1 - 31
Year year 0 - 99
ST RTC_TimeTypeDef structure
Hours 0 - 12 if the RTC_HourFormat_12 is selected during init
0 - 23 if the RTC_HourFormat_24 is selected during init
Minutes 0 - 59
Seconds 0 - 59
TimeFormat RTC_HOURFORMAT12_AM / RTC_HOURFORMAT12_PM
SubSeconds time unit range between [ 0 - 1 ] Second with [ 1 Sec / SecondFraction + 1 ] granularity
SecondFraction range or granularity of Sub Second register content corresponding to Synchronous pre - scaler factor value ( PREDIV_S )
DayLightSaving RTC_DAYLIGHTSAVING_SUB1H / RTC_DAYLIGHTSAVING_ADD1H / RTC_DAYLIGHTSAVING_NONE
StoreOperation RTC_STOREOPERATION_RESET / RTC_STOREOPERATION_SET
2015-03-12 09:20:56 +00:00
struct tm
tm_sec seconds after the minute 0 - 61
tm_min minutes after the hour 0 - 59
tm_hour hours since midnight 0 - 23
tm_mday day of the month 1 - 31
tm_mon months since January 0 - 11
tm_year years since 1900
tm_wday days since Sunday 0 - 6
tm_yday days since January 1 0 - 365
tm_isdst Daylight Saving Time flag
*/
2017-02-22 07:50:29 +00:00
/*
Information about STM32F0 , STM32F2 , STM32F3 , STM32F4 , STM32F7 , STM32L0 , STM32L1 , STM32L4 :
BCD format is used to store the date in the RTC . The year is store on 2 * 4 bits .
Because the first year is reserved to see if the RTC is init , the supposed range is 01 - 99.
1 st point is to cover the standard range from 1970 to 2038 ( limited by the 32 bits of time_t ) .
2 nd point is to keep the year 1970 and the leap years synchronized .
So by moving it 68 years forward from 1970 , it become 1969 - 2067 which include 1970 - 2038.
68 is also a multiple of 4 so it let the leap year synchronized .
Information about STM32F1 :
2018-02-27 10:02:49 +00:00
32 bit register is used ( no BCD format ) for the seconds .
For date , there is no specific register , only a software structure .
2017-02-22 07:50:29 +00:00
It is then not a problem to not use shifts .
*/
2015-03-12 09:20:56 +00:00
time_t rtc_read ( void )
{
2017-10-06 13:44:16 +00:00
RTC_DateTypeDef dateStruct = { 0 } ;
RTC_TimeTypeDef timeStruct = { 0 } ;
2015-03-12 09:20:56 +00:00
struct tm timeinfo ;
RtcHandle . Instance = RTC ;
// Read actual date and time
// Warning: the time must be read first!
2017-02-22 07:50:29 +00:00
HAL_RTC_GetTime ( & RtcHandle , & timeStruct , RTC_FORMAT_BIN ) ;
HAL_RTC_GetDate ( & RtcHandle , & dateStruct , RTC_FORMAT_BIN ) ;
2015-03-12 09:20:56 +00:00
2018-02-27 10:02:49 +00:00
# if TARGET_STM32F1
/* date information is null before first write procedure */
/* set 01/01/1970 as default values */
if ( dateStruct . Year = = 0 ) {
dateStruct . Year = 2 ;
dateStruct . Month = 1 ;
dateStruct . Date = 1 ;
}
# endif
2015-03-12 09:20:56 +00:00
// Setup a tm structure based on the RTC
2018-02-27 10:02:49 +00:00
/* tm_wday information is ignored by _rtc_maketime */
/* tm_isdst information is ignored by _rtc_maketime */
2015-03-12 09:20:56 +00:00
timeinfo . tm_mon = dateStruct . Month - 1 ;
timeinfo . tm_mday = dateStruct . Date ;
2016-07-06 15:24:16 +00:00
timeinfo . tm_year = dateStruct . Year + 68 ;
2015-03-12 09:20:56 +00:00
timeinfo . tm_hour = timeStruct . Hours ;
timeinfo . tm_min = timeStruct . Minutes ;
timeinfo . tm_sec = timeStruct . Seconds ;
// Convert to timestamp
2017-11-16 13:42:49 +00:00
time_t t ;
if ( _rtc_maketime ( & timeinfo , & t , RTC_4_YEAR_LEAP_YEAR_SUPPORT ) = = false ) {
return 0 ;
}
2015-03-12 09:20:56 +00:00
return t ;
}
void rtc_write ( time_t t )
{
2017-10-06 13:44:16 +00:00
RTC_DateTypeDef dateStruct = { 0 } ;
RTC_TimeTypeDef timeStruct = { 0 } ;
2015-03-12 09:20:56 +00:00
RtcHandle . Instance = RTC ;
// Convert the time into a tm
2017-06-08 02:59:17 +00:00
struct tm timeinfo ;
2017-11-16 13:42:49 +00:00
if ( _rtc_localtime ( t , & timeinfo , RTC_4_YEAR_LEAP_YEAR_SUPPORT ) = = false ) {
2017-06-08 02:59:17 +00:00
return ;
}
2015-03-12 09:20:56 +00:00
// Fill RTC structures
2017-06-08 02:59:17 +00:00
if ( timeinfo . tm_wday = = 0 ) {
2017-02-22 07:50:29 +00:00
dateStruct . WeekDay = 7 ;
} else {
2017-06-08 02:59:17 +00:00
dateStruct . WeekDay = timeinfo . tm_wday ;
2017-02-22 07:50:29 +00:00
}
2017-06-08 02:59:17 +00:00
dateStruct . Month = timeinfo . tm_mon + 1 ;
dateStruct . Date = timeinfo . tm_mday ;
dateStruct . Year = timeinfo . tm_year - 68 ;
timeStruct . Hours = timeinfo . tm_hour ;
timeStruct . Minutes = timeinfo . tm_min ;
timeStruct . Seconds = timeinfo . tm_sec ;
2016-11-23 15:41:32 +00:00
# if !(TARGET_STM32F1)
2016-07-06 15:24:16 +00:00
timeStruct . TimeFormat = RTC_HOURFORMAT_24 ;
2015-03-12 09:20:56 +00:00
timeStruct . DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
timeStruct . StoreOperation = RTC_STOREOPERATION_RESET ;
2016-11-23 15:41:32 +00:00
# endif /* TARGET_STM32F1 */
2015-03-12 09:20:56 +00:00
// Change the RTC current date/time
2017-11-07 16:24:34 +00:00
if ( HAL_RTC_SetDate ( & RtcHandle , & dateStruct , RTC_FORMAT_BIN ) ! = HAL_OK ) {
2017-11-17 12:07:19 +00:00
error ( " HAL_RTC_SetDate error \n " ) ;
2017-11-07 16:24:34 +00:00
}
if ( HAL_RTC_SetTime ( & RtcHandle , & timeStruct , RTC_FORMAT_BIN ) ! = HAL_OK ) {
2017-11-17 12:07:19 +00:00
error ( " HAL_RTC_SetTime error \n " ) ;
2017-11-07 16:24:34 +00:00
}
2015-03-12 09:20:56 +00:00
}
2016-11-23 15:41:32 +00:00
int rtc_isenabled ( void )
{
2017-02-22 07:50:29 +00:00
# if !(TARGET_STM32F1)
return ( ( ( RTC - > ISR & RTC_ISR_INITS ) = = RTC_ISR_INITS ) & & ( ( RTC - > ISR & RTC_ISR_RSF ) = = RTC_ISR_RSF ) ) ;
# else /* TARGET_STM32F1 */
return ( ( RTC - > CRL & RTC_CRL_RSF ) = = RTC_CRL_RSF ) ;
# endif /* TARGET_STM32F1 */
2016-11-23 15:41:32 +00:00
}
2017-11-07 16:24:34 +00:00
void rtc_synchronize ( void )
{
2017-12-21 09:50:47 +00:00
RtcHandle . Instance = RTC ;
2017-11-07 16:24:34 +00:00
if ( HAL_RTC_WaitForSynchro ( & RtcHandle ) ! = HAL_OK ) {
error ( " rtc_synchronize error \n " ) ;
}
}
2018-01-09 13:10:14 +00:00
# if DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM
2016-09-15 12:00:24 +00:00
static void RTC_IRQHandler ( void )
{
2017-10-10 15:04:29 +00:00
/* Update HAL state */
2017-12-21 09:50:47 +00:00
RtcHandle . Instance = RTC ;
2016-09-15 12:00:24 +00:00
HAL_RTCEx_WakeUpTimerIRQHandler ( & RtcHandle ) ;
2017-10-10 15:04:29 +00:00
/* In case of registered handler, call it. */
2016-09-15 12:00:24 +00:00
if ( irq_handler ) {
irq_handler ( ) ;
}
}
2018-01-12 10:52:47 +00:00
uint32_t rtc_read_us ( void )
2016-09-15 12:00:24 +00:00
{
2018-01-12 10:52:47 +00:00
RTC_TimeTypeDef timeStruct = { 0 } ;
RTC_DateTypeDef dateStruct = { 0 } ;
RtcHandle . Instance = RTC ;
HAL_RTC_GetTime ( & RtcHandle , & timeStruct , RTC_FORMAT_BIN ) ;
/* Reading RTC current time locks the values in calendar shadow registers until Current date is read
to ensure consistency between the time and date values */
HAL_RTC_GetDate ( & RtcHandle , & dateStruct , RTC_FORMAT_BIN ) ;
if ( timeStruct . SubSeconds > timeStruct . SecondFraction ) {
/* SS can be larger than PREDIV_S only after a shift operation. In that case, the correct
time / date is one second less than as indicated by RTC_TR / RTC_DR . */
timeStruct . Seconds - = 1 ;
}
uint32_t RTCTime = timeStruct . Seconds + timeStruct . Minutes * 60 + timeStruct . Hours * 60 * 60 ;
uint32_t Time_us = ( ( timeStruct . SecondFraction - timeStruct . SubSeconds ) * lp_TickPeriod_us ) > > 11 ;
return ( RTCTime * 1000000 ) + Time_us ;
2016-09-15 12:00:24 +00:00
}
void rtc_set_wake_up_timer ( uint32_t delta )
{
2018-03-15 10:12:09 +00:00
# define RTC_CLOCK_US (((uint64_t)RTC_CLOCK << 32 ) / 1000000)
uint32_t WakeUpCounter ;
uint32_t WakeUpClock ;
2017-11-07 16:24:34 +00:00
/* Ex for Wakeup period resolution with RTCCLK=32768 Hz :
* RTCCLK_DIV2 : ~ 122u s < wakeup period < ~ 4 s
* RTCCLK_DIV4 : ~ 244u s < wakeup period < ~ 8 s
* RTCCLK_DIV8 : ~ 488u s < wakeup period < ~ 16 s
* RTCCLK_DIV16 : ~ 976u s < wakeup period < ~ 32 s
* CK_SPRE_16BITS : 1 s < wakeup period < ( 0xFFFF + 1 ) x 1 s = 65536 s ( 18 hours )
* CK_SPRE_17BITS : 18 h + 1 s < wakeup period < ( 0x1FFFF + 1 ) x 1 s = 131072 s ( 36 hours )
*/
2018-03-15 10:12:09 +00:00
if ( delta < ( 0x10000 * 2 / RTC_CLOCK * 1000000 ) ) { // (0xFFFF + 1) * RTCCLK_DIV2 / RTC_CLOCK * 1s
WakeUpCounter = ( ( ( uint64_t ) delta * RTC_CLOCK_US ) > > 32 ) > > 1 ;
WakeUpClock = RTC_WAKEUPCLOCK_RTCCLK_DIV2 ;
} else if ( delta < ( 0x10000 * 4 / RTC_CLOCK * 1000000 ) ) {
WakeUpCounter = ( ( ( uint64_t ) delta * RTC_CLOCK_US ) > > 32 ) > > 2 ;
WakeUpClock = RTC_WAKEUPCLOCK_RTCCLK_DIV4 ;
} else if ( delta < ( 0x10000 * 8 / RTC_CLOCK * 1000000 ) ) {
WakeUpCounter = ( ( ( uint64_t ) delta * RTC_CLOCK_US ) > > 32 ) > > 3 ;
WakeUpClock = RTC_WAKEUPCLOCK_RTCCLK_DIV8 ;
} else if ( delta < ( 0x10000 * 16 / RTC_CLOCK * 1000000 ) ) {
WakeUpCounter = ( ( ( uint64_t ) delta * RTC_CLOCK_US ) > > 32 ) > > 4 ;
WakeUpClock = RTC_WAKEUPCLOCK_RTCCLK_DIV16 ;
} else {
WakeUpCounter = ( delta / 1000000 ) ;
WakeUpClock = RTC_WAKEUPCLOCK_CK_SPRE_16BITS ;
2017-11-07 16:24:34 +00:00
}
2016-11-23 15:41:32 +00:00
2017-11-07 16:24:34 +00:00
irq_handler = ( void ( * ) ( void ) ) lp_ticker_irq_handler ;
NVIC_SetVector ( RTC_WKUP_IRQn , ( uint32_t ) RTC_IRQHandler ) ;
NVIC_EnableIRQ ( RTC_WKUP_IRQn ) ;
2017-12-21 09:50:47 +00:00
RtcHandle . Instance = RTC ;
2018-03-15 10:12:09 +00:00
if ( HAL_RTCEx_SetWakeUpTimer_IT ( & RtcHandle , ( uint32_t ) WakeUpCounter , WakeUpClock ) ! = HAL_OK ) {
error ( " rtc_set_wake_up_timer init error \n " ) ;
2016-09-15 12:00:24 +00:00
}
}
void rtc_deactivate_wake_up_timer ( void )
{
2017-12-21 09:50:47 +00:00
RtcHandle . Instance = RTC ;
2016-09-15 12:00:24 +00:00
HAL_RTCEx_DeactivateWakeUpTimer ( & RtcHandle ) ;
}
2018-01-09 13:10:14 +00:00
# endif /* DEVICE_LOWPOWERTIMER && !MBED_CONF_TARGET_LOWPOWERTIMER_LPTIM */
2016-09-15 12:00:24 +00:00
2016-11-23 15:41:32 +00:00
# endif /* DEVICE_RTC */