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.
 
 
 

880 lines
31 KiB

  1. /**
  2. ******************************************************************************
  3. * @file stm32wbxx_ll_rtc.c
  4. * @author MCD Application Team
  5. * @brief RTC LL module driver.
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 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 "stm32wbxx_ll_rtc.h"
  22. #include "stm32wbxx_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 STM32WBxx_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 doesn't 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. WRITE_REG(RTCx->TR, 0x00000000U);
  135. #if defined(RTC_WAKEUP_SUPPORT)
  136. WRITE_REG(RTCx->WUTR, RTC_WUTR_WUT);
  137. #endif /* RTC_WAKEUP_SUPPORT */
  138. WRITE_REG(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. WRITE_REG(RTCx->CR, (READ_REG(RTCx->CR) & RTC_CR_WUCKSEL));
  142. #else
  143. WRITE_REG(RTCx, CR, 0x00000000U);
  144. #endif /* RTC_WAKEUP_SUPPORT */
  145. WRITE_REG(RTCx->PRER, (RTC_PRER_PREDIV_A | RTC_SYNCH_PRESC_DEFAULT));
  146. WRITE_REG(RTCx->ALRMAR, 0x00000000U);
  147. WRITE_REG(RTCx->ALRMBR, 0x00000000U);
  148. WRITE_REG(RTCx->SHIFTR, 0x00000000U);
  149. WRITE_REG(RTCx->CALR, 0x00000000U);
  150. WRITE_REG(RTCx->ALRMASSR, 0x00000000U);
  151. WRITE_REG(RTCx->ALRMBSSR, 0x00000000U);
  152. /* Reset ISR register and exit initialization mode */
  153. WRITE_REG(RTCx->ISR, 0x00000000U);
  154. /* Reset Tamper and alternate functions configuration register */
  155. WRITE_REG(RTCx->TAMPCR, 0x00000000U);
  156. /* Reset Option register */
  157. WRITE_REG(RTCx->OR, 0x00000000U);
  158. /* Wait till the RTC RSF flag is set */
  159. status = LL_RTC_WaitForSynchro(RTCx);
  160. }
  161. /* Enable the write protection for RTC registers */
  162. LL_RTC_EnableWriteProtection(RTCx);
  163. return status;
  164. }
  165. /**
  166. * @brief Initializes the RTC registers according to the specified parameters
  167. * in RTC_InitStruct.
  168. * @param RTCx RTC Instance
  169. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure that contains
  170. * the configuration information for the RTC peripheral.
  171. * @note The RTC Prescaler register is write protected and can be written in
  172. * initialization mode only.
  173. * @retval An ErrorStatus enumeration value:
  174. * - SUCCESS: RTC registers are initialized
  175. * - ERROR: RTC registers are not initialized
  176. */
  177. ErrorStatus LL_RTC_Init(RTC_TypeDef *RTCx, LL_RTC_InitTypeDef *RTC_InitStruct)
  178. {
  179. ErrorStatus status = ERROR;
  180. /* Check the parameters */
  181. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  182. assert_param(IS_LL_RTC_HOURFORMAT(RTC_InitStruct->HourFormat));
  183. assert_param(IS_LL_RTC_ASYNCH_PREDIV(RTC_InitStruct->AsynchPrescaler));
  184. assert_param(IS_LL_RTC_SYNCH_PREDIV(RTC_InitStruct->SynchPrescaler));
  185. /* Disable the write protection for RTC registers */
  186. LL_RTC_DisableWriteProtection(RTCx);
  187. /* Set Initialization mode */
  188. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  189. {
  190. /* Set Hour Format */
  191. LL_RTC_SetHourFormat(RTCx, RTC_InitStruct->HourFormat);
  192. /* Configure Synchronous and Asynchronous prescaler factor */
  193. LL_RTC_SetSynchPrescaler(RTCx, RTC_InitStruct->SynchPrescaler);
  194. LL_RTC_SetAsynchPrescaler(RTCx, RTC_InitStruct->AsynchPrescaler);
  195. /* Exit Initialization mode */
  196. LL_RTC_DisableInitMode(RTCx);
  197. status = SUCCESS;
  198. }
  199. /* Enable the write protection for RTC registers */
  200. LL_RTC_EnableWriteProtection(RTCx);
  201. return status;
  202. }
  203. /**
  204. * @brief Set each @ref LL_RTC_InitTypeDef field to default value.
  205. * @param RTC_InitStruct pointer to a @ref LL_RTC_InitTypeDef structure which will be initialized.
  206. * @retval None
  207. */
  208. void LL_RTC_StructInit(LL_RTC_InitTypeDef *RTC_InitStruct)
  209. {
  210. /* Set RTC_InitStruct fields to default values */
  211. RTC_InitStruct->HourFormat = LL_RTC_HOURFORMAT_24HOUR;
  212. RTC_InitStruct->AsynchPrescaler = RTC_ASYNCH_PRESC_DEFAULT;
  213. RTC_InitStruct->SynchPrescaler = RTC_SYNCH_PRESC_DEFAULT;
  214. }
  215. /**
  216. * @brief Set the RTC current time.
  217. * @param RTCx RTC Instance
  218. * @param RTC_Format This parameter can be one of the following values:
  219. * @arg @ref LL_RTC_FORMAT_BIN
  220. * @arg @ref LL_RTC_FORMAT_BCD
  221. * @param RTC_TimeStruct pointer to a RTC_TimeTypeDef structure that contains
  222. * the time configuration information for the RTC.
  223. * @retval An ErrorStatus enumeration value:
  224. * - SUCCESS: RTC Time register is configured
  225. * - ERROR: RTC Time register is not configured
  226. */
  227. ErrorStatus LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
  228. {
  229. ErrorStatus status = ERROR;
  230. /* Check the parameters */
  231. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  232. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  233. if (RTC_Format == LL_RTC_FORMAT_BIN)
  234. {
  235. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  236. {
  237. assert_param(IS_LL_RTC_HOUR12(RTC_TimeStruct->Hours));
  238. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  239. }
  240. else
  241. {
  242. RTC_TimeStruct->TimeFormat = 0x00U;
  243. assert_param(IS_LL_RTC_HOUR24(RTC_TimeStruct->Hours));
  244. }
  245. assert_param(IS_LL_RTC_MINUTES(RTC_TimeStruct->Minutes));
  246. assert_param(IS_LL_RTC_SECONDS(RTC_TimeStruct->Seconds));
  247. }
  248. else
  249. {
  250. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  251. {
  252. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  253. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_TimeStruct->TimeFormat));
  254. }
  255. else
  256. {
  257. RTC_TimeStruct->TimeFormat = 0x00U;
  258. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Hours)));
  259. }
  260. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Minutes)));
  261. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_TimeStruct->Seconds)));
  262. }
  263. /* Disable the write protection for RTC registers */
  264. LL_RTC_DisableWriteProtection(RTCx);
  265. /* Set Initialization mode */
  266. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  267. {
  268. /* Check the input parameters format */
  269. if (RTC_Format != LL_RTC_FORMAT_BIN)
  270. {
  271. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, RTC_TimeStruct->Hours,
  272. RTC_TimeStruct->Minutes, RTC_TimeStruct->Seconds);
  273. }
  274. else
  275. {
  276. LL_RTC_TIME_Config(RTCx, RTC_TimeStruct->TimeFormat, __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Hours),
  277. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Minutes),
  278. __LL_RTC_CONVERT_BIN2BCD(RTC_TimeStruct->Seconds));
  279. }
  280. /* Exit Initialization mode */
  281. LL_RTC_DisableInitMode(RTC);
  282. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  283. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  284. {
  285. status = LL_RTC_WaitForSynchro(RTCx);
  286. }
  287. else
  288. {
  289. status = SUCCESS;
  290. }
  291. }
  292. /* Enable the write protection for RTC registers */
  293. LL_RTC_EnableWriteProtection(RTCx);
  294. return status;
  295. }
  296. /**
  297. * @brief Set each @ref LL_RTC_TimeTypeDef field to default value (Time = 00h:00min:00sec).
  298. * @param RTC_TimeStruct pointer to a @ref LL_RTC_TimeTypeDef structure which will be initialized.
  299. * @retval None
  300. */
  301. void LL_RTC_TIME_StructInit(LL_RTC_TimeTypeDef *RTC_TimeStruct)
  302. {
  303. /* Time = 00h:00min:00sec */
  304. RTC_TimeStruct->TimeFormat = LL_RTC_TIME_FORMAT_AM_OR_24;
  305. RTC_TimeStruct->Hours = 0U;
  306. RTC_TimeStruct->Minutes = 0U;
  307. RTC_TimeStruct->Seconds = 0U;
  308. }
  309. /**
  310. * @brief Set the RTC current date.
  311. * @param RTCx RTC Instance
  312. * @param RTC_Format This parameter can be one of the following values:
  313. * @arg @ref LL_RTC_FORMAT_BIN
  314. * @arg @ref LL_RTC_FORMAT_BCD
  315. * @param RTC_DateStruct pointer to a RTC_DateTypeDef structure that contains
  316. * the date configuration information for the RTC.
  317. * @retval An ErrorStatus enumeration value:
  318. * - SUCCESS: RTC Day register is configured
  319. * - ERROR: RTC Day register is not configured
  320. */
  321. ErrorStatus LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct)
  322. {
  323. ErrorStatus status = ERROR;
  324. /* Check the parameters */
  325. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  326. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  327. if ((RTC_Format == LL_RTC_FORMAT_BIN) && ((RTC_DateStruct->Month & 0x10U) == 0x10U))
  328. {
  329. RTC_DateStruct->Month = (RTC_DateStruct->Month & (uint8_t)~(0x10U)) + 0x0AU;
  330. }
  331. if (RTC_Format == LL_RTC_FORMAT_BIN)
  332. {
  333. assert_param(IS_LL_RTC_YEAR(RTC_DateStruct->Year));
  334. assert_param(IS_LL_RTC_MONTH(RTC_DateStruct->Month));
  335. assert_param(IS_LL_RTC_DAY(RTC_DateStruct->Day));
  336. }
  337. else
  338. {
  339. assert_param(IS_LL_RTC_YEAR(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Year)));
  340. assert_param(IS_LL_RTC_MONTH(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Month)));
  341. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_DateStruct->Day)));
  342. }
  343. assert_param(IS_LL_RTC_WEEKDAY(RTC_DateStruct->WeekDay));
  344. /* Disable the write protection for RTC registers */
  345. LL_RTC_DisableWriteProtection(RTCx);
  346. /* Set Initialization mode */
  347. if (LL_RTC_EnterInitMode(RTCx) != ERROR)
  348. {
  349. /* Check the input parameters format */
  350. if (RTC_Format != LL_RTC_FORMAT_BIN)
  351. {
  352. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, RTC_DateStruct->Day, RTC_DateStruct->Month, RTC_DateStruct->Year);
  353. }
  354. else
  355. {
  356. LL_RTC_DATE_Config(RTCx, RTC_DateStruct->WeekDay, __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Day),
  357. __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Month), __LL_RTC_CONVERT_BIN2BCD(RTC_DateStruct->Year));
  358. }
  359. /* Exit Initialization mode */
  360. LL_RTC_DisableInitMode(RTC);
  361. /* If RTC_CR_BYPSHAD bit = 0, wait for synchro else this check is not needed */
  362. if (LL_RTC_IsShadowRegBypassEnabled(RTCx) == 0U)
  363. {
  364. status = LL_RTC_WaitForSynchro(RTCx);
  365. }
  366. else
  367. {
  368. status = SUCCESS;
  369. }
  370. }
  371. /* Enable the write protection for RTC registers */
  372. LL_RTC_EnableWriteProtection(RTCx);
  373. return status;
  374. }
  375. /**
  376. * @brief Set each @ref LL_RTC_DateTypeDef field to default value (date = Monday, January 01 xx00)
  377. * @param RTC_DateStruct pointer to a @ref LL_RTC_DateTypeDef structure which will be initialized.
  378. * @retval None
  379. */
  380. void LL_RTC_DATE_StructInit(LL_RTC_DateTypeDef *RTC_DateStruct)
  381. {
  382. /* Monday, January 01 xx00 */
  383. RTC_DateStruct->WeekDay = LL_RTC_WEEKDAY_MONDAY;
  384. RTC_DateStruct->Day = 1U;
  385. RTC_DateStruct->Month = LL_RTC_MONTH_JANUARY;
  386. RTC_DateStruct->Year = 0U;
  387. }
  388. /**
  389. * @brief Set the RTC Alarm A.
  390. * @note The Alarm register can only be written when the corresponding Alarm
  391. * is disabled (Use @ref LL_RTC_ALMA_Disable function).
  392. * @param RTCx RTC Instance
  393. * @param RTC_Format This parameter can be one of the following values:
  394. * @arg @ref LL_RTC_FORMAT_BIN
  395. * @arg @ref LL_RTC_FORMAT_BCD
  396. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
  397. * contains the alarm configuration parameters.
  398. * @retval An ErrorStatus enumeration value:
  399. * - SUCCESS: ALARMA registers are configured
  400. * - ERROR: ALARMA registers are not configured
  401. */
  402. ErrorStatus LL_RTC_ALMA_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  403. {
  404. /* Check the parameters */
  405. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  406. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  407. assert_param(IS_LL_RTC_ALMA_MASK(RTC_AlarmStruct->AlarmMask));
  408. assert_param(IS_LL_RTC_ALMA_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
  409. if (RTC_Format == LL_RTC_FORMAT_BIN)
  410. {
  411. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  412. {
  413. assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
  414. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  415. }
  416. else
  417. {
  418. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  419. assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
  420. }
  421. assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
  422. assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
  423. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  424. {
  425. assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
  426. }
  427. else
  428. {
  429. assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
  430. }
  431. }
  432. else
  433. {
  434. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  435. {
  436. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  437. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  438. }
  439. else
  440. {
  441. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  442. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  443. }
  444. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
  445. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
  446. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  447. {
  448. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  449. }
  450. else
  451. {
  452. assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  453. }
  454. }
  455. /* Disable the write protection for RTC registers */
  456. LL_RTC_DisableWriteProtection(RTCx);
  457. /* Select weekday selection */
  458. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMA_DATEWEEKDAYSEL_DATE)
  459. {
  460. /* Set the date for ALARM */
  461. LL_RTC_ALMA_DisableWeekday(RTCx);
  462. if (RTC_Format != LL_RTC_FORMAT_BIN)
  463. {
  464. LL_RTC_ALMA_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  465. }
  466. else
  467. {
  468. LL_RTC_ALMA_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
  469. }
  470. }
  471. else
  472. {
  473. /* Set the week day for ALARM */
  474. LL_RTC_ALMA_EnableWeekday(RTCx);
  475. LL_RTC_ALMA_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  476. }
  477. /* Configure the Alarm register */
  478. if (RTC_Format != LL_RTC_FORMAT_BIN)
  479. {
  480. LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
  481. RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
  482. }
  483. else
  484. {
  485. LL_RTC_ALMA_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
  486. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
  487. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
  488. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
  489. }
  490. /* Set ALARM mask */
  491. LL_RTC_ALMA_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
  492. /* Enable the write protection for RTC registers */
  493. LL_RTC_EnableWriteProtection(RTCx);
  494. return SUCCESS;
  495. }
  496. /**
  497. * @brief Set the RTC Alarm B.
  498. * @note The Alarm register can only be written when the corresponding Alarm
  499. * is disabled (@ref LL_RTC_ALMB_Disable function).
  500. * @param RTCx RTC Instance
  501. * @param RTC_Format This parameter can be one of the following values:
  502. * @arg @ref LL_RTC_FORMAT_BIN
  503. * @arg @ref LL_RTC_FORMAT_BCD
  504. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure that
  505. * contains the alarm configuration parameters.
  506. * @retval An ErrorStatus enumeration value:
  507. * - SUCCESS: ALARMB registers are configured
  508. * - ERROR: ALARMB registers are not configured
  509. */
  510. ErrorStatus LL_RTC_ALMB_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  511. {
  512. /* Check the parameters */
  513. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  514. assert_param(IS_LL_RTC_FORMAT(RTC_Format));
  515. assert_param(IS_LL_RTC_ALMB_MASK(RTC_AlarmStruct->AlarmMask));
  516. assert_param(IS_LL_RTC_ALMB_DATE_WEEKDAY_SEL(RTC_AlarmStruct->AlarmDateWeekDaySel));
  517. if (RTC_Format == LL_RTC_FORMAT_BIN)
  518. {
  519. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  520. {
  521. assert_param(IS_LL_RTC_HOUR12(RTC_AlarmStruct->AlarmTime.Hours));
  522. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  523. }
  524. else
  525. {
  526. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  527. assert_param(IS_LL_RTC_HOUR24(RTC_AlarmStruct->AlarmTime.Hours));
  528. }
  529. assert_param(IS_LL_RTC_MINUTES(RTC_AlarmStruct->AlarmTime.Minutes));
  530. assert_param(IS_LL_RTC_SECONDS(RTC_AlarmStruct->AlarmTime.Seconds));
  531. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  532. {
  533. assert_param(IS_LL_RTC_DAY(RTC_AlarmStruct->AlarmDateWeekDay));
  534. }
  535. else
  536. {
  537. assert_param(IS_LL_RTC_WEEKDAY(RTC_AlarmStruct->AlarmDateWeekDay));
  538. }
  539. }
  540. else
  541. {
  542. if (LL_RTC_GetHourFormat(RTCx) != LL_RTC_HOURFORMAT_24HOUR)
  543. {
  544. assert_param(IS_LL_RTC_HOUR12(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  545. assert_param(IS_LL_RTC_TIME_FORMAT(RTC_AlarmStruct->AlarmTime.TimeFormat));
  546. }
  547. else
  548. {
  549. RTC_AlarmStruct->AlarmTime.TimeFormat = 0x00U;
  550. assert_param(IS_LL_RTC_HOUR24(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Hours)));
  551. }
  552. assert_param(IS_LL_RTC_MINUTES(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Minutes)));
  553. assert_param(IS_LL_RTC_SECONDS(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmTime.Seconds)));
  554. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  555. {
  556. assert_param(IS_LL_RTC_DAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  557. }
  558. else
  559. {
  560. assert_param(IS_LL_RTC_WEEKDAY(__LL_RTC_CONVERT_BCD2BIN(RTC_AlarmStruct->AlarmDateWeekDay)));
  561. }
  562. }
  563. /* Disable the write protection for RTC registers */
  564. LL_RTC_DisableWriteProtection(RTCx);
  565. /* Select weekday selection */
  566. if (RTC_AlarmStruct->AlarmDateWeekDaySel == LL_RTC_ALMB_DATEWEEKDAYSEL_DATE)
  567. {
  568. /* Set the date for ALARM */
  569. LL_RTC_ALMB_DisableWeekday(RTCx);
  570. if (RTC_Format != LL_RTC_FORMAT_BIN)
  571. {
  572. LL_RTC_ALMB_SetDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  573. }
  574. else
  575. {
  576. LL_RTC_ALMB_SetDay(RTCx, __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmDateWeekDay));
  577. }
  578. }
  579. else
  580. {
  581. /* Set the week day for ALARM */
  582. LL_RTC_ALMB_EnableWeekday(RTCx);
  583. LL_RTC_ALMB_SetWeekDay(RTCx, RTC_AlarmStruct->AlarmDateWeekDay);
  584. }
  585. /* Configure the Alarm register */
  586. if (RTC_Format != LL_RTC_FORMAT_BIN)
  587. {
  588. LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat, RTC_AlarmStruct->AlarmTime.Hours,
  589. RTC_AlarmStruct->AlarmTime.Minutes, RTC_AlarmStruct->AlarmTime.Seconds);
  590. }
  591. else
  592. {
  593. LL_RTC_ALMB_ConfigTime(RTCx, RTC_AlarmStruct->AlarmTime.TimeFormat,
  594. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Hours),
  595. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Minutes),
  596. __LL_RTC_CONVERT_BIN2BCD(RTC_AlarmStruct->AlarmTime.Seconds));
  597. }
  598. /* Set ALARM mask */
  599. LL_RTC_ALMB_SetMask(RTCx, RTC_AlarmStruct->AlarmMask);
  600. /* Enable the write protection for RTC registers */
  601. LL_RTC_EnableWriteProtection(RTCx);
  602. return SUCCESS;
  603. }
  604. /**
  605. * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec /
  606. * Day = 1st day of the month/Mask = all fields are masked).
  607. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
  608. * @retval None
  609. */
  610. void LL_RTC_ALMA_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  611. {
  612. /* Alarm Time Settings : Time = 00h:00mn:00sec */
  613. RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMA_TIME_FORMAT_AM;
  614. RTC_AlarmStruct->AlarmTime.Hours = 0U;
  615. RTC_AlarmStruct->AlarmTime.Minutes = 0U;
  616. RTC_AlarmStruct->AlarmTime.Seconds = 0U;
  617. /* Alarm Day Settings : Day = 1st day of the month */
  618. RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMA_DATEWEEKDAYSEL_DATE;
  619. RTC_AlarmStruct->AlarmDateWeekDay = 1U;
  620. /* Alarm Masks Settings : Mask = all fields are not masked */
  621. RTC_AlarmStruct->AlarmMask = LL_RTC_ALMA_MASK_NONE;
  622. }
  623. /**
  624. * @brief Set each @ref LL_RTC_AlarmTypeDef of ALARMA field to default value (Time = 00h:00mn:00sec /
  625. * Day = 1st day of the month/Mask = all fields are masked).
  626. * @param RTC_AlarmStruct pointer to a @ref LL_RTC_AlarmTypeDef structure which will be initialized.
  627. * @retval None
  628. */
  629. void LL_RTC_ALMB_StructInit(LL_RTC_AlarmTypeDef *RTC_AlarmStruct)
  630. {
  631. /* Alarm Time Settings : Time = 00h:00mn:00sec */
  632. RTC_AlarmStruct->AlarmTime.TimeFormat = LL_RTC_ALMB_TIME_FORMAT_AM;
  633. RTC_AlarmStruct->AlarmTime.Hours = 0U;
  634. RTC_AlarmStruct->AlarmTime.Minutes = 0U;
  635. RTC_AlarmStruct->AlarmTime.Seconds = 0U;
  636. /* Alarm Day Settings : Day = 1st day of the month */
  637. RTC_AlarmStruct->AlarmDateWeekDaySel = LL_RTC_ALMB_DATEWEEKDAYSEL_DATE;
  638. RTC_AlarmStruct->AlarmDateWeekDay = 1U;
  639. /* Alarm Masks Settings : Mask = all fields are not masked */
  640. RTC_AlarmStruct->AlarmMask = LL_RTC_ALMB_MASK_NONE;
  641. }
  642. /**
  643. * @brief Enters the RTC Initialization mode.
  644. * @note The RTC Initialization mode is write protected, use the
  645. * @ref LL_RTC_DisableWriteProtection before calling this function.
  646. * @param RTCx RTC Instance
  647. * @retval An ErrorStatus enumeration value:
  648. * - SUCCESS: RTC is in Init mode
  649. * - ERROR: RTC is not in Init mode
  650. */
  651. ErrorStatus LL_RTC_EnterInitMode(RTC_TypeDef *RTCx)
  652. {
  653. __IO uint32_t timeout = RTC_INITMODE_TIMEOUT;
  654. ErrorStatus status = SUCCESS;
  655. uint32_t tmp;
  656. /* Check the parameter */
  657. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  658. /* Check if the Initialization mode is set */
  659. if (LL_RTC_IsActiveFlag_INIT(RTCx) == 0U)
  660. {
  661. /* Set the Initialization mode */
  662. LL_RTC_EnableInitMode(RTCx);
  663. /* Wait till RTC is in INIT state and if Time out is reached exit */
  664. tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
  665. while ((timeout != 0U) && (tmp != 1U))
  666. {
  667. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  668. {
  669. timeout --;
  670. }
  671. tmp = LL_RTC_IsActiveFlag_INIT(RTCx);
  672. if (timeout == 0U)
  673. {
  674. status = ERROR;
  675. }
  676. }
  677. }
  678. return status;
  679. }
  680. /**
  681. * @brief Exit the RTC Initialization mode.
  682. * @note When the initialization sequence is complete, the calendar restarts
  683. * counting after 4 RTCCLK cycles.
  684. * @note The RTC Initialization mode is write protected, use the
  685. * @ref LL_RTC_DisableWriteProtection before calling this function.
  686. * @param RTCx RTC Instance
  687. * @retval An ErrorStatus enumeration value:
  688. * - SUCCESS: RTC exited from in Init mode
  689. * - ERROR: Not applicable
  690. */
  691. ErrorStatus LL_RTC_ExitInitMode(RTC_TypeDef *RTCx)
  692. {
  693. /* Check the parameter */
  694. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  695. /* Disable initialization mode */
  696. LL_RTC_DisableInitMode(RTCx);
  697. return SUCCESS;
  698. }
  699. /**
  700. * @brief Waits until the RTC Time and Day registers (RTC_TR and RTC_DR) are
  701. * synchronized with RTC APB clock.
  702. * @note The RTC Resynchronization mode is write protected, use the
  703. * @ref LL_RTC_DisableWriteProtection before calling this function.
  704. * @note To read the calendar through the shadow registers after Calendar
  705. * initialization, calendar update or after wakeup from low power modes
  706. * the software must first clear the RSF flag.
  707. * The software must then wait until it is set again before reading
  708. * the calendar, which means that the calendar registers have been
  709. * correctly copied into the RTC_TR and RTC_DR shadow registers.
  710. * @param RTCx RTC Instance
  711. * @retval An ErrorStatus enumeration value:
  712. * - SUCCESS: RTC registers are synchronised
  713. * - ERROR: RTC registers are not synchronised
  714. */
  715. ErrorStatus LL_RTC_WaitForSynchro(RTC_TypeDef *RTCx)
  716. {
  717. __IO uint32_t timeout = RTC_SYNCHRO_TIMEOUT;
  718. ErrorStatus status = SUCCESS;
  719. uint32_t tmp;
  720. /* Check the parameter */
  721. assert_param(IS_RTC_ALL_INSTANCE(RTCx));
  722. /* Clear RSF flag */
  723. LL_RTC_ClearFlag_RS(RTCx);
  724. /* Wait the registers to be synchronised */
  725. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  726. while ((timeout != 0U) && (tmp != 0U))
  727. {
  728. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  729. {
  730. timeout--;
  731. }
  732. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  733. if (timeout == 0U)
  734. {
  735. status = ERROR;
  736. }
  737. }
  738. if (status != ERROR)
  739. {
  740. timeout = RTC_SYNCHRO_TIMEOUT;
  741. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  742. while ((timeout != 0U) && (tmp != 1U))
  743. {
  744. if (LL_SYSTICK_IsActiveCounterFlag() == 1U)
  745. {
  746. timeout--;
  747. }
  748. tmp = LL_RTC_IsActiveFlag_RS(RTCx);
  749. if (timeout == 0U)
  750. {
  751. status = ERROR;
  752. }
  753. }
  754. }
  755. return (status);
  756. }
  757. /**
  758. * @}
  759. */
  760. /**
  761. * @}
  762. */
  763. /**
  764. * @}
  765. */
  766. #endif /* defined(RTC) */
  767. /**
  768. * @}
  769. */
  770. #endif /* USE_FULL_LL_DRIVER */
  771. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/