You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

stm32l1xx_ll_rtc.c 31KB

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