rtc.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file rtc.c
  5. * @brief This file provides code for the configuration
  6. * of the RTC instances.
  7. ******************************************************************************
  8. * @attention
  9. *
  10. * Copyright (c) 2024 STMicroelectronics.
  11. * All rights reserved.
  12. *
  13. * This software is licensed under terms that can be found in the LICENSE file
  14. * in the root directory of this software component.
  15. * If no LICENSE file comes with this software, it is provided AS-IS.
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "rtc.h"
  22. /* USER CODE BEGIN 0 */
  23. /* USER CODE END 0 */
  24. RTC_HandleTypeDef hrtc;
  25. /* RTC init function */
  26. void MX_RTC_Init(void)
  27. {
  28. /* USER CODE BEGIN RTC_Init 0 */
  29. //RTC_TimeTypeDef time; //时间结构体参数
  30. RTC_DateTypeDef datebuff; //日期结构体参数
  31. /* USER CODE END RTC_Init 0 */
  32. RTC_TimeTypeDef sTime = {0};
  33. RTC_DateTypeDef DateToUpdate = {0};
  34. /* USER CODE BEGIN RTC_Init 1 */
  35. __HAL_RCC_BKP_CLK_ENABLE(); //开启后备区域时钟
  36. __HAL_RCC_PWR_CLK_ENABLE(); //开启电源时钟
  37. /* USER CODE END RTC_Init 1 */
  38. /** Initialize RTC Only
  39. */
  40. hrtc.Instance = RTC;
  41. hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  42. hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
  43. if (HAL_RTC_Init(&hrtc) != HAL_OK)
  44. {
  45. Error_Handler();
  46. }
  47. /* USER CODE BEGIN Check_RTC_BKUP */
  48. if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
  49. {
  50. /* USER CODE END Check_RTC_BKUP */
  51. /** Initialize RTC and set the Time and Date */
  52. sTime.Hours = 0x13;
  53. sTime.Minutes = 0x0;
  54. sTime.Seconds = 0x0;
  55. if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  56. {
  57. Error_Handler();
  58. }
  59. DateToUpdate.WeekDay = RTC_WEEKDAY_THURSDAY;
  60. DateToUpdate.Month = RTC_MONTH_JANUARY;
  61. DateToUpdate.Date = 0x18;
  62. DateToUpdate.Year = 0x23;
  63. if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  64. {
  65. Error_Handler();
  66. }
  67. /* USER CODE BEGIN RTC_Init 2 */
  68. __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启RTC时钟秒中断
  69. datebuff = DateToUpdate; //把日期数据拷贝到自己定义的data中
  70. HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//向指定的后备区域寄存器写入数据
  71. HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)datebuff.Year);
  72. HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)datebuff.Month);
  73. HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)datebuff.Date);
  74. HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)datebuff.WeekDay);
  75. }
  76. else
  77. {
  78. datebuff.Year = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);
  79. datebuff.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
  80. datebuff.Date = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
  81. datebuff.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
  82. DateToUpdate = datebuff;
  83. if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
  84. {
  85. Error_Handler();
  86. }
  87. __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启RTC时钟秒中断
  88. }
  89. /* USER CODE END RTC_Init 2 */
  90. }
  91. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
  92. {
  93. if(rtcHandle->Instance==RTC)
  94. {
  95. /* USER CODE BEGIN RTC_MspInit 0 */
  96. /* USER CODE END RTC_MspInit 0 */
  97. HAL_PWR_EnableBkUpAccess();
  98. /* Enable BKP CLK enable for backup registers */
  99. __HAL_RCC_BKP_CLK_ENABLE();
  100. /* RTC clock enable */
  101. __HAL_RCC_RTC_ENABLE();
  102. /* RTC interrupt Init */
  103. HAL_NVIC_SetPriority(RTC_IRQn, 5, 0);
  104. HAL_NVIC_EnableIRQ(RTC_IRQn);
  105. /* USER CODE BEGIN RTC_MspInit 1 */
  106. /* USER CODE END RTC_MspInit 1 */
  107. }
  108. }
  109. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
  110. {
  111. if(rtcHandle->Instance==RTC)
  112. {
  113. /* USER CODE BEGIN RTC_MspDeInit 0 */
  114. /* USER CODE END RTC_MspDeInit 0 */
  115. /* Peripheral clock disable */
  116. __HAL_RCC_RTC_DISABLE();
  117. /* RTC interrupt Deinit */
  118. HAL_NVIC_DisableIRQ(RTC_IRQn);
  119. /* USER CODE BEGIN RTC_MspDeInit 1 */
  120. /* USER CODE END RTC_MspDeInit 1 */
  121. }
  122. }
  123. /* USER CODE BEGIN 1 */
  124. /* USER CODE END 1 */