[STM32H7] 【STM32H7S78-DK测评】-基础任务之rtc实验

[复制链接]
1447|2
 楼主| HuaWng 发表于 2024-10-12 12:38 | 显示全部楼层 |阅读模式
本帖最后由 HuaWng 于 2024-10-12 09:51 编辑

‌RTC的英文全称是‌Real-Time Clock‌,即实时时钟。它是一个独立的定时器,拥有连续计数的计数器,可以在相应软件配置下提供时钟日历的功能。通过修改计数器的值,可以重新设置系统当前的时间和日期。

借助于ST优异的生态,在STM32CubeIDE中可以方便的透过图形化配置界面来开启RTC 日历功能,包含了日期与时间。
Snipaste_2024-10-11_21-58-02.jpg

Snipaste_2024-10-11_22-55-37.png

自动生成的RTC初始化代码如下:
  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 = 127;
  15.   hrtc.Init.SynchPrediv = 255;
  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.   /* USER CODE END Check_RTC_BKUP */

  36.   /** Initialize RTC and set the Time and Date
  37.   */
  38.   sTime.Hours = 0x0;
  39.   sTime.Minutes = 0x0;
  40.   sTime.Seconds = 0x0;
  41.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  42.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  43.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
  48.   sDate.Month = RTC_MONTH_OCTOBER;
  49.   sDate.Date = 0x11;
  50.   sDate.Year = 0x24;

  51.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  52.   {
  53.     Error_Handler();
  54.   }
  55.   /* USER CODE BEGIN RTC_Init 2 */

  56.   /* USER CODE END RTC_Init 2 */

  57. }

在之前代码基础上,增加RTC时间,日期打印功能:
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     HAL_GPIO_TogglePin(LD1_GPIO_PORT, LD1_Pin);
  6.     /* Insert delay 100 ms */
  7.     //HAL_Delay(100);
  8.     HAL_GPIO_TogglePin(LD2_GPIO_PORT, LD2_PIN);
  9.     /* Insert delay 100 ms */
  10.     //HAL_Delay(100);
  11.     HAL_GPIO_TogglePin(LD3_GPIO_PORT, LD3_PIN);
  12.     /* Insert delay 100 ms */
  13.     //HAL_Delay(100);
  14.     HAL_GPIO_TogglePin(LD4_GPIO_PORT, LD4_PIN);
  15.     /* Insert delay 100 ms */
  16.     HAL_Delay(1000);

  17.     //HAL_UART_Transmit(&huart4, "\r\nHello 21ic, Hello STM32H7S78-DK!", sizeof("\r\nHello 21ic, Hello STM32H7S78-DK!"), 0xFFFF);
  18.     /* Get the RTC current Time */
  19.     HAL_RTC_GetTime(&hrtc, &RTC_MY_TIME, RTC_FORMAT_BIN);
  20.     /* Get the RTC current Date */
  21.     HAL_RTC_GetDate(&hrtc, &RTC_MY_DATE, RTC_FORMAT_BIN);

  22.     /* Display date Format : mm-dd-yyyy */
  23.     sprintf((char *)uart_dateStr, "\r\n%2d-%2d-%2d", 2000 + RTC_MY_DATE.Year, RTC_MY_DATE.Month, RTC_MY_DATE.Date);

  24.     /* Display time Format : hh:mm:ss */
  25.     sprintf((char *)uart_timeStr, " %2d:%2d:%2d", RTC_MY_TIME.Hours, RTC_MY_TIME.Minutes, RTC_MY_TIME.Seconds);

  26.     //HAL_UART_Transmit(&huart4, "\r\n", sizeof("\r\n"), 0xFFFF);
  27.     HAL_UART_Transmit(&huart4, uart_dateStr, sizeof(uart_dateStr), 0xFFFF);
  28.     //HAL_UART_Transmit(&huart4, "  ", sizeof("  "), 0xFFFF);
  29.     HAL_UART_Transmit(&huart4, uart_timeStr, sizeof(uart_timeStr), 0xFFFF);
  30.   }
  31.   /* USER CODE END 3 */
  32. }

下载到板子后,打开串口监视器,可以看到日期与时间正常打印出来!
rtc.gif

Amazingxixixi 发表于 2024-10-31 16:13 | 显示全部楼层
RTC需要做好晶振的选型。
地瓜patch 发表于 2024-10-31 18:35 来自手机 | 显示全部楼层
实时时钟唤醒待机模式很牛的功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

38

帖子

0

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