HAL_RTC.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /*
  2. ******************************************************************************
  3. * @file HAL_RTC.c
  4. * @version V1.0.0
  5. * @date 2020
  6. * @brief RTC HAL module driver.
  7. * This file provides firmware functions to manage the following
  8. * functionalities of the Real-Time Clock (RTC) peripheral:
  9. * + Initialization functions
  10. * + Time and Date configuration
  11. * + Alarm configuration
  12. * + WakeUp Timer configuration
  13. * + TimeStamp configuration
  14. * + Tampers configuration
  15. * + Backup Data Registers configuration
  16. * + RTC Tamper and TimeStamp Pins Selection
  17. * + Interrupts and flags management
  18. ******************************************************************************
  19. */
  20. #include "ACM32Fxx_HAL.h"
  21. /*********************************************************************************
  22. * Function : HAL_RTC_Config
  23. * Description : Initialize the RTC peripheral
  24. * Input :
  25. * Outpu :
  26. * Author : Chris_Kyle Data : 2020定
  27. **********************************************************************************/
  28. HAL_StatusTypeDef HAL_RTC_Config(RTC_ConfigTypeDef *hrtc)
  29. {
  30. #if (USE_FULL_ASSERT == 1)
  31. /* Check RTC Parameter */
  32. if (!IS_RTC_CLOCKSRC(hrtc->u32_ClockSource)) return HAL_ERROR;
  33. if (!IS_RTC_COMPENSATION(hrtc->u32_Compensation)) return HAL_ERROR;
  34. #endif
  35. /* RTC domain write enable */
  36. SCU->STOPCFG |= (1 << 0);
  37. PMU->CR1 |= RPMU_CR_RTCEN;
  38. switch (hrtc->u32_ClockSource)
  39. {
  40. case RTC_CLOCK_RC32K:
  41. {
  42. PMU->ANACR |= RPMU_ANACR_RC32K_EN;
  43. while(!(PMU->ANACR & RPMU_ANACR_RC32K_RDY));
  44. PMU->CR1 &= ~RTC_CLOCK_XTL;
  45. }break;
  46. case RTC_CLOCK_XTL:
  47. {
  48. PMU->ANACR = (PMU->ANACR & ~RPMU_ANACR_XTLDRV) | (RPMU_ANACR_XTLDRV_1 | RPMU_ANACR_XTLDRV_0);
  49. PMU->ANACR |= RPMU_ANACR_XTLEN;
  50. while(!(PMU->ANACR & RPMU_ANACR_XTLRDY));
  51. PMU->CR1 |= RTC_CLOCK_XTL;
  52. }break;
  53. default: break;
  54. }
  55. if (hrtc->u32_CompensationValue)
  56. {
  57. RTC->ADJUST = hrtc->u32_Compensation | hrtc->u32_CompensationValue;
  58. }
  59. return HAL_OK;
  60. }
  61. /*********************************************************************************
  62. * Function : HAL_RTC_SetTime
  63. * Description : Set RTC current time.
  64. * Input : fp_Time Pointer to Time structure.
  65. * Outpu :
  66. * Author : Chris_Kyle Data : 2020定
  67. **********************************************************************************/
  68. void HAL_RTC_SetTime(RTC_TimeTypeDef *fp_Time)
  69. {
  70. #if (USE_FULL_ASSERT == 1)
  71. /* Check RTC Parameter */
  72. if (!IS_RTC_HOUR(fp_Time->u8_Hours)) return;
  73. if (!IS_RTC_MIN(fp_Time->u8_Minutes)) return;
  74. if (!IS_RTC_SEC(fp_Time->u8_Seconds)) return;
  75. #endif
  76. /* Write-Protect Disable */
  77. RTC->WP = 0xCA53CA53;
  78. RTC->HOUR = fp_Time->u8_Hours;
  79. RTC->MIN = fp_Time->u8_Minutes;
  80. RTC->SEC = fp_Time->u8_Seconds;
  81. /* Write-Protect Enable */
  82. RTC->WP = 0;
  83. }
  84. /*********************************************************************************
  85. * Function : HAL_RTC_GetTime
  86. * Description : Get RTC current time.
  87. * Input : fp_Time Pointer to Time structure.
  88. * Outpu :
  89. * Author : Chris_Kyle Data : 2020定
  90. **********************************************************************************/
  91. void HAL_RTC_GetTime(RTC_TimeTypeDef *fp_Time)
  92. {
  93. fp_Time->u8_Hours = RTC->HOUR;
  94. fp_Time->u8_Minutes = RTC->MIN;
  95. fp_Time->u8_Seconds = RTC->SEC;
  96. }
  97. /*********************************************************************************
  98. * Function : HAL_RTC_SetDate
  99. * Description : Set RTC current Date.
  100. * Input : fp_Date Pointer to Date structure.
  101. * Outpu :
  102. * Author : Chris_Kyle Data : 2020定
  103. **********************************************************************************/
  104. void HAL_RTC_SetDate(RTC_DateTypeDef *fp_Date)
  105. {
  106. #if (USE_FULL_ASSERT == 1)
  107. /* Check RTC Parameter */
  108. if (!IS_RTC_YEAR(fp_Date->u8_Year)) return;
  109. if (!IS_RTC_MONTH(fp_Date->u8_Month)) return;
  110. if (!IS_RTC_DAY(fp_Date->u8_Date)) return;
  111. if (!IS_RTC_WEEKDAY(fp_Date->u8_WeekDay)) return;
  112. #endif
  113. /* Write-Protect Disable */
  114. RTC->WP = 0xCA53CA53;
  115. RTC->YEAR = fp_Date->u8_Year;
  116. RTC->MONTH = fp_Date->u8_Month;
  117. RTC->DATE = fp_Date->u8_Date;
  118. RTC->WEEK = fp_Date->u8_WeekDay;
  119. /* Write-Protect Enable */
  120. RTC->WP = 0;
  121. }
  122. /*********************************************************************************
  123. * Function : HAL_RTC_GetDate
  124. * Description : Get RTC current Date.
  125. * Input : fp_Date Pointer to Date structure.
  126. * Outpu :
  127. * Author : Chris_Kyle Data : 2020定
  128. **********************************************************************************/
  129. void HAL_RTC_GetDate(RTC_DateTypeDef *fp_Date)
  130. {
  131. fp_Date->u8_Year = RTC->YEAR;
  132. fp_Date->u8_Month = RTC->MONTH;
  133. fp_Date->u8_Date = RTC->DATE;
  134. fp_Date->u8_WeekDay = RTC->WEEK;
  135. }
  136. /*********************************************************************************
  137. * Function : HAL_RTC_AlarmConfig
  138. * Description : Alarm Config
  139. * Input : fp_Alarm Pointer to ALarm structure.
  140. * Outpu :
  141. * Author : Chris_Kyle Data : 2020定
  142. **********************************************************************************/
  143. void HAL_RTC_AlarmConfig(RTC_AlarmTypeDef *fp_Alarm)
  144. {
  145. uint32_t lu32_WeekDay;
  146. #if (USE_FULL_ASSERT == 1)
  147. /* Check RTC Parameter */
  148. if (!IS_RTC_ALARM_MODE(fp_Alarm->u32_AlarmMode)) return;
  149. if (!IS_RTC_ALARM_INT(fp_Alarm->u32_AlarmInterrupt)) return;
  150. if (!IS_RTC_ALARM_DAY_MASK(fp_Alarm->u32_DayMask)) return;
  151. if (!IS_RTC_ALARM_HOUR_MASK(fp_Alarm->u32_HourMask)) return;
  152. if (!IS_RTC_ALARM_MIN_MASK(fp_Alarm->u32_MinMask)) return;
  153. if (fp_Alarm->u32_AlarmMode == RTC_ALARM_WEEK_MODE)
  154. {
  155. if (!IS_RTC_ALARM_WEEKDAY(fp_Alarm->u32_AlarmWeek)) return;
  156. }
  157. else
  158. {
  159. if (!IS_RTC_DAY(fp_Alarm->u32_AlarmDay)) return;
  160. }
  161. if (!IS_RTC_HOUR(fp_Alarm->u32_Hours)) return;
  162. if (!IS_RTC_MIN(fp_Alarm->u32_Minutes)) return;
  163. if (!IS_RTC_SEC(fp_Alarm->u32_Seconds)) return;
  164. #endif
  165. if (fp_Alarm->u32_AlarmMode == RTC_ALARM_WEEK_MODE)
  166. {
  167. lu32_WeekDay = fp_Alarm->u32_AlarmWeek;
  168. }
  169. else
  170. {
  171. lu32_WeekDay = fp_Alarm->u32_AlarmDay;
  172. }
  173. /* Coinfig Week/Day、Hour、Min、Sec */
  174. RTC->ALM = fp_Alarm->u32_AlarmMode | lu32_WeekDay | fp_Alarm->u32_Hours << 16 | fp_Alarm->u32_Minutes << 8 | fp_Alarm->u32_Seconds;
  175. /* Interrupt Enable */
  176. if (RTC_ALARM_INT_ENABLE == fp_Alarm->u32_AlarmInterrupt)
  177. {
  178. RTC->IE |= RTC_IE_ALM;
  179. }
  180. RTC->CR |= (fp_Alarm->u32_DayMask) ? RTC_ALARM_DAY_MASK_ENABLE : RTC_ALARM_DAY_MASK_DISABLE;
  181. RTC->CR |= (fp_Alarm->u32_HourMask) ? RTC_ALARM_HOUR_MASK_ENABLE : RTC_ALARM_HOUR_MASK_DISABLE;
  182. RTC->CR |= (fp_Alarm->u32_MinMask) ? RTC_ALARM_MIN_MASK_ENABLE : RTC_ALARM_MIN_MASK_DISABLE;
  183. }
  184. /*********************************************************************************
  185. * Function : HAL_RTC_AlarmEnable
  186. * Description : Alarm Enable
  187. * Input :
  188. * Outpu :
  189. * Author : Chris_Kyle Data : 2020定
  190. **********************************************************************************/
  191. void HAL_RTC_AlarmEnable(void)
  192. {
  193. RTC->CR |= RTC_CR_ALM_EN;
  194. }
  195. /*********************************************************************************
  196. * Function : HAL_RTC_AlarmDisable
  197. * Description : Alarm Disable
  198. * Input :
  199. * Outpu :
  200. * Author : Chris_Kyle Data : 2020定
  201. **********************************************************************************/
  202. void HAL_RTC_AlarmDisable(void)
  203. {
  204. RTC->CR &= ~RTC_CR_ALM_EN;
  205. }
  206. /*********************************************************************************
  207. * Function : HAL_RTC_Tamper
  208. * Description : Temper1 use PC13、Temper2 use PA0
  209. * Input :
  210. * Outpu :
  211. * Author : Chris_Kyle Data : 2020定
  212. **********************************************************************************/
  213. void HAL_RTC_Tamper(enum_Temper_t fe_Temper, RTC_TemperTypeDef *fp_Temper)
  214. {
  215. #if (USE_FULL_ASSERT == 1)
  216. /* Check RTC Parameter */
  217. if (!IS_RTC_TEMP_EDGE(fp_Temper->u32_TemperEdge)) return;
  218. if (!IS_RTC_TEMP_INT(fp_Temper->u32_InterruptEN)) return;
  219. if (!IS_RTC_TEMP_CLEAR_BACKUP(fp_Temper->u32_ClearBackup)) return;
  220. if (!IS_RTC_TEMP_FILTER(fp_Temper->u32_Filter)) return;
  221. #endif
  222. switch (fe_Temper)
  223. {
  224. case RTC_TEMPER_1:
  225. {
  226. PMU->IOCR &= ~0x40; // Configure PC13 as digital IO
  227. PMU->IOSEL |= 0x02; // Configure PC13 as tamper function
  228. /* Clear Config */
  229. RTC->CR &= ~(RTC_CR_TAMP1RCLR | RTC_CR_TAMP1FCLR | RTC_CR_TAMP1FLTEN | RTC_CR_TAMP1FLT | RTC_CR_TS1EDGE | RTC_CR_TAMPFLTCLK);
  230. /* Edge select */
  231. RTC->CR |= fp_Temper->u32_TemperEdge ? RTC_CR_TS1EDGE : 0x00;
  232. /* Auto clear backup register */
  233. if (fp_Temper->u32_ClearBackup)
  234. {
  235. RTC->CR |= fp_Temper->u32_TemperEdge ? RTC_CR_TAMP1FCLR : RTC_CR_TAMP1RCLR;
  236. }
  237. /* Temper filter */
  238. if (fp_Temper->u32_Filter)
  239. {
  240. if (fp_Temper->u32_Filter == RTC_TEMP_FILTER_512_RTCCLK)
  241. {
  242. RTC->CR |= RTC_CR_TAMPFLTCLK;
  243. }
  244. else
  245. {
  246. RTC->CR |= (fp_Temper->u32_Filter - 2) << 13;
  247. }
  248. }
  249. RTC->CR |= RTC_CR_TAMP1EN;
  250. System_Delay(2000);
  251. RTC->SR |= (RTC_SR_STP1FIE|RTC_SR_STP1RIE);
  252. RTC->IE &= (~(RTC_IE_STP1FIE|RTC_IE_STP1RIE));
  253. /* Put Temper Interrupt enable here !!!*/
  254. if (fp_Temper->u32_InterruptEN)
  255. {
  256. RTC->IE |= fp_Temper->u32_TemperEdge ? RTC_IE_STP1FIE : RTC_IE_STP1RIE;
  257. }
  258. }break;
  259. case RTC_TEMPER_2:
  260. {
  261. /* Clear Config */
  262. RTC->CR &= ~(RTC_CR_TAMP2RCLR | RTC_CR_TAMP2FCLR | RTC_CR_TAMP2FLTEN | RTC_CR_TAMP2FLT | RTC_CR_TS2EDGE | RTC_CR_TAMPFLTCLK);
  263. /* Edge select */
  264. RTC->CR |= fp_Temper->u32_TemperEdge ? RTC_CR_TS2EDGE : 0x00;
  265. /* Auto clear backup register */
  266. if (fp_Temper->u32_ClearBackup)
  267. {
  268. RTC->CR |= fp_Temper->u32_TemperEdge ? RTC_CR_TAMP2FCLR : RTC_CR_TAMP2RCLR;
  269. }
  270. /* Temper filter */
  271. if (fp_Temper->u32_Filter)
  272. {
  273. if (fp_Temper->u32_Filter == RTC_TEMP_FILTER_512_RTCCLK)
  274. {
  275. RTC->CR |= RTC_CR_TAMPFLTCLK;
  276. }
  277. else
  278. {
  279. RTC->CR |= (fp_Temper->u32_Filter - 2) << 19;
  280. }
  281. }
  282. RTC->CR |= RTC_CR_TAMP2EN;
  283. System_Delay(2000);
  284. RTC->SR |= (RTC_SR_STP2FIE|RTC_SR_STP2RIE);
  285. RTC->IE &= (~(RTC_IE_STP2FIE|RTC_IE_STP2RIE));
  286. /* Temper Interrupt */
  287. if (fp_Temper->u32_InterruptEN)
  288. {
  289. RTC->IE |= fp_Temper->u32_TemperEdge ? RTC_IE_STP2FIE : RTC_IE_STP2RIE;
  290. }
  291. }break;
  292. default: break;
  293. }
  294. }
  295. /*********************************************************************************
  296. * Function : HAL_RTC_TamperEnable
  297. * Description :
  298. * Input :
  299. * Outpu :
  300. * Author : Chris_Kyle Data : 2020定
  301. **********************************************************************************/
  302. void HAL_RTC_TamperEnable(enum_Temper_t fe_Temper)
  303. {
  304. if (fe_Temper == RTC_TEMPER_1)
  305. {
  306. RTC->CR |= RTC_CR_TAMP1EN;
  307. }
  308. else
  309. {
  310. RTC->CR |= RTC_CR_TAMP2EN;
  311. }
  312. }
  313. /*********************************************************************************
  314. * Function : HAL_RTC_TamperDisable
  315. * Description :
  316. * Input :
  317. * Outpu :
  318. * Author : Chris_Kyle Data : 2020定
  319. **********************************************************************************/
  320. void HAL_RTC_TamperDisable(enum_Temper_t fe_Temper)
  321. {
  322. if (fe_Temper == RTC_TEMPER_1)
  323. {
  324. RTC->CR &= ~RTC_CR_TAMP1EN;
  325. }
  326. else
  327. {
  328. RTC->CR &= ~RTC_CR_TAMP2EN;
  329. }
  330. }
  331. /***************************************************************************************************
  332. * Function : HAL_RTC_Standby_Wakeup
  333. * Description : wakeup source select
  334. * Input : fu32_Edge 0: Rising edge
  335. * 1: Falling edge
  336. * fe_Wakeup : wakeup source select, STANDBY_WAKEUP_RISING, STANDBY_WAKEUP_FALLING
  337. * Outpu :
  338. * Author : Chris_Kyle Data : 2020定
  339. *******************************************************************************************************/
  340. void HAL_RTC_Standby_Wakeup(enum_WKUP_t fe_Wakeup, uint32_t fu32_Edge)
  341. {
  342. switch (fe_Wakeup)
  343. {
  344. case RTC_WAKEUP_WKUP1:
  345. case RTC_WAKEUP_WKUP2:
  346. case RTC_WAKEUP_WKUP3:
  347. case RTC_WAKEUP_WKUP4:
  348. case RTC_WAKEUP_WKUP5:
  349. case RTC_WAKEUP_WKUP6:
  350. {
  351. /* Clear flags、Standby Enable */
  352. PMU->CR1 |= RPMU_CR_STB_EN | RPMU_CR_CWUF | RPMU_CR_CSBF;
  353. /* Wakeup IO Filter Enable */
  354. PMU->CR1 |= fe_Wakeup << 8;
  355. /* Wakeup IO Enable */
  356. PMU->CR1 |= fe_Wakeup;
  357. if (fe_Wakeup == RTC_WAKEUP_WKUP2)
  358. {
  359. /* PC13 */
  360. PMU->IOCR &= ~0x40; // must configure PC13 as digital function
  361. }
  362. if (fu32_Edge)
  363. {
  364. PMU->CR2 |= fe_Wakeup >> 16;
  365. }
  366. else
  367. {
  368. PMU->CR2 &= ~(fe_Wakeup >> 16);
  369. }
  370. PMU->CR1 |= RPMU_CR_CWUF; // clear wakeup flag
  371. System_Enter_Standby_Mode();
  372. }break;
  373. case RTC_WAKEUP_STAMP2:
  374. case RTC_WAKEUP_STAMP1:
  375. case RTC_WAKEUP_32S:
  376. case RTC_WAKEUP_SEC:
  377. case RTC_WAKEUP_MIN:
  378. case RTC_WAKEUP_HOUR:
  379. case RTC_WAKEUP_DATE:
  380. {
  381. /* Clear flags、Standby Enable */
  382. PMU->CR1 |= RPMU_CR_STB_EN | RPMU_CR_CWUF | RPMU_CR_CSBF;
  383. RTC->SR |= fe_Wakeup;
  384. RTC->IE |= fe_Wakeup;
  385. System_Enter_Standby_Mode();
  386. }break;
  387. default: break;
  388. }
  389. }
  390. /*********************************************************************************
  391. * Function : HAL_RTC_GetStandbyStatus
  392. * Description : Check MCU have entered standby mode
  393. * Input :
  394. * Outpu : 0: Not Enter Standby Mode
  395. 1: Entered Standby Mode
  396. * Author : Chris_Kyle Data : 2020
  397. **********************************************************************************/
  398. bool HAL_RTC_Get_StandbyStatus(void)
  399. {
  400. if (PMU->SR & RPMU_SR_SBF)
  401. {
  402. return true;
  403. }
  404. else
  405. {
  406. return false;
  407. }
  408. }
  409. /*********************************************************************************
  410. * Function : HAL_RTC_Get_StandbyWakeupSource
  411. * Description : Get MCU Standby Wakeup Source
  412. * Input :
  413. * Outpu : RTC_WAKEUP_SOURCE_BORWUF
  414. RTC_WAKEUP_SOURCE_IWDTWUF
  415. RTC_WAKEUP_SOURCE_RSTWUF
  416. RTC_WAKEUP_SOURCE_RTCWUF
  417. RTC_WAKEUP_SOURCE_WKUP6
  418. RTC_WAKEUP_SOURCE_WKUP5
  419. RTC_WAKEUP_SOURCE_WKUP4
  420. RTC_WAKEUP_SOURCE_WKUP3
  421. RTC_WAKEUP_SOURCE_WKUP2
  422. RTC_WAKEUP_SOURCE_WKUP1
  423. * Author : Chris_Kyle Data : 2020
  424. **********************************************************************************/
  425. uint32_t HAL_RTC_Get_StandbyWakeupSource(void)
  426. {
  427. return PMU->SR;
  428. }