diff --git a/src/BSP/rtc.c b/src/BSP/rtc.c deleted file mode 100644 index a3dccee..0000000 --- a/src/BSP/rtc.c +++ /dev/null @@ -1,156 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file rtc.c - * @brief This file provides code for the configuration - * of the RTC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2022 STMicroelectronics. - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "rtc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -RTC_HandleTypeDef hrtc; - -/* RTC init function */ -void MX_RTC_Init(void) -{ - - /* USER CODE BEGIN RTC_Init 0 */ - - /* USER CODE END RTC_Init 0 */ - - RTC_AlarmTypeDef sAlarm = {0}; - - /* USER CODE BEGIN RTC_Init 1 */ - - /* USER CODE END RTC_Init 1 */ - - /** Initialize RTC Only - */ - hrtc.Instance = RTC; - hrtc.Init.AsynchPrediv = RTC_PREDIV_A; - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; - hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE; - hrtc.Init.BinMode = RTC_BINARY_ONLY; - if (HAL_RTC_Init(&hrtc) != HAL_OK) - { - Error_Handler(); - } - - /* USER CODE BEGIN Check_RTC_BKUP */ - - /* USER CODE END Check_RTC_BKUP */ - - /** Initialize RTC and set the Time and Date - */ - if (HAL_RTCEx_SetSSRU_IT(&hrtc) != HAL_OK) - { - Error_Handler(); - } - - /** Enable the Alarm A - */ - sAlarm.BinaryAutoClr = RTC_ALARMSUBSECONDBIN_AUTOCLR_NO; - sAlarm.AlarmTime.SubSeconds = 0x0; - sAlarm.AlarmMask = RTC_ALARMMASK_NONE; - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDBINMASK_NONE; - sAlarm.Alarm = RTC_ALARM_A; - if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, 0) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN RTC_Init 2 */ - - /* USER CODE END RTC_Init 2 */ - -} - -void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) -{ - - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - if(rtcHandle->Instance==RTC) - { - /* USER CODE BEGIN RTC_MspInit 0 */ - - /* USER CODE END RTC_MspInit 0 */ - - /** Initializes the peripherals clocks - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; - - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /* RTC clock enable */ - __HAL_RCC_RTC_ENABLE(); - __HAL_RCC_RTCAPB_CLK_ENABLE(); - - /* RTC interrupt Init */ - HAL_NVIC_SetPriority(TAMP_STAMP_LSECSS_SSRU_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); - HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); - /* USER CODE BEGIN RTC_MspInit 1 */ - - /* USER CODE END RTC_MspInit 1 */ - } -} - -void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle) -{ - - if(rtcHandle->Instance==RTC) - { - /* USER CODE BEGIN RTC_MspDeInit 0 */ - - /* USER CODE END RTC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_RTC_DISABLE(); - __HAL_RCC_RTCAPB_CLK_DISABLE(); - - /* RTC interrupt Deinit */ - HAL_NVIC_DisableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); - HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); - /* USER CODE BEGIN RTC_MspDeInit 1 */ - - /* USER CODE END RTC_MspDeInit 1 */ - } -} - -void RTC_Alarm_IRQHandler(void) -{ - /* USER CODE BEGIN RTC_Alarm_IRQn 0 */ - - /* USER CODE END RTC_Alarm_IRQn 0 */ - HAL_RTC_AlarmIRQHandler(&hrtc); - /* USER CODE BEGIN RTC_Alarm_IRQn 1 */ - - /* USER CODE END RTC_Alarm_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/src/BSP/rtc.h b/src/BSP/rtc.h deleted file mode 100644 index a3c5be7..0000000 --- a/src/BSP/rtc.h +++ /dev/null @@ -1,53 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file rtc.h - * @brief This file contains all the function prototypes for - * the rtc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2022 STMicroelectronics. - * All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RTC_H__ -#define __RTC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern RTC_HandleTypeDef hrtc; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_RTC_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __RTC_H__ */ - diff --git a/src/BSP/timer_if.c b/src/BSP/timer_if.c index e3497ea..40a7c76 100644 --- a/src/BSP/timer_if.c +++ b/src/BSP/timer_if.c @@ -3,7 +3,7 @@ ****************************************************************************** * @file timer_if.c * @author MCD Application Team - * @brief Configure RTC Alarm, Tick and Calendar manager + * @brief Configure RTC Alarm (B), Tick and Calendar manager ****************************************************************************** * @attention * @@ -33,10 +33,51 @@ /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ -/** - * @brief RTC handle - */ -extern RTC_HandleTypeDef hrtc; + +extern RTC_HandleTypeDef RtcHandle; + +/* HAL MSP function used for RTC_Init */ +void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) +{ + + if(rtcHandle->Instance==RTC) + { + if (HAL_RTCEx_SetSSRU_IT(rtcHandle) != HAL_OK) + { + Error_Handler(); + } + /* give init value for the RtcFeatures enable */ + rtcHandle->IsEnabled.RtcFeatures = 0; + + /* RTC interrupt Init */ + HAL_NVIC_SetPriority(TAMP_STAMP_LSECSS_SSRU_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); + + HAL_NVIC_SetPriority(RTC_Alarm_IRQn, RTC_IRQ_PRIO, RTC_IRQ_SUBPRIO); + HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); + } +} + +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle) +{ + + if(rtcHandle->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + __HAL_RCC_RTCAPB_CLK_DISABLE(); + + /* RTC interrupt Deinit */ + HAL_NVIC_DisableIRQ(TAMP_STAMP_LSECSS_SSRU_IRQn); + HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } +} /** * @brief Timer driver callbacks handler @@ -104,17 +145,6 @@ const UTIL_SYSTIM_Driver_s UTIL_SYSTIMDriver = /* #define RTIF_DEBUG */ -/** - * @brief Map UTIL_TIMER_IRQ can be overridden in utilities_conf.h to Map on Task rather then Isr - */ -#ifndef UTIL_TIMER_IRQ_MAP_INIT -#define UTIL_TIMER_IRQ_MAP_INIT() -#endif /* UTIL_TIMER_IRQ_MAP_INIT */ - -#ifndef UTIL_TIMER_IRQ_MAP_PROCESS -#define UTIL_TIMER_IRQ_MAP_PROCESS() UTIL_TIMER_IRQ_Handler() -#endif /* UTIL_TIMER_IRQ_MAP_PROCESS */ - /* USER CODE BEGIN PD */ /* USER CODE END PD */ @@ -177,6 +207,14 @@ static uint32_t TIMER_IF_BkUp_Read_MSBticks(void); /* USER CODE BEGIN PFP */ +/* Function to attach to the RTC IRQ as a callback */ +void UTIL_TIMER_IRQ_MAP_PROCESS(void *data) +{ + UNUSED(data); + + UTIL_TIMER_IRQ_Handler(); +} + /* USER CODE END PFP */ /* Exported functions ---------------------------------------------------------*/ @@ -188,18 +226,9 @@ UTIL_TIMER_Status_t TIMER_IF_Init(void) /* USER CODE END TIMER_IF_Init */ if (RTC_Initialized == false) { - hrtc.IsEnabled.RtcFeatures = UINT32_MAX; - /*Init RTC*/ - MX_RTC_Init(); - /*Stop Timer */ - TIMER_IF_StopTimer(); - /** DeActivate the Alarm A enabled by STM32CubeMX during MX_RTC_Init() */ - HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A); - /*overload RTC feature enable*/ - hrtc.IsEnabled.RtcFeatures = UINT32_MAX; - - /*Enable Direct Read of the calendar registers (not through Shadow) */ - HAL_RTCEx_EnableBypassShadow(&hrtc); + /*Stop Timer : Disable the Alarm B interrupt */ + RTC_StopAlarm(RTC_ALARM_B); + /*Initialize MSB ticks*/ TIMER_IF_BkUp_Write_MSBticks(0); @@ -223,22 +252,17 @@ UTIL_TIMER_Status_t TIMER_IF_StartTimer(uint32_t timeout) /* USER CODE BEGIN TIMER_IF_StartTimer */ /* USER CODE END TIMER_IF_StartTimer */ - RTC_AlarmTypeDef sAlarm = {0}; + /*Stop timer if one is already started*/ - TIMER_IF_StopTimer(); + RTC_StopAlarm(RTC_ALARM_B); + timeout += RtcTimerContext; - TIMER_IF_DBG_PRINTF("Start timer: time=%d, alarm=%d\n\r", GetTimerTicks(), timeout); - /* starts timer*/ - sAlarm.BinaryAutoClr = RTC_ALARMSUBSECONDBIN_AUTOCLR_NO; - sAlarm.AlarmTime.SubSeconds = UINT32_MAX - timeout; - sAlarm.AlarmMask = RTC_ALARMMASK_NONE; - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDBINMASK_NONE; - sAlarm.Alarm = RTC_ALARM_A; - if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK) - { - Error_Handler(); - } + TIMER_IF_DBG_PRINTF("Start timer: time=%d, alarm=%d\n\r", GetTimerTicks(), timeout); + + /* Program ALARM B on subsecond, mask is 32 (and fixed to RTC_ALARMMASK_ALL for calendar) */ + RTC_StartAlarm(RTC_ALARM_B, 0, 0, 0, 0, UINT32_MAX - timeout, RTC_HOURFORMAT12_PM, 31UL); + /* USER CODE BEGIN TIMER_IF_StartTimer_Last */ /* USER CODE END TIMER_IF_StartTimer_Last */ @@ -251,12 +275,10 @@ UTIL_TIMER_Status_t TIMER_IF_StopTimer(void) /* USER CODE BEGIN TIMER_IF_StopTimer */ /* USER CODE END TIMER_IF_StopTimer */ - /* Clear RTC Alarm Flag */ - __HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_FLAG_ALRAF); - /* Disable the Alarm A interrupt */ - HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A); - /*overload RTC feature enable*/ - hrtc.IsEnabled.RtcFeatures = UINT32_MAX; + + /* Disable the Alarm B interrupt */ + RTC_StopAlarm(RTC_ALARM_B); + /* USER CODE BEGIN TIMER_IF_StopTimer_Last */ /* USER CODE END TIMER_IF_StopTimer_Last */ @@ -336,11 +358,12 @@ uint32_t TIMER_IF_Convert_ms2Tick(uint32_t timeMilliSec) /* USER CODE BEGIN TIMER_IF_Convert_ms2Tick */ /* USER CODE END TIMER_IF_Convert_ms2Tick */ - ret = ((uint32_t)((((uint64_t) timeMilliSec) << RTC_N_PREDIV_S) / 1000)); + ret = ((uint64_t)timeMilliSec * MS_TO_TICK) / 1000; + /* USER CODE BEGIN TIMER_IF_Convert_ms2Tick_Last */ /* USER CODE END TIMER_IF_Convert_ms2Tick_Last */ - return ret; + return (uint32_t)ret; } uint32_t TIMER_IF_Convert_Tick2ms(uint32_t tick) @@ -349,7 +372,7 @@ uint32_t TIMER_IF_Convert_Tick2ms(uint32_t tick) /* USER CODE BEGIN TIMER_IF_Convert_Tick2ms */ /* USER CODE END TIMER_IF_Convert_Tick2ms */ - ret = ((uint32_t)((((uint64_t)(tick)) * 1000) >> RTC_N_PREDIV_S)); + ret = tick * TICK_TO_MS; /* USER CODE BEGIN TIMER_IF_Convert_Tick2ms_Last */ /* USER CODE END TIMER_IF_Convert_Tick2ms_Last */ @@ -374,18 +397,6 @@ void TIMER_IF_DelayMs(uint32_t delay) /* USER CODE END TIMER_IF_DelayMs_Last */ } -void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) -{ - (void)hrtc; // unused - /* USER CODE BEGIN HAL_RTC_AlarmAEventCallback */ - - /* USER CODE END HAL_RTC_AlarmAEventCallback */ - UTIL_TIMER_IRQ_MAP_PROCESS(); - /* USER CODE BEGIN HAL_RTC_AlarmAEventCallback_Last */ - - /* USER CODE END HAL_RTC_AlarmAEventCallback_Last */ -} - void HAL_RTCEx_SSRUEventCallback(RTC_HandleTypeDef *hrtc) { (void)hrtc; // unused @@ -402,7 +413,7 @@ void HAL_RTCEx_SSRUEventCallback(RTC_HandleTypeDef *hrtc) /* USER CODE END HAL_RTCEx_SSRUEventCallback_Last */ } -uint32_t TIMER_IF_GetTime(uint16_t *mSeconds) +uint32_t TIMER_IF_GetTime(uint32_t *mSeconds) { uint32_t seconds = 0; /* USER CODE BEGIN TIMER_IF_GetTime */ @@ -414,12 +425,8 @@ uint32_t TIMER_IF_GetTime(uint16_t *mSeconds) ticks = (((uint64_t) timerValueMSB) << 32) + timerValueLsb; - seconds = (uint32_t)(ticks >> RTC_N_PREDIV_S); - - ticks = (uint32_t) ticks & RTC_PREDIV_S; - - *mSeconds = TIMER_IF_Convert_Tick2ms(ticks); - + seconds = ticks / MS_TO_TICK; + *mSeconds = (ticks * 1000) / MS_TO_TICK; /* USER CODE BEGIN TIMER_IF_GetTime_Last */ /* USER CODE END TIMER_IF_GetTime_Last */ @@ -431,7 +438,7 @@ void TIMER_IF_BkUp_Write_Seconds(uint32_t Seconds) /* USER CODE BEGIN TIMER_IF_BkUp_Write_Seconds */ /* USER CODE END TIMER_IF_BkUp_Write_Seconds */ - HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_SECONDS, Seconds); + HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_SECONDS, Seconds); /* USER CODE BEGIN TIMER_IF_BkUp_Write_Seconds_Last */ /* USER CODE END TIMER_IF_BkUp_Write_Seconds_Last */ @@ -442,7 +449,7 @@ void TIMER_IF_BkUp_Write_SubSeconds(uint32_t SubSeconds) /* USER CODE BEGIN TIMER_IF_BkUp_Write_SubSeconds */ /* USER CODE END TIMER_IF_BkUp_Write_SubSeconds */ - HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_SUBSECONDS, SubSeconds); + HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_SUBSECONDS, SubSeconds); /* USER CODE BEGIN TIMER_IF_BkUp_Write_SubSeconds_Last */ /* USER CODE END TIMER_IF_BkUp_Write_SubSeconds_Last */ @@ -454,7 +461,7 @@ uint32_t TIMER_IF_BkUp_Read_Seconds(void) /* USER CODE BEGIN TIMER_IF_BkUp_Read_Seconds */ /* USER CODE END TIMER_IF_BkUp_Read_Seconds */ - ret = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_SECONDS); + ret = HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_SECONDS); /* USER CODE BEGIN TIMER_IF_BkUp_Read_Seconds_Last */ /* USER CODE END TIMER_IF_BkUp_Read_Seconds_Last */ @@ -467,7 +474,7 @@ uint32_t TIMER_IF_BkUp_Read_SubSeconds(void) /* USER CODE BEGIN TIMER_IF_BkUp_Read_SubSeconds */ /* USER CODE END TIMER_IF_BkUp_Read_SubSeconds */ - ret = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_SUBSECONDS); + ret = HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_SUBSECONDS); /* USER CODE BEGIN TIMER_IF_BkUp_Read_SubSeconds_Last */ /* USER CODE END TIMER_IF_BkUp_Read_SubSeconds_Last */ @@ -484,7 +491,7 @@ static void TIMER_IF_BkUp_Write_MSBticks(uint32_t MSBticks) /* USER CODE BEGIN TIMER_IF_BkUp_Write_MSBticks */ /* USER CODE END TIMER_IF_BkUp_Write_MSBticks */ - HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_MSBTICKS, MSBticks); + HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_MSBTICKS, MSBticks); /* USER CODE BEGIN TIMER_IF_BkUp_Write_MSBticks_Last */ /* USER CODE END TIMER_IF_BkUp_Write_MSBticks_Last */ @@ -496,7 +503,7 @@ static uint32_t TIMER_IF_BkUp_Read_MSBticks(void) /* USER CODE END TIMER_IF_BkUp_Read_MSBticks */ uint32_t MSBticks; - MSBticks = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_MSBTICKS); + MSBticks = HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_MSBTICKS); return MSBticks; /* USER CODE BEGIN TIMER_IF_BkUp_Read_MSBticks_Last */ diff --git a/src/BSP/timer_if.h b/src/BSP/timer_if.h index a60ed36..a286889 100644 --- a/src/BSP/timer_if.h +++ b/src/BSP/timer_if.h @@ -32,12 +32,26 @@ extern "C" { #include "../STM32CubeWL/Utilities/misc/stm32_systime.h" /* USER CODE BEGIN Includes */ +/** + * @brief Map UTIL_TIMER_IRQ can be overridden in utilities_conf.h to Map on Task rather then Isr + */ +#ifndef UTIL_TIMER_IRQ_MAP_INIT +#define UTIL_TIMER_IRQ_MAP_INIT() +#endif /* UTIL_TIMER_IRQ_MAP_INIT */ + +/* With RTC clocked by LSE, the APRE freq is 256Hz: 1 tick is 3.9ms (APREDIV = 0x7F) */ +#define MS_TO_TICK 256 +/* Give one more (to adjust to x3.9 factor) */ +#define TICK_TO_MS ((1000/256) + 1) + +void UTIL_TIMER_IRQ_MAP_PROCESS(void *data); /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ /* USER CODE BEGIN ET */ + /* USER CODE END ET */ /* Exported constants --------------------------------------------------------*/ @@ -131,7 +145,7 @@ uint32_t TIMER_IF_Convert_Tick2ms(uint32_t tick); * @param[out] subSeconds in ticks * @return time seconds */ -uint32_t TIMER_IF_GetTime(uint16_t *subSeconds); +uint32_t TIMER_IF_GetTime(uint32_t *subSeconds); /** * @brief write seconds in backUp register diff --git a/src/STM32CubeWL/Utilities/misc/stm32_systime.c b/src/STM32CubeWL/Utilities/misc/stm32_systime.c index 4a7a1e5..0f2b5d0 100644 --- a/src/STM32CubeWL/Utilities/misc/stm32_systime.c +++ b/src/STM32CubeWL/Utilities/misc/stm32_systime.c @@ -233,7 +233,7 @@ void SysTimeSet( SysTime_t sysTime ) SysTime_t calendarTime = { .Seconds = 0, .SubSeconds = 0 }; - calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint16_t* )&calendarTime.SubSeconds ); + calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint32_t* )&calendarTime.SubSeconds ); // sysTime is UNIX epoch DeltaTime = SysTimeSub( sysTime, calendarTime ); @@ -248,9 +248,9 @@ SysTime_t SysTimeGet( void ) SysTime_t sysTime = { .Seconds = 0, .SubSeconds = 0 }; SysTime_t DeltaTime; - calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint16_t* )&calendarTime.SubSeconds ); + calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint32_t* )&calendarTime.SubSeconds ); - DeltaTime.SubSeconds = (int16_t)UTIL_SYSTIMDriver.BKUPRead_SubSeconds(); + DeltaTime.SubSeconds = (int32_t)UTIL_SYSTIMDriver.BKUPRead_SubSeconds(); DeltaTime.Seconds = UTIL_SYSTIMDriver.BKUPRead_Seconds(); sysTime = SysTimeAdd( DeltaTime, calendarTime ); @@ -263,7 +263,7 @@ SysTime_t SysTimeGetMcuTime( void ) { SysTime_t calendarTime = { .Seconds = 0, .SubSeconds = 0 }; - calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint16_t* )&calendarTime.SubSeconds ); + calendarTime.Seconds = UTIL_SYSTIMDriver.GetCalendarTime( ( uint32_t* )&calendarTime.SubSeconds ); return calendarTime; } @@ -284,7 +284,7 @@ SysTime_t SysTimeFromMs( uint32_t timeMs ) SysTime_t sysTime = { .Seconds = seconds, .SubSeconds = timeMs - seconds * 1000 }; SysTime_t DeltaTime = { 0 }; - DeltaTime.SubSeconds = (int16_t)UTIL_SYSTIMDriver.BKUPRead_SubSeconds(); + DeltaTime.SubSeconds = (int32_t)UTIL_SYSTIMDriver.BKUPRead_SubSeconds(); DeltaTime.Seconds = UTIL_SYSTIMDriver.BKUPRead_Seconds(); return SysTimeAdd( sysTime, DeltaTime ); } diff --git a/src/STM32CubeWL/Utilities/misc/stm32_systime.h b/src/STM32CubeWL/Utilities/misc/stm32_systime.h index 5e219d3..78b033f 100644 --- a/src/STM32CubeWL/Utilities/misc/stm32_systime.h +++ b/src/STM32CubeWL/Utilities/misc/stm32_systime.h @@ -133,7 +133,7 @@ typedef struct uint32_t (*BKUPRead_Seconds) ( void ); /*!< Get the timer differencebetween real time and rtc time */ void (*BKUPWrite_SubSeconds) ( uint32_t SubSeconds); /*!< Set the timer differencebetween real time and rtc time */ uint32_t (*BKUPRead_SubSeconds) ( void ); /*!< Get the timer differencebetween real time and rtc time */ - uint32_t (*GetCalendarTime)( uint16_t* SubSeconds ); /*!< Set the rtc time */ + uint32_t (*GetCalendarTime)( uint32_t* SubSeconds ); /*!< Set the rtc time */ } UTIL_SYSTIM_Driver_s; /** diff --git a/src/STM32LoRaWAN.cpp b/src/STM32LoRaWAN.cpp index ecf506a..1f89778 100644 --- a/src/STM32LoRaWAN.cpp +++ b/src/STM32LoRaWAN.cpp @@ -54,6 +54,9 @@ #error "Unexpected txpower constants" #endif +/* Get the RTC object for init */ +STM32RTC& rtc = STM32RTC::getInstance(); + STM32LoRaWAN* STM32LoRaWAN::instance; bool STM32LoRaWAN::begin(_lora_band band) @@ -62,6 +65,18 @@ bool STM32LoRaWAN::begin(_lora_band band) return failure("Only one STM32LoRaWAN instance can be used"); instance = this; + /* + * Init RTC as an object : + * use the MIX mode = free running BCD calendar + binary mode for + * the sub-second counter RTC_SSR on 32 bit + */ + rtc.setClockSource(STM32RTC::LSE_CLOCK); + rtc.setRTCMode(STM32RTC::MODE_MIX); + rtc.begin(true, STM32RTC::HOUR_24); + /* Attach the callback function before enabling Interrupt */ + rtc.attachInterrupt(UTIL_TIMER_IRQ_MAP_PROCESS, STM32RTC::ALARM_B); + /* The subsecond alarm B is set during the StartTimerEvent */ + UTIL_TIMER_Init(); LoRaMacStatus_t res = LoRaMacInitialization(&LoRaMacPrimitives, &LoRaMacCallbacks, (LoRaMacRegion_t)band); diff --git a/src/STM32LoRaWAN.h b/src/STM32LoRaWAN.h index f993baa..831d003 100644 --- a/src/STM32LoRaWAN.h +++ b/src/STM32LoRaWAN.h @@ -41,8 +41,9 @@ #include "Arduino.h" #include "STM32CubeWL/LoRaWAN/Mac/LoRaMac.h" -#include "STM32CubeWL/Utilities/timer/stm32_timer.h" #include "BSP/mw_log_conf.h" +#include "BSP/timer_if.h" +#include "STM32RTC.h" /**