[STM32H7] 【STM32H7S78-DK测评】RTC日期与时间设置

[复制链接]
 楼主| SJZhu 发表于 2024-10-5 10:12 | 显示全部楼层 |阅读模式
<
RTC是非常实用的时间,日期功能模块,STM32H7S78-DK提供RTC功能,在使能RTC模块的同时,也使能UART串口打印功能,方便后期展示RTC数据。

5594667009b255b818.png

在图形化配置界面:
8968067009bb7e35f3.png

612086700a085b0ee7.png


点击保存,检查生成的代码:
  1. static void MX_UART4_Init(void)
  2. {

  3.   /* USER CODE BEGIN UART4_Init 0 */

  4.   /* USER CODE END UART4_Init 0 */

  5.   /* USER CODE BEGIN UART4_Init 1 */

  6.   /* USER CODE END UART4_Init 1 */
  7.   huart4.Instance = UART4;
  8.   huart4.Init.BaudRate = 115200;
  9.   huart4.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart4.Init.StopBits = UART_STOPBITS_1;
  11.   huart4.Init.Parity = UART_PARITY_NONE;
  12.   huart4.Init.Mode = UART_MODE_TX_RX;
  13.   huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart4.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  16.   huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  17.   huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  18.   if (HAL_UART_Init(&huart4) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN UART4_Init 2 */

  35.   /* USER CODE END UART4_Init 2 */

  36. }




  1. static void MX_RTC_Init(void)
  2. {

  3.   /* USER CODE BEGIN RTC_Init 0 */

  4.   /* USER CODE END RTC_Init 0 */

  5.   RTC_PrivilegeStateTypeDef privilegeState = {0};
  6.   RTC_TimeTypeDef sTime = {0};
  7.   RTC_DateTypeDef sDate = {0};

  8.   /* USER CODE BEGIN RTC_Init 1 */

  9.   /* USER CODE END RTC_Init 1 */

  10.   /** Initialize RTC Only
  11.   */
  12.   hrtc.Instance = RTC;
  13.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  14.   hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
  15.   hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;
  16.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  17.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  18.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  19.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  20.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  21.   hrtc.Init.BinMode = RTC_BINARY_NONE;
  22.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
  27.   privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
  28.   privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
  29.   privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
  30.   if (HAL_RTCEx_PrivilegeModeSet(&hrtc, &privilegeState) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }

  34.   /* USER CODE BEGIN Check_RTC_BKUP */

  35.   /* Set Date and Time (if not already done before)*/
  36.   /* Read the Back Up Register 0 Data */
  37.   if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
  38.   {
  39.     /* Configure RTC Calendar */
  40.   /* USER CODE END Check_RTC_BKUP */

  41.   /** Initialize RTC and set the Time and Date
  42.   */
  43.   sTime.Hours = 0x2;
  44.   sTime.Minutes = 0x0;
  45.   sTime.Seconds = 0x0;
  46.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  47.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  48.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  49.   {
  50.     Error_Handler();
  51.   }
  52.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  53.   sDate.Month = RTC_MONTH_NOVEMBER;
  54.   sDate.Date = 0x8;
  55.   sDate.Year = 0x0;

  56.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  57.   {
  58.     Error_Handler();
  59.   }
  60.   /* USER CODE BEGIN RTC_Init 2 */

  61.   /* Writes a data in a RTC Backup data Register0 */
  62.   HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
  63.   }
  64.   else
  65.   {
  66.     /* Check if the Power On Reset flag is set */
  67.     if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET)
  68.     {
  69.       /* Turn on LD2: Power on reset occurred */
  70.       BSP_LED_On(LD2);
  71.     }

  72.     /* Check if Pin Reset flag is set */
  73.     if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
  74.     {
  75.       /* Turn on LD2: External reset occurred */
  76.       BSP_LED_On(LD2);
  77.     }
  78.   }
  79.   /* Clear source Reset Flag */
  80.   __HAL_RCC_CLEAR_RESET_FLAGS();

  81.   /* USER CODE END RTC_Init 2 */

  82. }




重定向printf
  1. #ifdef __GNUC__
  2. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  3. #else
  4. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  5. #endif

  6. PUTCHAR_PROTOTYPE
  7. {
  8.   HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  9.   return ch;
  10. }



接下来打印日期与时间:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Display the current time and date.
  3.   * @param  showtime : pointer to buffer
  4.   * @param  showdate : pointer to buffer
  5.   * @retval None
  6.   */
  7. static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
  8. {
  9.   RTC_DateTypeDef sdatestructureget;
  10.   RTC_TimeTypeDef stimestructureget;

  11.   /* Get the RTC current Time */
  12.   HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  13.   /* Get the RTC current Date */
  14.   HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
  15.   /* Display time Format : hh:mm:ss */
  16.   sprintf((char *)showtime, "%2d:%2d:%2d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
  17.   /* Display date Format : mm-dd-yyyy */
  18.   sprintf((char *)showdate, "%2d-%2d-%2d", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);

  19.   printf("\r\n%s", showtime);
  20.   printf("\r\n%s", showdate);
  21. }


展示:
rtc.gif
Amazingxixixi 发表于 2024-10-31 16:16 | 显示全部楼层
不知道有没有备份电源
地瓜patch 发表于 2024-10-31 18:41 来自手机 | 显示全部楼层
rtc的误差多少?24小时能差1秒不
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部