diff --git a/cores/arduino/board.h b/cores/arduino/board.h index 1b5be5a272..1a8b457883 100644 --- a/cores/arduino/board.h +++ b/cores/arduino/board.h @@ -13,7 +13,6 @@ #include "dwt.h" #include "hw_config.h" #include "low_power.h" -#include "rtc.h" #include "stm32_eeprom.h" #include "timer.h" #include "uart.h" diff --git a/cores/arduino/stm32/rtc.h b/cores/arduino/stm32/rtc.h deleted file mode 100644 index 3956294475..0000000000 --- a/cores/arduino/stm32/rtc.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - ****************************************************************************** - * @file rtc.h - * @author WI6LABS - * @version V1.0.0 - * @date 12-December-2017 - * @brief Header for RTC driver - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2017 STMicroelectronics

- * - * 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RTC_H -#define __RTC_H - -/* Includes ------------------------------------------------------------------*/ -#include -#include "stm32_def.h" -#include "backup.h" -#include "clock.h" - -#if defined(HAL_RTC_MODULE_ENABLED) && !defined(HAL_RTC_MODULE_ONLY) - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -typedef enum { - HOUR_FORMAT_12, - HOUR_FORMAT_24 -} hourFormat_t; - -typedef enum { - HOUR_AM, - HOUR_PM -} hourAM_PM_t; - -/* See AN4579 Table 5 for possible values */ -typedef enum { - OFF_MSK = 0, - SS_MSK = 1, /* MSK0 */ - MM_MSK = 2, /* MSK1 */ - HH_MSK = 4, /* MSK2 */ - D_MSK = 8, /* MSK3 */ - /* NOTE: STM32 RTC can't assign a month or a year to an alarm. Those enum - are kept for compatibility but are ignored inside enableAlarm(). */ - M_MSK = 16, - Y_MSK = 32 -} alarmMask_t; - -typedef void(*voidCallbackPtr)(void *); - -/* Exported constants --------------------------------------------------------*/ -/* Interrupt priority */ -#ifndef RTC_IRQ_PRIO -#define RTC_IRQ_PRIO 2 -#endif -#ifndef RTC_IRQ_SUBPRIO -#define RTC_IRQ_SUBPRIO 0 -#endif - - -#define HSE_RTC_MAX 1000000U - -#if !defined(STM32F1xx) -#if !defined(RTC_PRER_PREDIV_S) || !defined(RTC_PRER_PREDIV_S) -#error "Unknown Family - unknown synchronous prescaler" -#endif -#define PREDIVA_MAX (RTC_PRER_PREDIV_A >> RTC_PRER_PREDIV_A_Pos) -#define PREDIVS_MAX (RTC_PRER_PREDIV_S >> RTC_PRER_PREDIV_S_Pos) -#endif /* !STM32F1xx */ - -/* Ultra Low Power High (ULPH) density */ -#if defined(STM32L100xBA) || defined (STM32L151xBA) || defined (STM32L152xBA) ||\ - defined(STM32L100xC) || defined (STM32L151xC) || defined (STM32L152xC) ||\ - defined (STM32L162xC) || defined(STM32L151xCA) || defined (STM32L151xD) ||\ - defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) ||\ - defined (STM32L162xD) || defined(STM32L151xE) || defined(STM32L151xDX) ||\ - defined (STM32L152xE) || defined (STM32L152xDX) || defined (STM32L162xE) ||\ - defined (STM32L162xDX) -#define STM32L1_ULPH -#endif - -#if defined(STM32F0xx) || defined(STM32L0xx) -#define RTC_Alarm_IRQn RTC_IRQn -#define RTC_Alarm_IRQHandler RTC_IRQHandler -#endif -#if defined(STM32G0xx) -#define RTC_Alarm_IRQn RTC_TAMP_IRQn -#define RTC_Alarm_IRQHandler RTC_TAMP_IRQHandler -#endif - -#if defined(STM32F1xx) && !defined(IS_RTC_WEEKDAY) -/* Compensate missing HAL definition */ -#define IS_RTC_WEEKDAY(WEEKDAY) (((WEEKDAY) == RTC_WEEKDAY_MONDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_TUESDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_WEDNESDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_THURSDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_FRIDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_SATURDAY) || \ - ((WEEKDAY) == RTC_WEEKDAY_SUNDAY)) - -/* F1 doesn't manage 12h format */ -#define IS_RTC_HOUR12(HOUR) IS_RTC_HOUR24(HOUR) -#endif /* !STM32F1xx && !IS_RTC_WEEKDAY */ - -/* __HAL_RCC_GET_RTC_SOURCE is not defined for F2*/ -/* -#ifndef __HAL_RCC_GET_RTC_SOURCE -static uint32_t RTC_getSource(void) { - RCC_PeriphCLKInitTypeDef *PeriphClkInit; - HAL_RCCEx_GetPeriphCLKConfig(PeriphClkInit); - return PeriphClkInit->RTCClockSelection; -} -#define __HAL_RCC_GET_RTC_SOURCE() RTC_getSource() -#endif -*/ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -void RTC_SetClockSource(sourceClock_t source); - -void RTC_getPrediv(int8_t *asynch, int16_t *synch); -void RTC_setPrediv(int8_t asynch, int16_t synch); - -void RTC_init(hourFormat_t format, sourceClock_t source, bool reset); -void RTC_DeInit(void); -bool RTC_IsTimeSet(void); - -void RTC_SetTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds, hourAM_PM_t period); -void RTC_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *subSeconds, hourAM_PM_t *period); - -void RTC_SetDate(uint8_t year, uint8_t month, uint8_t day, uint8_t wday); -void RTC_GetDate(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *wday); - -void RTC_StartAlarm(uint8_t day, uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds, hourAM_PM_t period, uint8_t mask); -void RTC_StopAlarm(void); -void RTC_GetAlarm(uint8_t *day, uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *subSeconds, hourAM_PM_t *period, uint8_t *mask); -void attachAlarmCallback(voidCallbackPtr func, void *data); -void detachAlarmCallback(void); - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_RTC_MODULE_ENABLED && !HAL_RTC_MODULE_ONLY */ - -#endif /* __RTC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/libraries/SrcWrapper/src/stm32/rtc.c b/libraries/SrcWrapper/src/stm32/rtc.c deleted file mode 100644 index 9b22371274..0000000000 --- a/libraries/SrcWrapper/src/stm32/rtc.c +++ /dev/null @@ -1,709 +0,0 @@ -/** - ****************************************************************************** - * @file rtc.c - * @author WI6LABS - * @version V1.0.0 - * @date 12-December-2017 - * @brief Provides a RTC driver - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2017 STMicroelectronics

- * - * 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. - * - ****************************************************************************** - */ - -#include "rtc.h" - -#if defined(HAL_RTC_MODULE_ENABLED) && !defined(HAL_RTC_MODULE_ONLY) -#if defined(STM32MP1xx) - /** - * Currently there is no RTC driver for STM32MP1xx. If RTC is used in the future - * the function call HAL_RCCEx_PeriphCLKConfig() shall be done under - * if(IS_ENGINEERING_BOOT_MODE()), since clock source selection is done by - * First Stage Boot Loader on Cortex-A. - */ - #error "RTC shall not be handled by Arduino in STM32MP1xx." -#endif /* STM32MP1xx */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static RTC_HandleTypeDef RtcHandle = {0}; -static voidCallbackPtr RTCUserCallback = NULL; -static void *callbackUserData = NULL; - -static sourceClock_t clkSrc = LSI_CLOCK; -static uint8_t HSEDiv = 0; -#if !defined(STM32F1xx) -/* Custom user values */ -static int8_t userPredivAsync = -1; -static int16_t userPredivSync = -1; -#endif /* !STM32F1xx */ - -static hourFormat_t initFormat = HOUR_FORMAT_12; - -/* Private function prototypes -----------------------------------------------*/ -static void RTC_initClock(sourceClock_t source); -#if !defined(STM32F1xx) -static void RTC_computePrediv(int8_t *asynch, int16_t *synch); -#endif /* !STM32F1xx */ - -/* Exported functions --------------------------------------------------------*/ - -/** - * @brief Set RTC clock source - * @param source: RTC clock source: LSE, LSI or HSE - * @retval None - */ -void RTC_SetClockSource(sourceClock_t source) -{ - switch (source) { - case LSI_CLOCK: - case LSE_CLOCK: - case HSE_CLOCK: - clkSrc = source; - break; - default: - clkSrc = LSI_CLOCK; - break; - } -} - -/** - * @brief RTC clock initialization - * This function configures the hardware resources used. - * @param source: RTC clock source: LSE, LSI or HSE - * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select - * the RTC clock source; in this case the Backup domain will be reset in - * order to modify the RTC Clock source, as consequence RTC registers (including - * the backup registers) and RCC_CSR register are set to their reset values. - * @retval None - */ -static void RTC_initClock(sourceClock_t source) -{ - RCC_PeriphCLKInitTypeDef PeriphClkInit; - - if (source == LSE_CLOCK) { - /* Enable the clock if not already set by user */ - enableClock(LSE_CLOCK); - - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } - clkSrc = LSE_CLOCK; - } else if (source == HSE_CLOCK) { - /* Enable the clock if not already set by user */ - enableClock(HSE_CLOCK); - - /* HSE division factor for RTC clock must be set to ensure that - * the clock supplied to the RTC is less than or equal to 1 MHz - */ - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; -#if defined(STM32F1xx) - /* HSE max is 16 MHZ divided by 128 --> 125 KHz */ - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV128; - HSEDiv = 128; -#elif defined(STM32F0xx) || defined(STM32F3xx) || defined(STM32G0xx) ||\ - defined(STM32G4xx) || defined(STM32L4xx) || defined(STM32WBxx) - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32; - HSEDiv = 32; -#elif defined(STM32L0xx) || defined(STM32L1xx) - if ((HSE_VALUE / 2) <= HSE_RTC_MAX) { - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV2; - HSEDiv = 2; - } else if ((HSE_VALUE / 4) <= HSE_RTC_MAX) { - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV4; - HSEDiv = 4; - } else if ((HSE_VALUE / 8) <= HSE_RTC_MAX) { - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV8; - HSEDiv = 8; - } else if ((HSE_VALUE / 16) <= HSE_RTC_MAX) { - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV16; - HSEDiv = 16; - } -#elif defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx) || defined(STM32H7xx) - /* Not defined for STM32F2xx */ -#ifndef RCC_RTCCLKSOURCE_HSE_DIVX -#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U -#endif /* RCC_RTCCLKSOURCE_HSE_DIVX */ -#if defined(STM32H7xx) -#define HSEDIV_MAX 64 -#define HSESHIFT 12 -#else -#define HSEDIV_MAX 32 -#define HSESHIFT 16 -#endif - for (HSEDiv = 2; HSEDiv < HSEDIV_MAX; HSEDiv++) { - if ((HSE_VALUE / HSEDiv) <= HSE_RTC_MAX) { - PeriphClkInit.RTCClockSelection = (HSEDiv << HSESHIFT) | RCC_RTCCLKSOURCE_HSE_DIVX; - break; - } - } -#else -#error "Unknown Family - could not define RTCClockSelection" -#endif /* STM32F1xx */ - if ((HSE_VALUE / HSEDiv) > HSE_RTC_MAX) { - Error_Handler(); - } - - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } - clkSrc = HSE_CLOCK; - } else if (source == LSI_CLOCK) { - /* Enable the clock if not already set by user */ - enableClock(LSI_CLOCK); - - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; - PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { - Error_Handler(); - } - clkSrc = LSI_CLOCK; - } else { - Error_Handler(); - } -#ifdef __HAL_RCC_RTCAPB_CLK_ENABLE - __HAL_RCC_RTCAPB_CLK_ENABLE(); -#endif - __HAL_RCC_RTC_ENABLE(); -} - -/** - * @brief set user (a)synchronous prescaler values. - * @note use -1 to reset value and use computed ones - * @param asynch: asynchronous prescaler value in range 0 - PREDIVA_MAX - * @param synch: synchronous prescaler value in range 0 - PREDIVS_MAX - * @retval None - */ -void RTC_setPrediv(int8_t asynch, int16_t synch) -{ -#if !defined(STM32F1xx) - if ((asynch >= -1) && (synch >= -1)) { - userPredivAsync = asynch; - userPredivSync = synch; - } -#else - UNUSED(asynch); - UNUSED(synch); -#endif /* !STM32F1xx */ -} - -/** - * @brief get user (a)synchronous prescaler values if set else computed ones - * for the current clock source. - * @param asynch: pointer where return asynchronous prescaler value. - * @param synch: pointer where return synchronous prescaler value. - * @retval None - */ -void RTC_getPrediv(int8_t *asynch, int16_t *synch) -{ -#if !defined(STM32F1xx) - if ((userPredivAsync == -1) || (userPredivSync == -1)) { - RTC_computePrediv(asynch, synch); - } else { - if ((asynch != NULL) && (synch != NULL)) { - *asynch = userPredivAsync; - *synch = userPredivSync; - } - } -#else - UNUSED(asynch); - UNUSED(synch); -#endif /* !STM32F1xx */ -} - -#if !defined(STM32F1xx) -/** - * @brief Compute (a)synchronous prescaler - * RTC prescalers are compute to obtain the RTC clock to 1Hz. See AN4759. - * @param asynch: pointer where return asynchronous prescaler value. - * @param synch: pointer where return synchronous prescaler value. - * @retval None - */ -static void RTC_computePrediv(int8_t *asynch, int16_t *synch) -{ - uint32_t predivS = PREDIVS_MAX + 1; - uint32_t clk = 0; - - /* Get user predividers if manually configured */ - if ((asynch == NULL) || (synch == NULL)) { - return; - } - - /* Get clock frequency */ - if (clkSrc == LSE_CLOCK) { - clk = LSE_VALUE; - } else if (clkSrc == LSI_CLOCK) { - clk = LSI_VALUE; - } else if (clkSrc == HSE_CLOCK) { - clk = HSE_VALUE / HSEDiv; - } else { - Error_Handler(); - } - - /* Find (a)synchronous prescalers to obtain the 1Hz calendar clock */ - for (*asynch = PREDIVA_MAX; *asynch >= 0; (*asynch)--) { - predivS = (clk / (*asynch + 1)) - 1; - - if (((predivS + 1) * (*asynch + 1)) == clk) { - break; - } - } - - /* - * Can't find a 1Hz, so give priority to RTC power consumption - * by choosing the higher possible value for predivA - */ - if ((predivS > PREDIVS_MAX) || (*asynch < 0)) { - *asynch = PREDIVA_MAX; - predivS = (clk / (*asynch + 1)) - 1; - } - - if (predivS > PREDIVS_MAX) { - Error_Handler(); - } - *synch = (int16_t)predivS; -} -#endif /* !STM32F1xx */ - -/** - * @brief RTC Initialization - * This function configures the RTC time and calendar. By default, the - * RTC is set to the 1st January 2017 0:0:0:00 - * @param format: enable the RTC in 12 or 24 hours mode - * @retval None - */ -void RTC_init(hourFormat_t format, sourceClock_t source, bool reset) -{ - initFormat = format; - - if (reset) { - resetBackupDomain(); - } - - /* Init RTC clock */ - RTC_initClock(source); - - RtcHandle.Instance = RTC; - -#if defined(STM32F1xx) - /* Let HAL calculate the prescaler */ - RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND; - RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE; - UNUSED(format); -#else - if (format == HOUR_FORMAT_12) { - RtcHandle.Init.HourFormat = RTC_HOURFORMAT_12; - } else { - RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; - } - RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE; - RTC_getPrediv((int8_t *) & (RtcHandle.Init.AsynchPrediv), (int16_t *) & (RtcHandle.Init.SynchPrediv)); -#if defined(STM32G0xx) || defined(STM32H7xx) || defined(STM32L0xx) || defined(STM32L4xx) - RtcHandle.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; -#endif /* STM32H7xx || STM32L0xx || STM32L4xx */ - RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; - RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; -#endif /* STM32F1xx */ - - HAL_RTC_Init(&RtcHandle); - -#if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32L1xx) || defined(STM32L1_ULPH) - /* Enable Direct Read of the calendar registers (not through Shadow) */ - HAL_RTCEx_EnableBypassShadow(&RtcHandle); -#endif /* !STM32F1xx && !STM32F2xx */ - - HAL_NVIC_SetPriority(RTC_Alarm_IRQn, RTC_IRQ_PRIO, RTC_IRQ_SUBPRIO); - HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); - /* Ensure backup domain is enabled */ - enableBackupDomain(); -} - -/** - * @brief RTC deinitialization. Stop the RTC. - * @retval None - */ -void RTC_DeInit(void) -{ - HAL_RTC_DeInit(&RtcHandle); - RTCUserCallback = NULL; - callbackUserData = NULL; -} - -/** - * @brief Check wether time is already set - * @retval True if set else false - */ -bool RTC_IsTimeSet(void) -{ - return (getBackupRegister(RTC_BKP_INDEX) == RTC_BKP_VALUE) ? true : false; -} - -/** - * @brief Set RTC time - * @param hours: 0-12 or 0-23. Depends on the format used. - * @param minutes: 0-59 - * @param seconds: 0-59 - * @param subSeconds: 0-999 - * @param period: select HOUR_AM or HOUR_PM period in case RTC is set in 12 hours mode. Else ingored. - * @retval None - */ -void RTC_SetTime(uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds, hourAM_PM_t period) -{ - RTC_TimeTypeDef RTC_TimeStruct; - - /* Ignore time AM PM configuration if in 24 hours format */ - if (initFormat == HOUR_FORMAT_24) { - period = HOUR_AM; - } - - if ((((initFormat == HOUR_FORMAT_24) && IS_RTC_HOUR24(hours)) || IS_RTC_HOUR12(hours)) - && IS_RTC_MINUTES(minutes) && IS_RTC_SECONDS(seconds)) { - RTC_TimeStruct.Hours = hours; - RTC_TimeStruct.Minutes = minutes; - RTC_TimeStruct.Seconds = seconds; -#if !defined(STM32F1xx) - if (period == HOUR_PM) { - RTC_TimeStruct.TimeFormat = RTC_HOURFORMAT12_PM; - } else { - RTC_TimeStruct.TimeFormat = RTC_HOURFORMAT12_AM; - } -#if !defined(STM32F2xx) && !defined(STM32L1xx) || defined(STM32L1_ULPH) - RTC_TimeStruct.SubSeconds = subSeconds; - RTC_TimeStruct.SecondFraction = 0; -#else - UNUSED(subSeconds); -#endif /* !STM32F2xx && !STM32L1xx || STM32L1_ULPH */ - RTC_TimeStruct.DayLightSaving = RTC_STOREOPERATION_RESET; - RTC_TimeStruct.StoreOperation = RTC_DAYLIGHTSAVING_NONE; -#else - UNUSED(subSeconds); - UNUSED(period); -#endif /* !STM32F1xx */ - - HAL_RTC_SetTime(&RtcHandle, &RTC_TimeStruct, RTC_FORMAT_BIN); - setBackupRegister(RTC_BKP_INDEX, RTC_BKP_VALUE); - } -} - -/** - * @brief Get RTC time - * @param hours: 0-12 or 0-23. Depends on the format used. - * @param minutes: 0-59 - * @param seconds: 0-59 - * @param subSeconds: 0-999 (optional could be NULL) - * @param period: HOUR_AM or HOUR_PM period in case RTC is set in 12 hours mode (optional could be NULL). - * @retval None - */ -void RTC_GetTime(uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *subSeconds, hourAM_PM_t *period) -{ - RTC_TimeTypeDef RTC_TimeStruct; - - if ((hours != NULL) && (minutes != NULL) && (seconds != NULL)) { - HAL_RTC_GetTime(&RtcHandle, &RTC_TimeStruct, RTC_FORMAT_BIN); - *hours = RTC_TimeStruct.Hours; - *minutes = RTC_TimeStruct.Minutes; - *seconds = RTC_TimeStruct.Seconds; -#if !defined(STM32F1xx) - if (period != NULL) { - if (RTC_TimeStruct.TimeFormat == RTC_HOURFORMAT12_PM) { - *period = HOUR_PM; - } else { - *period = HOUR_AM; - } - } -#if (!defined(STM32F2xx) && !defined(STM32L1xx)) || defined(STM32L1_ULPH) - if (subSeconds != NULL) { - *subSeconds = RTC_TimeStruct.SubSeconds; - } -#else - UNUSED(subSeconds); -#endif -#else - UNUSED(period); - UNUSED(subSeconds); -#endif /* !STM32F1xx */ - } -} - -/** - * @brief Set RTC calendar - * @param year: 0-99 - * @param month: 1-12 - * @param day: 1-31 - * @param wday: 1-7 - * @retval None - */ -void RTC_SetDate(uint8_t year, uint8_t month, uint8_t day, uint8_t wday) -{ - RTC_DateTypeDef RTC_DateStruct; - - if (IS_RTC_YEAR(year) && IS_RTC_MONTH(month) && IS_RTC_DATE(day) && IS_RTC_WEEKDAY(wday)) { - RTC_DateStruct.Year = year; - RTC_DateStruct.Month = month; - RTC_DateStruct.Date = day; - RTC_DateStruct.WeekDay = wday; - HAL_RTC_SetDate(&RtcHandle, &RTC_DateStruct, RTC_FORMAT_BIN); - setBackupRegister(RTC_BKP_INDEX, RTC_BKP_VALUE); - } -} - -/** - * @brief Get RTC calendar - * @param year: 0-99 - * @param month: 1-12 - * @param day: 1-31 - * @param wday: 1-7 - * @retval None - */ -void RTC_GetDate(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *wday) -{ - RTC_DateTypeDef RTC_DateStruct; - - if ((year != NULL) && (month != NULL) && (day != NULL) && (wday != NULL)) { - HAL_RTC_GetDate(&RtcHandle, &RTC_DateStruct, RTC_FORMAT_BIN); - *year = RTC_DateStruct.Year; - *month = RTC_DateStruct.Month; - *day = RTC_DateStruct.Date; - *wday = RTC_DateStruct.WeekDay; - } -} - -/** - * @brief Set RTC alarm and activate it with IT mode - * @param day: 1-31 (day of the month) - * @param hours: 0-12 or 0-23 depends on the hours mode. - * @param minutes: 0-59 - * @param seconds: 0-59 - * @param subSeconds: 0-999 - * @param period: HOUR_AM or HOUR_PM if in 12 hours mode else ignored. - * @param mask: configure alarm behavior using alarmMask_t combination. - * See AN4579 Table 5 for possible values. - * @retval None - */ -void RTC_StartAlarm(uint8_t day, uint8_t hours, uint8_t minutes, uint8_t seconds, uint32_t subSeconds, hourAM_PM_t period, uint8_t mask) -{ - RTC_AlarmTypeDef RTC_AlarmStructure; - - /* Ignore time AM PM configuration if in 24 hours format */ - if (initFormat == HOUR_FORMAT_24) { - period = HOUR_AM; - } - - if ((((initFormat == HOUR_FORMAT_24) && IS_RTC_HOUR24(hours)) || IS_RTC_HOUR12(hours)) - && IS_RTC_DATE(day) && IS_RTC_MINUTES(minutes) && IS_RTC_SECONDS(seconds)) { - /* Set RTC_AlarmStructure with calculated values*/ - /* Use alarm A by default because it is common to all STM32 HAL */ - RTC_AlarmStructure.Alarm = RTC_ALARM_A; - RTC_AlarmStructure.AlarmTime.Seconds = seconds; - RTC_AlarmStructure.AlarmTime.Minutes = minutes; - RTC_AlarmStructure.AlarmTime.Hours = hours; -#if !defined(STM32F1xx) -#if !defined(STM32F2xx) && !defined(STM32L1xx) || defined(STM32L1_ULPH) - RTC_AlarmStructure.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_SS14_10; - RTC_AlarmStructure.AlarmTime.SubSeconds = subSeconds; -#else - UNUSED(subSeconds); -#endif /* !STM32F2xx && !STM32L1xx || STM32L1_ULPH */ - if (period == HOUR_PM) { - RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_HOURFORMAT12_PM; - } else { - RTC_AlarmStructure.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM; - } - RTC_AlarmStructure.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; - RTC_AlarmStructure.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; - RTC_AlarmStructure.AlarmDateWeekDay = day; - RTC_AlarmStructure.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; - /* configure AlarmMask (M_MSK and Y_MSK ignored) */ - if (mask == OFF_MSK) { - RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_ALL; - } else { - RTC_AlarmStructure.AlarmMask = RTC_ALARMMASK_NONE; - if (!(mask & SS_MSK)) { - RTC_AlarmStructure.AlarmMask |= RTC_ALARMMASK_SECONDS; - } - if (!(mask & MM_MSK)) { - RTC_AlarmStructure.AlarmMask |= RTC_ALARMMASK_MINUTES; - } - if (!(mask & HH_MSK)) { - RTC_AlarmStructure.AlarmMask |= RTC_ALARMMASK_HOURS; - } - if (!(mask & D_MSK)) { - RTC_AlarmStructure.AlarmMask |= RTC_ALARMMASK_DATEWEEKDAY; - } - } -#else - UNUSED(subSeconds); - UNUSED(period); - UNUSED(day); - UNUSED(mask); -#endif /* !STM32F1xx */ - - /* Set RTC_Alarm */ - HAL_RTC_SetAlarm_IT(&RtcHandle, &RTC_AlarmStructure, RTC_FORMAT_BIN); - } -} - -/** - * @brief Disable RTC alarm - * @param None - * @retval None - */ -void RTC_StopAlarm(void) -{ - /* Clear RTC Alarm Flag */ - __HAL_RTC_ALARM_CLEAR_FLAG(&RtcHandle, RTC_FLAG_ALRAF); - - /* Disable the Alarm A interrupt */ - HAL_RTC_DeactivateAlarm(&RtcHandle, RTC_ALARM_A); -} - -/** - * @brief Get RTC alarm - * @param day: 1-31 day of the month (optional could be NULL) - * @param hours: 0-12 or 0-23 depends on the hours mode - * @param minutes: 0-59 - * @param seconds: 0-59 - * @param subSeconds: 0-999 (optional could be NULL) - * @param period: HOUR_AM or HOUR_PM (optional could be NULL) - * @param mask: alarm behavior using alarmMask_t combination (optional could be NULL) - * See AN4579 Table 5 for possible values - * @retval None - */ -void RTC_GetAlarm(uint8_t *day, uint8_t *hours, uint8_t *minutes, uint8_t *seconds, uint32_t *subSeconds, hourAM_PM_t *period, uint8_t *mask) -{ - RTC_AlarmTypeDef RTC_AlarmStructure; - - if ((hours != NULL) && (minutes != NULL) && (seconds != NULL)) { - HAL_RTC_GetAlarm(&RtcHandle, &RTC_AlarmStructure, RTC_ALARM_A, RTC_FORMAT_BIN); - - *seconds = RTC_AlarmStructure.AlarmTime.Seconds; - *minutes = RTC_AlarmStructure.AlarmTime.Minutes; - *hours = RTC_AlarmStructure.AlarmTime.Hours; - -#if !defined(STM32F1xx) - if (day != NULL) { - *day = RTC_AlarmStructure.AlarmDateWeekDay; - } - if (period != NULL) { - if (RTC_AlarmStructure.AlarmTime.TimeFormat == RTC_HOURFORMAT12_PM) { - *period = HOUR_PM; - } else { - *period = HOUR_AM; - } - } -#if !defined(STM32F2xx) && !defined(STM32L1xx) || defined(STM32L1_ULPH) - if (subSeconds != NULL) { - *subSeconds = RTC_AlarmStructure.AlarmTime.SubSeconds; - } -#else - UNUSED(subSeconds); -#endif /* !STM32F2xx && !STM32L1xx || STM32L1_ULPH */ - if (mask != NULL) { - *mask = OFF_MSK; - if (!(RTC_AlarmStructure.AlarmMask & RTC_ALARMMASK_SECONDS)) { - *mask |= SS_MSK; - } - if (!(RTC_AlarmStructure.AlarmMask & RTC_ALARMMASK_MINUTES)) { - *mask |= MM_MSK; - } - if (!(RTC_AlarmStructure.AlarmMask & RTC_ALARMMASK_HOURS)) { - *mask |= HH_MSK; - } - if (!(RTC_AlarmStructure.AlarmMask & RTC_ALARMMASK_DATEWEEKDAY)) { - *mask |= D_MSK; - } - } -#else - UNUSED(day); - UNUSED(period); - UNUSED(subSeconds); - UNUSED(mask); -#endif /* !STM32F1xx */ - } -} - -/** - * @brief Attach alarm callback. - * @param func: pointer to the callback - * @retval None - */ -void attachAlarmCallback(voidCallbackPtr func, void *data) -{ - RTCUserCallback = func; - callbackUserData = data; -} - -/** - * @brief Detach alarm callback. - * @param None - * @retval None - */ -void detachAlarmCallback(void) -{ - RTCUserCallback = NULL; - callbackUserData = NULL; -} - -/** - * @brief Alarm A callback. - * @param hrtc RTC handle - * @retval None - */ -void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) -{ - UNUSED(hrtc); - - if (RTCUserCallback != NULL) { - RTCUserCallback(callbackUserData); - } -} - -/** - * @brief RTC Alarm IRQHandler - * @param None - * @retval None - */ -void RTC_Alarm_IRQHandler(void) -{ - HAL_RTC_AlarmIRQHandler(&RtcHandle); -} - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_RTC_MODULE_ENABLED && !HAL_RTC_MODULE_ONLY */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/