[STM32H7] 【STM32H7S78-DK测评】4、RTC时钟实验

[复制链接]
2252|6
 楼主| sujingliang 发表于 2024-9-8 21:38 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-9-9 08:16 编辑

目的
通过H7S7L8H6H RTC获取时间,并通过TouchGFX analogClock、digitalClock显示出来。


一、TouchGFX配置
gfx_rtc1.png
增加一个Screen,放置几个部件,其中包含:analogClock1、digitalClock1

F4->生成代码。

二、STM32CubeMX配置
配置RCC,高低速时钟均为外部时钟
MX_RTC.png
配置RTC:
MX_RTC1.png

MX_RTC2.png

生成代码

三、代码修改
1、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_MONDAY;
  48.   sDate.Month = RTC_MONTH_JANUARY;
  49.   sDate.Date = 0x1;
  50.   sDate.Year = 0x0;

  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. }
这两个变量设成全局了
  1. RTC_TimeTypeDef sTime = {0};
  2. RTC_DateTypeDef sDate = {0};


2、model.cpp

这里一定要加上:HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);,虽然没有用。不加,HAL_RTC_GetTime也无法获得时间。
  1. extern RTC_HandleTypeDef hrtc;
  2. extern RTC_TimeTypeDef sTime;
  3. extern RTC_DateTypeDef sDate;

  4. void Model::tick()
  5. {
  6.         static uint8_t tick=0;
  7.         tick++;

  8.         if(tick%60==0)
  9.         {
  10.                 HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
  11.                 HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
  12.                 modelListener->updateTime(sTime.Hours,sTime.Minutes,sTime.Seconds);
  13.                 printf( "%2d:%2d:%2d\r\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
  14.                 tick=0;
  15.         }
  16. }
3、ModelListener中增加virtual void updateTime(unsigned char newHours, unsigned char newMinutes, unsigned char newSeconds);
  1. #ifndef MODELLISTENER_HPP
  2. #define MODELLISTENER_HPP

  3. #include <gui/model/Model.hpp>

  4. class ModelListener
  5. {
  6. public:
  7.     ModelListener() : model(0) {}
  8.    
  9.     virtual ~ModelListener() {}
  10.                         
  11.                 virtual void uart4Updated();
  12.                
  13.                 virtual void updateTime(unsigned char newHours, unsigned char newMinutes, unsigned char newSeconds);

  14.     void bind(Model* m)
  15.     {
  16.         model = m;
  17.     }
  18. protected:
  19.     Model* model;
  20. };

  21. #endif // MODELLISTENER_HPP
4、Screen4Presenter中增加:
  1. void Screen4Presenter::updateTime(unsigned char newHours, unsigned char newMinutes, unsigned char newSeconds)
  2. {
  3.     view.updateTime(newHours, newMinutes, newSeconds);
  4. }
5、Screen4View中增加
  1. void Screen4View::updateTime(unsigned char newHours, unsigned char newMinutes, unsigned char newSeconds)
  2. {
  3.         analogClock1.setTime24Hour(newHours,newMinutes,newSeconds);
  4.         digitalClock1.setTime24Hour(newHours,newMinutes,newSeconds);
  5. }
6、HAL_RTC_MspInit中增加:HAL_PWR_EnableBkUpAccess();
  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.                 HAL_PWR_EnableBkUpAccess();
  8.   /* USER CODE END RTC_MspInit 0 */

四、效果
1、屏幕效果
微信图片_20240908213152.jpg
2、串口输出:
RTC1.png
3、视频:
tutieshi_480x270_5s.gif

五、总结
1、感谢南来之风 https://bbs.21ic.com/icview-3400954-1-1.html排雷,否则不知道要在RTC初始化卡多久。
2、TouchGFX CLOCK+RTC可以参考:https://www.bilibili.com/video/BV1pp421U7gK/?spm_id_from=333.337.search-card.all.click&vd_source=5b0f94f2f57c38a43471771787964a99
AdaMaYun 发表于 2024-9-9 16:12 | 显示全部楼层
TouchGFX配置是用什么软件?
呐咯密密 发表于 2024-9-9 17:22 | 显示全部楼层
这个TouchGFX Designer软件真不错
键盘手没手 发表于 2024-9-21 12:25 来自手机 | 显示全部楼层
通过H7S7L8H6H RTC获取时间
略略u 发表于 2024-9-21 12:48 来自手机 | 显示全部楼层
analogClock、digitalClock显示出来。
铁血丹心LLLL 发表于 2024-9-22 17:48 来自手机 | 显示全部楼层
analogClock、digitalClock中的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

147

帖子

3

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