[STM32H7] 【STM32H7S78-DK测评】-3- RTC模块测试

[复制链接]
1174|2
 楼主| 南来之风 发表于 2024-9-7 22:19 | 显示全部楼层 |阅读模式
本帖最后由 南来之风 于 2024-9-7 22:21 编辑

STM32的RTC指的是实时时钟(Real-Time Clock),它是一种用于计时和日期记录的硬件模块。在STM32微控制器中,RTC模块是由一个32位的计数器和一组用于保存日期和时间的寄存器组成的。

RTC模块具有很高的精度和稳定性,并且能够在微控制器断电时继续运行,从而保持准确的时间和日期信息。它通常用于需要精确定时和实时数据记录的应用场景,例如时钟、日历、定时器、闹钟、数据采集等。

STM32的RTC模块提供了一系列的功能,包括时钟频率配置、时间和日期的设置与读取、闹钟的设置与触发、定时器功能、中断控制等。通过配置和使用RTC模块,开发者可以实现各种与时间相关的功能和应用。

在STM32CubeIDE中配置使用RTC模块也是非常便捷的。

1.png

2.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_YES;
  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 = 0x21;
  39.   sTime.Minutes = 0x27;
  40.   sTime.Seconds = 0x40;
  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_SATURDAY;
  48.   sDate.Month = RTC_MONTH_SEPTEMBER;
  49.   sDate.Date = 0x7;
  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. }



不过在运行过程中总是遇到错误,后来调试发现是在函数HAL_StatusTypeDef RTC_EnterInitMode(RTC_HandleTypeDef *hrtc) 执行过程中,初始化状态竟然返回HAL_TIMEOUT.


如下单步调试可以发现:SET_BIT(RTC->ICSR, RTC_ICSR_INIT);执行后,寄存器的初始化位并没有被置1.
3.png

后面在参考手册中找到:
4.png

所以解决办法:在RTC进入初始化状态之前会调用HAL_RTC_MspInit(hrtc);
6.png
所以进入到这个函数内部,添加一行语句使能写RTC寄存器。完整的代码如下
  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
  2. {
  3.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  4.   if(hrtc->Instance==RTC)
  5.   {
  6.   /* USER CODE BEGIN RTC_MspInit 0 */
  7.         /* Enables access to the backup domain */
  8.         HAL_PWR_EnableBkUpAccess();
  9.   /* USER CODE END RTC_MspInit 0 */

  10.   /** Initializes the peripherals clock
  11.   */
  12.     PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  13.     PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  14.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  15.     {
  16.       Error_Handler();
  17.     }

  18.     /* Peripheral clock enable */
  19.     __HAL_RCC_RTC_ENABLE();
  20.     __HAL_RCC_RTCAPB_CLK_ENABLE();
  21.   /* USER CODE BEGIN RTC_MspInit 1 */

  22.   /* USER CODE END RTC_MspInit 1 */

  23.   }

  24. }
接下来,正常编译,运行,一切OK。

7.png

实物展示:
rtc.gif

参考资料:
Getting started with RTC  https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Getting_started_with_RTC



Amazingxixixi 发表于 2024-10-31 16:00 | 显示全部楼层
有时候RTC的晶振选择非常重要,有的时候启动不了,需要修改匹配电容。
地瓜patch 发表于 2024-10-31 17:59 来自手机 | 显示全部楼层
用过rtc唤醒待机模式下的低功耗,定时唤醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

293

帖子

2

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