stm32g4xx_ll_rtc.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. /**
  2. ******************************************************************************
  3. * @file stm32g4xx_ll_rtc.c
  4. * @author MCD Application Team
  5. * @brief RTC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. #if defined(USE_FULL_LL_DRIVER)
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "stm32g4xx_ll_rtc.h"
  21. #include "stm32g4xx_ll_cortex.h"
  22. #ifdef USE_FULL_ASSERT
  23. #include "stm32_assert.h"
  24. #else /* USE_FULL_ASSERT */
  25. #define assert_param(expr) ((void)0U)
  26. #endif /* USE_FULL_ASSERT */
  27. /** @addtogroup STM32G4xx_LL_Driver
  28. * @{
  29. */
  30. #if defined(RTC)
  31. /** @addtogroup RTC_LL
  32. * @{
  33. */
  34. /* Private types -------------------------------------------------------------*/
  35. /* Private variables ---------------------------------------------------------*/
  36. /* Private constants ---------------------------------------------------------*/
  37. /** @addtogroup RTC_LL_Private_Constants
  38. * @{
  39. */
  40. /* Default values used for prescaler */
  41. #define RTC_ASYNCH_PRESC_DEFAULT ((uint32_t) 0x0000007FU)
  42. #define RTC_SYNCH_PRESC_DEFAULT ((uint32_t) 0x000000FFU)
  43. /* Values used for timeout */
  44. #define RTC_INITMODE_TIMEOUT ((uint32_t) 1000U) /* 1s when tick set to 1ms */
  45. #define RTC_SYNCHRO_TIMEOUT ((uint32_t) 1000U) /* 1s when tick set to 1ms */
  46. /**
  47. * @}
  48. */
  49. /* Private macros ------------------------------------------------------------*/
  50. /** @addtogroup RTC_LL_Private_Macros
  51. * @{
  52. */
  53. #define IS_LL_RTC_HOURFORMAT(__VALUE__) (((__VALUE__) == LL_RTC_HOURFORMAT_24HOUR) \
  54. || ((__VALUE__) == LL_RTC_HOURFORMAT_AMPM))
  55. #define IS_LL_RTC_ASYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FU)
  56. #define IS_LL_RTC_SYNCH_PREDIV(__VALUE__) ((__VALUE__) <= 0x7FFFU)
  57. #define IS_LL_RTC_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_FORMAT_BIN) \
  58. || ((__VALUE__) == LL_RTC_FORMAT_BCD))
  59. #define IS_LL_RTC_TIME_FORMAT(__VALUE__) (((__VALUE__) == LL_RTC_TIME_FORMAT_AM_OR_24) \
  60. || ((__VALUE__) == LL_RTC_TIME_FORMAT_PM))
  61. #define IS_LL_RTC_HOUR12(__HOUR__) (((__HOUR__) > 0U) && ((__HOUR__) <= 12U))
  62. #define IS_LL_RTC_HOUR24(__HOUR__) ((__HOUR__) <= 23U)
  63. #define IS_LL_RTC_MINUTES(__MINUTES__) ((__MINUTES__) <= 59U)
  64. #define IS_LL_RTC_SECONDS(__SECONDS__) ((__SECONDS__) <= 59U)
  65. #define IS_LL_RTC_WEEKDAY(__VALUE__) (((__VALUE__) == LL_RTC_WEEKDAY_MONDAY) \
  66. || ((__VALUE__) == LL_RTC_WEEKDAY_TUESDAY) \
  67. || ((__VALUE__) == LL_RTC_WEEKDAY_WEDNESDAY) \
  68. || ((__VALUE__) == LL_RTC_WEEKDAY_THURSDAY) \
  69. || ((__VALUE__) == LL_RTC_WEEKDAY_FRIDAY) \
  70. || ((__VALUE__) == LL_RTC_WEEKDAY_SATURDAY) \
  71. || ((__VALUE__) == LL_RTC_WEEKDAY_SUNDAY))
  72. #define IS_LL_RTC_DAY(__DAY__) (((__DAY__) >= (uint32_t)1U) && ((__DAY__) <= (uint32_t)31U))
  73. #define IS_LL_RTC_MONTH(__MONTH__) (((__MONTH__) >= 1U) && ((__MONTH__) <= 12U))
  74. #define IS_LL_RTC_YEAR(__YEAR__) ((__YEAR__) <= 99U)
  75. #define IS_LL_RTC_ALMA_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMA_MASK_NONE) \
  76. || ((__VALUE__) == LL_RTC_ALMA_MASK_DATEWEEKDAY) \
  77. || ((__VALUE__) == LL_RTC_ALMA_MASK_HOURS) \
  78. || ((__VALUE__) == LL_RTC_ALMA_MASK_MINUTES) \
  79. || ((__VALUE__) == LL_RTC_ALMA_MASK_SECONDS) \
  80. || ((__VALUE__) == LL_RTC_ALMA_MASK_ALL))
  81. #define IS_LL_RTC_ALMB_MASK(__VALUE__) (((__VALUE__) == LL_RTC_ALMB_MASK_NONE) \
  82. || ((__VALUE__) == LL_RTC_ALMB_MASK_DATEWEEKDAY) \
  83. || ((__VALUE__) == LL_RTC_ALMB_MASK_HOURS) \
  84. || ((__VALUE__) == LL_RTC_ALMB_MASK_MINUTES) \
  85. || ((__VALUE__) == LL_RTC_ALMB_MASK_SECONDS) \
  86. || ((__VALUE__) == LL_RTC_ALMB_MASK_ALL))
  87. #define IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE) || \
  88. ((__SEL__) == LL_RTC_ALMA_DATEWEEKDAYSEL_WEEKDAY))
  89. #define IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(__SEL__) (((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE) || \
  90. ((__SEL__) == LL_RTC_ALMB_DATEWEEKDAYSEL_WEEKDAY))
  91. /**
  92. * @}
  93. */
  94. /* Private function prototypes -----------------------------------------------*/
  95. /* Exported functions --------------------------------------------------------*/
  96. /** @addtogroup RTC_LL_Exported_Functions
  97. * @{
  98. */
  99. /** @addtogroup RTC_LL_EF_Init
  100. * @{
  101. */
  102. /**
  103. * @brief De-Initializes the RTC registers to their default reset values.
  104. * @note This function does not reset the RTC Clock source and RTC Backup Data
  105. * registers.
  106. * @param RTCx RTC Instance
  107. * @retval An ErrorStatus enumeration value:
  108. * - SUCCESS: RTC registers are de-initialized
  109. * - ERROR: RTC registers are not de-initialized
  110. */
  111. ErrorStatus LL_RTC_DeInit(RTC_TypeDef *RTCx)
  112. {
  113. ErrorStatus status = ERROR;
  114. /* Check the parameter */
  115. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  116. assert_param(IS_TAMP_ALL_INSTANCE(TAMP));
  117. /* Disable the write protection for RTC registers */
  118. LL_RTC_DisableWriteProtection(RTCx);
  119. /* Set Initialization mode */
  120. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  121. {
  122. /* Reset TR, DR and CR registers */
  123. WRITE_REG(RTCx->TR, 0x00000000U);
  124. #if defined(RTC_WAKEUP_SUPPORT)
  125. WRITE_REG(RTCx->WUTR, RTC_WUTR_WUT);
  126. #endif /* RTC_WAKEUP_SUPPORT */
  127. WRITE_REG(RTCx->DR, (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0));
  128. /* Reset All CR bits except CR[2:0] */
  129. #if defined(RTC_WAKEUP_SUPPORT)
  130. WRITE_REG(RTCx->CR, (READ_REG(RTCx->CR) & RTC_CR_WUCKSEL));
  131. #else
  132. WRITE_REG(RTCx->CR, 0x00000000U);
  133. #endif /* RTC_WAKEUP_SUPPORT */
  134. WRITE_REG(RTCx->PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT));
  135. WRITE_REG(RTCx->ALRMAR, 0x00000000U);
  136. WRITE_REG(RTCx->ALRMBR, 0x00000000U);
  137. WRITE_REG(RTCx->SHIFTR, 0x00000000U);
  138. WRITE_REG(RTCx->CALR, 0x00000000U);
  139. WRITE_REG(RTCx->ALRMASSR, 0x00000000U);
  140. WRITE_REG(RTCx->ALRMBSSR, 0x00000000U);
  141. /* Exit Initialization mode */
  142. LL_RTC_DisableInitMode(RTCx);
  143. /* Wait till the RTC RSF flag is set */
  144. status = LL_RTC_WaitForSynchro(RTCx);
  145. }
  146. /* Enable the write protection for RTC registers */
  147. LL_RTC_EnableWriteProtection(RTCx);
  148. /* DeInitialization of the TAMP */
  149. /* Reset TAMP CR1 and CR2 registers */
  150. WRITE_REG(TAMP->CR1, 0xFFFF0000U);
  151. WRITE_REG(TAMP->CR2, 0x00000000U);
  152. #if defined (RTC_OTHER_SUPPORT)
  153. WRITE_REG(TAMP->CR3, 0x00000000U);
  154. WRITE_REG(TAMP->SMCR, 0x00000000U);
  155. WRITE_REG(TAMP->PRIVCR, 0x00000000U);
  156. #endif /* RTC_OTHER_SUPPORT */
  157. WRITE_REG(TAMP->FLTCR, 0x00000000U);
  158. #if defined (RTC_ACTIVE_TAMPER_SUPPORT)
  159. WRITE_REG(TAMP->ATCR1, 0x00000000U);
  160. WRITE_REG(TAMP->ATCR2, 0x00000000U);
  161. #endif /* RTC_ACTIVE_TAMPER_SUPPORT */
  162. WRITE_REG(TAMP->IER, 0x00000000U);
  163. WRITE_REG(TAMP->SCR, 0xFFFFFFFFU);
  164. #if defined (RTC_OPTION_REG_SUPPORT)
  165. WRITE_REG(TAMP->OR, 0x00000000U);
  166. #endif /* RTC_OPTION_REG_SUPPORT */
  167. return status;
  168. }
  169. /**
  170. * @brief Initializes the RTC registers according to the specified parameters
  171. * in RTC_InitStruct.
  172. * @param RTCx RTC Instance
  173. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains
  174. * the configuration information for the RTC peripheral.
  175. * @note The RTC Prescaler register is write protected and can be written in
  176. * initialization mode only.
  177. * @retval An ErrorStatus enumeration value:
  178. * - SUCCESS: RTC registers are initialized
  179. * - ERROR: RTC registers are not initialized
  180. */
  181. ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct)
  182. {
  183. ErrorStatus status = ERROR;
  184. /* Check the parameters */
  185. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  186. assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat));
  187. assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler));
  188. assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler));
  189. /* Disable the write protection for RTC registers */
  190. LL_RTC_DisableWriteProtection(RTCx);
  191. /* Set Initialization mode */
  192. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  193. {
  194. /* Set Hour Format */
  195. LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat);
  196. /* Configure Synchronous prescaler factor */
  197. LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler);
  198. /* Configure Asynchronous prescaler factor */
  199. LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler);
  200. /* Exit Initialization mode */
  201. LL_RTC_DisableInitMode(RTCx);
  202. status = SUCCESS;
  203. }
  204. /* Enable the write protection for RTC registers */
  205. LL_RTC_EnableWriteProtection(RTCx);
  206. return status;
  207. }
  208. /**
  209. * @brief Set each @ref LL_RTC_InitTypeDef field to default value.
  210. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized.
  211. * @retval None
  212. */
  213. void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct)
  214. {
  215. /* Set RTC_InitStruct fields to default values */
  216. RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR;
  217. RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT;
  218. RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT;
  219. }
  220. /**
  221. * @brief Set the RTC current time.
  222. * @param RTCx RTC Instance
  223. * @param RTC_Format This parameter can be one of the following values:
  224. * @arg @ref LL_RTC_FORMAT_BIN
  225. * @arg @ref LL_RTC_FORMAT_BCD
  226. * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains
  227. * the time configuration information for the RTC.
  228. * @retval An ErrorStatus enumeration value:
  229. * - SUCCESS: RTC Time register is configured
  230. * - ERROR: RTC Time register is not configured
  231. */
  232. ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
  233. {
  234. ErrorStatus status = ERROR;
  235. /* Check the parameters */
  236. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  237. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  238. if (RTC_Format == LL_RTC_FORMAT_BIN)
  239. {
  240. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  241. {
  242. assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours));
  243. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  244. }
  245. else
  246. {
  247. RTC_TimeStruct->TimeFormat = 0x00U;
  248. assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours));
  249. }
  250. assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes));
  251. assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds));
  252. }
  253. else
  254. {
  255. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  256. {
  257. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  258. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  259. }
  260. else
  261. {
  262. RTC_TimeStruct->TimeFormat = 0x00U;
  263. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  264. }
  265. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)));
  266. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds)));
  267. }
  268. /* Disable the write protection for RTC registers */
  269. LL_RTC_DisableWriteProtection(RTCx);
  270. /* Set Initialization mode */
  271. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  272. {
  273. /* Check the input parameters format */
  274. if (RTC_Format != LL_RTC_FORMAT_BIN)
  275. {
  276. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours,
  277. RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds);
  278. }
  279. else
  280. {
  281. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours),
  282. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes),
  283. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds));
  284. }
  285. /* Exit Initialization mode */
  286. LL_RTC_DisableInitMode(RTCx);
  287. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  288. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  289. {
  290. status = LL_RTC_WaitForSynchro(RTCx);
  291. }
  292. else
  293. {
  294. status = SUCCESS;
  295. }
  296. }
  297. /* Enable the write protection for RTC registers */
  298. LL_RTC_EnableWriteProtection(RTCx);
  299. return status;
  300. }
  301. /**
  302. * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec).
  303. * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized.
  304. * @retval None
  305. */
  306. void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct)
  307. {
  308. /* Time = 00h:00min:00sec */
  309. RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24;
  310. RTC_TimeStruct->Hours = 0U;
  311. RTC_TimeStruct->Minutes = 0U;
  312. RTC_TimeStruct->Seconds = 0U;
  313. }
  314. /**
  315. * @brief Set the RTC current date.
  316. * @param RTCx RTC Instance
  317. * @param RTC_Format This parameter can be one of the following values:
  318. * @arg @ref LL_RTC_FORMAT_BIN
  319. * @arg @ref LL_RTC_FORMAT_BCD
  320. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains
  321. * the date configuration information for the RTC.
  322. * @retval An ErrorStatus enumeration value:
  323. * - SUCCESS: RTC Day register is configured
  324. * - ERROR: RTC Day register is not configured
  325. */
  326. ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct)
  327. {
  328. ErrorStatus status = ERROR;
  329. /* Check the parameters */
  330. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  331. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  332. if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U))
  333. {
  334. RTC_DateStruct->Month = (uint8_t)(RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU;
  335. }
  336. if (RTC_Format == LL_RTC_FORMAT_BIN)
  337. {
  338. assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year));
  339. assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month));
  340. assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day));
  341. }
  342. else
  343. {
  344. assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year)));
  345. assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month)));
  346. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day)));
  347. }
  348. assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay));
  349. /* Disable the write protection for RTC registers */
  350. LL_RTC_DisableWriteProtection(RTCx);
  351. /* Set Initialization mode */
  352. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  353. {
  354. /* Check the input parameters format */
  355. if (RTC_Format != LL_RTC_FORMAT_BIN)
  356. {
  357. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year);
  358. }
  359. else
  360. {
  361. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day),
  362. __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year));
  363. }
  364. /* Exit Initialization mode */
  365. LL_RTC_DisableInitMode(RTCx);
  366. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  367. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  368. {
  369. status = LL_RTC_WaitForSynchro(RTCx);
  370. }
  371. else
  372. {
  373. status = SUCCESS;
  374. }
  375. }
  376. /* Enable the write protection for RTC registers */
  377. LL_RTC_EnableWriteProtection(RTCx);
  378. return status;
  379. }
  380. /**
  381. * @brief Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00)
  382. * @param RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized.
  383. * @retval None
  384. */
  385. void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct)
  386. {
  387. /* Monday, January 01 xx00 */
  388. RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY;
  389. RTC_DateStruct->Day = 1U;
  390. RTC_DateStruct->Month = LL_RTC_MONTH_JANUARY;
  391. RTC_DateStruct->Year = 0U;
  392. }
  393. /**
  394. * @brief Set the RTC Alarm A.
  395. * @note The Alarm register can only be written when the corresponding Alarm
  396. * is disabled (Use @ref LL_RTC_ALMA_Disable function).
  397. * @param RTCx RTC Instance
  398. * @param RTC_Format This parameter can be one of the following values:
  399. * @arg @ref LL_RTC_FORMAT_BIN
  400. * @arg @ref LL_RTC_FORMAT_BCD
  401. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
  402. * contains the alarm configuration parameters.
  403. * @retval An ErrorStatus enumeration value:
  404. * - SUCCESS: ALARMA registers are configured
  405. * - ERROR: ALARMA registers are not configured
  406. */
  407. ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  408. {
  409. /* Check the parameters */
  410. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  411. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  412. assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask));
  413. assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
  414. if (RTC_Format == LL_RTC_FORMAT_BIN)
  415. {
  416. /* initialize the AlarmTime for Binary format */
  417. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  418. {
  419. assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
  420. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  421. }
  422. else
  423. {
  424. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  425. assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
  426. }
  427. assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
  428. assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
  429. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  430. {
  431. assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
  432. }
  433. else
  434. {
  435. assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
  436. }
  437. }
  438. else
  439. {
  440. /* initialize the AlarmTime for BCD format */
  441. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  442. {
  443. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  444. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  445. }
  446. else
  447. {
  448. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  449. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  450. }
  451. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
  452. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
  453. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  454. {
  455. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  456. }
  457. else
  458. {
  459. assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  460. }
  461. }
  462. /* Disable the write protection for RTC registers */
  463. LL_RTC_DisableWriteProtection(RTCx);
  464. /* Select weekday selection */
  465. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  466. {
  467. /* Set the date for ALARM */
  468. LL_RTC_ALMA_DisableWeekday(RTCx);
  469. if (RTC_Format != LL_RTC_FORMAT_BIN)
  470. {
  471. LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  472. }
  473. else
  474. {
  475. LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
  476. }
  477. }
  478. else
  479. {
  480. /* Set the week day for ALARM */
  481. LL_RTC_ALMA_EnableWeekday(RTCx);
  482. LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  483. }
  484. /* Configure the Alarm register */
  485. if (RTC_Format != LL_RTC_FORMAT_BIN)
  486. {
  487. LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
  488. RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
  489. }
  490. else
  491. {
  492. LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
  493. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
  494. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
  495. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
  496. }
  497. /* Set ALARM mask */
  498. LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
  499. /* Enable the write protection for RTC registers */
  500. LL_RTC_EnableWriteProtection(RTCx);
  501. return SUCCESS;
  502. }
  503. /**
  504. * @brief Set the RTC Alarm B.
  505. * @note The Alarm register can only be written when the corresponding Alarm
  506. * is disabled (@ref LL_RTC_ALMB_Disable function).
  507. * @param RTCx RTC Instance
  508. * @param RTC_Format This parameter can be one of the following values:
  509. * @arg @ref LL_RTC_FORMAT_BIN
  510. * @arg @ref LL_RTC_FORMAT_BCD
  511. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
  512. * contains the alarm configuration parameters.
  513. * @retval An ErrorStatus enumeration value:
  514. * - SUCCESS: ALARMB registers are configured
  515. * - ERROR: ALARMB registers are not configured
  516. */
  517. ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  518. {
  519. /* Check the parameters */
  520. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  521. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  522. assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask));
  523. assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
  524. if (RTC_Format == LL_RTC_FORMAT_BIN)
  525. {
  526. /* initialize the AlarmTime for Binary format */
  527. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  528. {
  529. assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
  530. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  531. }
  532. else
  533. {
  534. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  535. assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
  536. }
  537. assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
  538. assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
  539. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  540. {
  541. assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
  542. }
  543. else
  544. {
  545. assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
  546. }
  547. }
  548. else
  549. {
  550. /* initialize the AlarmTime for BCD format */
  551. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  552. {
  553. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  554. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  555. }
  556. else
  557. {
  558. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  559. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  560. }
  561. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
  562. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
  563. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  564. {
  565. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  566. }
  567. else
  568. {
  569. assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  570. }
  571. }
  572. /* Disable the write protection for RTC registers */
  573. LL_RTC_DisableWriteProtection(RTCx);
  574. /* Select weekday selection */
  575. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  576. {
  577. /* Set the date for ALARM */
  578. LL_RTC_ALMB_DisableWeekday(RTCx);
  579. if (RTC_Format != LL_RTC_FORMAT_BIN)
  580. {
  581. LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  582. }
  583. else
  584. {
  585. LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
  586. }
  587. }
  588. else
  589. {
  590. /* Set the week day for ALARM */
  591. LL_RTC_ALMB_EnableWeekday(RTCx);
  592. LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  593. }
  594. /* Configure the Alarm register */
  595. if (RTC_Format != LL_RTC_FORMAT_BIN)
  596. {
  597. LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
  598. RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
  599. }
  600. else
  601. {
  602. LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
  603. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
  604. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
  605. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
  606. }
  607. /* Set ALARM mask */
  608. LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
  609. /* Enable the write protection for RTC registers */
  610. LL_RTC_EnableWriteProtection(RTCx);
  611. return SUCCESS;
  612. }
  613. /**
  614. * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec /
  615. * Day = 1st day of the month/Mask = all fields are masked).
  616. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
  617. * @retval None
  618. */
  619. void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  620. {
  621. /* Alarm Time Settings : Time = 00h:00mn:00sec */
  622. RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM;
  623. RTC_AlarmStruct->AlarmTime.Hours = 0U;
  624. RTC_AlarmStruct->AlarmTime.Minutes = 0U;
  625. RTC_AlarmStruct->AlarmTime.Seconds = 0U;
  626. /* Alarm Day Settings : Day = 1st day of the month */
  627. RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE;
  628. RTC_AlarmStruct->AlarmDateWeekDay = 1U;
  629. /* Alarm Masks Settings : Mask = all fields are not masked */
  630. RTC_AlarmStruct->AlarmMask = LL_RTC_ALMA_MASK_NONE;
  631. }
  632. /**
  633. * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMB field to default value (Time = 00h:00mn:00sec /
  634. * Day = 1st day of the month/Mask = all fields are masked).
  635. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
  636. * @retval None
  637. */
  638. void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  639. {
  640. /* Alarm Time Settings : Time = 00h:00mn:00sec */
  641. RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM;
  642. RTC_AlarmStruct->AlarmTime.Hours = 0U;
  643. RTC_AlarmStruct->AlarmTime.Minutes = 0U;
  644. RTC_AlarmStruct->AlarmTime.Seconds = 0U;
  645. /* Alarm Day Settings : Day = 1st day of the month */
  646. RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE;
  647. RTC_AlarmStruct->AlarmDateWeekDay = 1U;
  648. /* Alarm Masks Settings : Mask = all fields are not masked */
  649. RTC_AlarmStruct->AlarmMask = LL_RTC_ALMB_MASK_NONE;
  650. }
  651. /**
  652. * @brief Enters the RTC Initialization mode.
  653. * @note The RTC Initialization mode is write protected, use the
  654. * @ref LL_RTC_DisableWriteProtection before calling this function.
  655. * @param RTCx RTC Instance
  656. * @retval An ErrorStatus enumeration value:
  657. * - SUCCESS: RTC is in Init mode
  658. * - ERROR: RTC is not in Init mode
  659. */
  660. ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx)
  661. {
  662. __IO uint32_t timeout = RTC_INITMODE_TIMEOUT;
  663. ErrorStatus status = SUCCESS;
  664. uint32_t tmp;
  665. /* Check the parameter */
  666. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  667. /* Check if the Initialization mode is set */
  668. if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U)
  669. {
  670. /* Set the Initialization mode */
  671. LL_RTC_EnableInitMode(RTCx);
  672. /* Wait till RTC is in INIT state and if Time out is reached exit */
  673. tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
  674. while ((timeout != 0U) && (tmp != 1U))
  675. {
  676. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  677. {
  678. timeout --;
  679. }
  680. tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
  681. if (timeout == 0U)
  682. {
  683. status = ERROR;
  684. }
  685. }
  686. }
  687. return status;
  688. }
  689. /**
  690. * @brief Exit the RTC Initialization mode.
  691. * @note When the initialization sequence is complete, the calendar restarts
  692. * counting after 4 RTCCLK cycles.
  693. * @note The RTC Initialization mode is write protected, use the
  694. * @ref LL_RTC_DisableWriteProtection before calling this function.
  695. * @param RTCx RTC Instance
  696. * @retval An ErrorStatus enumeration value:
  697. * - SUCCESS: RTC exited from in Init mode
  698. * - ERROR: Not applicable
  699. */
  700. ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx)
  701. {
  702. /* Check the parameter */
  703. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  704. /* Disable initialization mode */
  705. LL_RTC_DisableInitMode(RTCx);
  706. return SUCCESS;
  707. }
  708. /**
  709. * @brief Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are
  710. * synchronized with RTC APB clock.
  711. * @note The RTC Resynchronization mode is write protected, use the
  712. * @ref LL_RTC_DisableWriteProtection before calling this function.
  713. * @note To read the calendar through the shadow registers after Calendar
  714. * initialization, calendar update or after wakeup from low power modes
  715. * the software must first clear the RSF flag.
  716. * The software must then wait until it is set again before reading
  717. * the calendar, which means that the calendar registers have been
  718. * correctly copied into the RTC_TR and RTC_DR shadow registers.
  719. * @param RTCx RTC Instance
  720. * @retval An ErrorStatus enumeration value:
  721. * - SUCCESS: RTC registers are synchronised
  722. * - ERROR: RTC registers are not synchronised
  723. */
  724. ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx)
  725. {
  726. __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT;
  727. ErrorStatus status = SUCCESS;
  728. uint32_t tmp;
  729. /* Check the parameter */
  730. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  731. /* Clear RSF flag */
  732. LL_RTC_ClearFlag_RS(RTCx);
  733. /* Wait the registers to be synchronised */
  734. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  735. while ((timeout != 0U) && (tmp != 0U))
  736. {
  737. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  738. {
  739. timeout--;
  740. }
  741. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  742. if (timeout == 0U)
  743. {
  744. status = ERROR;
  745. }
  746. }
  747. if (status != ERROR)
  748. {
  749. timeout = RTC_SYNCHRO_TIMEOUT;
  750. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  751. while ((timeout != 0U) && (tmp != 1U))
  752. {
  753. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  754. {
  755. timeout--;
  756. }
  757. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  758. if (timeout == 0U)
  759. {
  760. status = ERROR;
  761. }
  762. }
  763. }
  764. return (status);
  765. }
  766. /**
  767. * @}
  768. */
  769. /**
  770. * @}
  771. */
  772. /**
  773. * @}
  774. */
  775. #endif /* defined(RTC) */
  776. /**
  777. * @}
  778. */
  779. #endif /* USE_FULL_LL_DRIVER */