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

解决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分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版