你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

解决RTC时钟在TouchGFX中被切换时重置的问题

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
微信图片_20241227143242.png
之前项目里的时钟是用一个counter慢慢累加:
  1. void timeView::setupScreen()
  2. {
  3.     timeViewBase::setupScreen();
  4.     digitalHours = digitalClock1.getCurrentHour();
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
  6.     digitalSeconds = digitalClock1.getCurrentSecond();
  7. }


  8. void timeView::handleTickEvent()
  9. {
  10.     tickCounter++;

  11.     if (tickCounter % 60 == 0)
  12.     {
  13.         if (++digitalSeconds >= 60)
  14.         {
  15.             digitalSeconds = 0;
  16.             if (++digitalMinutes >= 60)
  17.             {
  18.                 digitalMinutes = 0;
  19.                 if (++digitalHours >= 24)
  20.                 {
  21.                     digitalHours = 0;
  22.                 }
  23.             }
  24.         }

  25.         // Update the clock
  26.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
  27.     }
  28. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
在RTC中使能并设定好时间:
微信图片_20241227142423.png
对应的程序也要需要重写一下:
首先要在modelListener.hpp里添加RTC相关函数:
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
  1. extern RTC_TimeTypeDef RTC_Time;
  2. extern RTC_DateTypeDef RTC_Date;
  3. extern RTC_HandleTypeDef hrtc;

  4. Model::Model() : modelListener(0)
  5. {

  6. }

  7. void Model::tick()
  8. {
  9.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
  10.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);

  11.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
  12. }
复制代码
不要忘了在time里也要再定义一次updateTime函数:
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
  2. {
  3.         view.updateTime(hour,minute,second);
  4. }
复制代码
对应的.hpp文件也要定义一次:
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
  1. void timeView::setupScreen()
  2. {
  3.     timeViewBase::setupScreen();
  4.     //digitalHours = digitalClock1.getCurrentHour();
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
  7. }


  8. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
  9. {
  10.          // Update the clock
  11.         digitalClock1.setTime24Hour(hour,minute,second);

  12.     tickCounter++;

  13.     if (tickCounter % 60 == 0)
  14.     {
  15.         if (++digitalSeconds >= 60)
  16.         {
  17.             digitalSeconds = 0;
  18.             if (++digitalMinutes >= 60)
  19.             {
  20.                 digitalMinutes = 0;
  21.                 if (++digitalHours >= 24)
  22.                 {
  23.                     digitalHours = 0;
  24.                 }
  25.             }
  26.         }
  27.         }


  28. }
复制代码
对应的,hpp里也要修改:
  1. #ifndef TIMEVIEW_HPP
  2. #define TIMEVIEW_HPP

  3. #include <gui_generated/time_screen/timeViewBase.hpp>
  4. #include <gui/time_screen/timePresenter.hpp>

  5. class timeView : public timeViewBase
  6. {
  7. public:
  8.     timeView();
  9.     virtual ~timeView() {}
  10.     virtual void setupScreen();
  11.     virtual void tearDownScreen();
  12.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
  13. protected:
  14.     int tickCounter;
  15.     int digitalHours;
  16.     int digitalMinutes;
  17.     int digitalSeconds;
  18. };

  19. #endif // TIMEVIEW_HPP
复制代码

这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。

最终效果:





收藏 评论0 发布时间:2024-12-27 14:44

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版