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.
 
 
 

895 lines
31 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32h7xx_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 "stm32h7xx_ll_rtc.h"
  22. #include "stm32h7xx_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 STM32H7xx_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. LL_RTC_WriteReg(RTCx, DR, (RTC_DR_WDU_0 | RTC_DR_MU_0 | RTC_DR_DU_0));
  136. /* Reset All CR bits except CR[2:0] */
  137. LL_RTC_WriteReg(RTCx, CR, (LL_RTC_ReadReg(RTCx, CR) & RTC_CR_WUCKSEL));
  138. LL_RTC_WriteReg(RTCx, WUTR, RTC_WUTR_WUT);
  139. LL_RTC_WriteReg(RTCx, PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT));
  140. LL_RTC_WriteReg(RTCx, ALRMAR, 0x00000000U);
  141. LL_RTC_WriteReg(RTCx, ALRMBR, 0x00000000U);
  142. LL_RTC_WriteReg(RTCx, SHIFTR, 0x00000000U);
  143. LL_RTC_WriteReg(RTCx, CALR, 0x00000000U);
  144. LL_RTC_WriteReg(RTCx, ALRMASSR, 0x00000000U);
  145. LL_RTC_WriteReg(RTCx, ALRMBSSR, 0x00000000U);
  146. #if defined(RTC_ICSR_ALRAWF)
  147. /* Reset ICSR register and exit initialization mode */
  148. LL_RTC_WriteReg(RTCx, ICSR, 0x00000000U);
  149. #endif /* RTC_ICSR_ALRAWF */
  150. #if defined(RTC_ISR_ALRAWF)
  151. /* Reset ISR register and exit initialization mode */
  152. LL_RTC_WriteReg(RTCx, ISR, 0x00000000U);
  153. #endif /* RTC_ISR_ALRAWF */
  154. #if defined(RTC_TAMPCR_TAMP1E)
  155. /* Reset Tamper and alternate functions configuration register */
  156. LL_RTC_WriteReg(RTCx, TAMPCR, 0x00000000U);
  157. #endif /* RTC_TAMPCR_TAMP1E */
  158. #if defined(RTC_OR_ALARMOUTTYPE)
  159. /* Reset Option register */
  160. LL_RTC_WriteReg(RTCx, OR, 0x00000000U);
  161. #endif /* RTC_OR_ALARMOUTTYPE */
  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. #if defined (TAMP_CR1_TAMP1E)
  168. /* DeInitialization of the TAMP */
  169. LL_RTC_WriteReg(TAMP, CR1, 0xFFFF0000U);
  170. LL_RTC_WriteReg(TAMP, FLTCR, 0x00000000U);
  171. LL_RTC_WriteReg(TAMP, ATCR1, 0x00000000U);
  172. LL_RTC_WriteReg(TAMP, IER, 0x00000000U);
  173. LL_RTC_WriteReg(TAMP, SCR, 0xFFFFFFFFU);
  174. #endif /* TAMP_CR1_TAMP1E */
  175. return status;
  176. }
  177. /**
  178. * @brief Initializes the RTC registers according to the specified parameters
  179. * in RTC_InitStruct.
  180. * @param RTCx RTC Instance
  181. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains
  182. * the configuration information for the RTC peripheral.
  183. * @note The RTC Prescaler register is write protected and can be written in
  184. * initialization mode only.
  185. * @retval An ErrorStatus enumeration value:
  186. * - SUCCESS: RTC registers are initialized
  187. * - ERROR: RTC registers are not initialized
  188. */
  189. ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct)
  190. {
  191. ErrorStatus status = ERROR;
  192. /* Check the parameters */
  193. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  194. assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat));
  195. assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler));
  196. assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler));
  197. /* Disable the write protection for RTC registers */
  198. LL_RTC_DisableWriteProtection(RTCx);
  199. /* Set Initialization mode */
  200. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  201. {
  202. /* Set Hour Format */
  203. LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat);
  204. /* Configure Synchronous and Asynchronous prescaler factor */
  205. LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler);
  206. LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler);
  207. /* Exit Initialization mode */
  208. LL_RTC_DisableInitMode(RTCx);
  209. status = SUCCESS;
  210. }
  211. /* Enable the write protection for RTC registers */
  212. LL_RTC_EnableWriteProtection(RTCx);
  213. return status;
  214. }
  215. /**
  216. * @brief Set each @ref LL_RTC_InitTypeDef field to default value.
  217. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized.
  218. * @retval None
  219. */
  220. void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct)
  221. {
  222. /* Set RTC_InitStruct fields to default values */
  223. RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR;
  224. RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT;
  225. RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT;
  226. }
  227. /**
  228. * @brief Set the RTC current time.
  229. * @param RTCx RTC Instance
  230. * @param RTC_Format This parameter can be one of the following values:
  231. * @arg @ref LL_RTC_FORMAT_BIN
  232. * @arg @ref LL_RTC_FORMAT_BCD
  233. * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains
  234. * the time configuration information for the RTC.
  235. * @retval An ErrorStatus enumeration value:
  236. * - SUCCESS: RTC Time register is configured
  237. * - ERROR: RTC Time register is not configured
  238. */
  239. ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
  240. {
  241. ErrorStatus status = ERROR;
  242. /* Check the parameters */
  243. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  244. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  245. if (RTC_Format == LL_RTC_FORMAT_BIN)
  246. {
  247. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  248. {
  249. assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours));
  250. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  251. }
  252. else
  253. {
  254. RTC_TimeStruct->TimeFormat = 0x00U;
  255. assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours));
  256. }
  257. assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes));
  258. assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds));
  259. }
  260. else
  261. {
  262. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  263. {
  264. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  265. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  266. }
  267. else
  268. {
  269. RTC_TimeStruct->TimeFormat = 0x00U;
  270. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  271. }
  272. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)));
  273. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds)));
  274. }
  275. /* Disable the write protection for RTC registers */
  276. LL_RTC_DisableWriteProtection(RTCx);
  277. /* Set Initialization mode */
  278. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  279. {
  280. /* Check the input parameters format */
  281. if (RTC_Format != LL_RTC_FORMAT_BIN)
  282. {
  283. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours,
  284. RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds);
  285. }
  286. else
  287. {
  288. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours),
  289. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes),
  290. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds));
  291. }
  292. /* Exit Initialization mode */
  293. LL_RTC_DisableInitMode(RTC);
  294. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  295. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  296. {
  297. status = LL_RTC_WaitForSynchro(RTCx);
  298. }
  299. else
  300. {
  301. status = SUCCESS;
  302. }
  303. }
  304. /* Enable the write protection for RTC registers */
  305. LL_RTC_EnableWriteProtection(RTCx);
  306. return status;
  307. }
  308. /**
  309. * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec).
  310. * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized.
  311. * @retval None
  312. */
  313. void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct)
  314. {
  315. /* Time = 00h:00min:00sec */
  316. RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24;
  317. RTC_TimeStruct->Hours = 0U;
  318. RTC_TimeStruct->Minutes = 0U;
  319. RTC_TimeStruct->Seconds = 0U;
  320. }
  321. /**
  322. * @brief Set the RTC current date.
  323. * @param RTCx RTC Instance
  324. * @param RTC_Format This parameter can be one of the following values:
  325. * @arg @ref LL_RTC_FORMAT_BIN
  326. * @arg @ref LL_RTC_FORMAT_BCD
  327. * @param RTC_DateStruct: pointer to a RTC_DateTypeDef structure that contains
  328. * the date configuration information for the RTC.
  329. * @retval An ErrorStatus enumeration value:
  330. * - SUCCESS: RTC Day register is configured
  331. * - ERROR: RTC Day register is not configured
  332. */
  333. ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct)
  334. {
  335. ErrorStatus status = ERROR;
  336. /* Check the parameters */
  337. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  338. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  339. if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U))
  340. {
  341. RTC_DateStruct->Month = (uint8_t)((RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU);
  342. }
  343. if (RTC_Format == LL_RTC_FORMAT_BIN)
  344. {
  345. assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year));
  346. assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month));
  347. assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day));
  348. }
  349. else
  350. {
  351. assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year)));
  352. assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month)));
  353. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day)));
  354. }
  355. assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay));
  356. /* Disable the write protection for RTC registers */
  357. LL_RTC_DisableWriteProtection(RTCx);
  358. /* Set Initialization mode */
  359. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  360. {
  361. /* Check the input parameters format */
  362. if (RTC_Format != LL_RTC_FORMAT_BIN)
  363. {
  364. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year);
  365. }
  366. else
  367. {
  368. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day),
  369. __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year));
  370. }
  371. /* Exit Initialization mode */
  372. LL_RTC_DisableInitMode(RTC);
  373. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  374. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  375. {
  376. status = LL_RTC_WaitForSynchro(RTCx);
  377. }
  378. else
  379. {
  380. status = SUCCESS;
  381. }
  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****/