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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
! q& t- M% I) X4 F7 R, x([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))7 Q# `7 r. _3 s; t$ F  o4 \0 }
微信图片_20241227143242.png
1 m4 g; M% z' h$ c% A# n! t+ a: ?之前项目里的时钟是用一个counter慢慢累加:
1 c& {5 U6 i/ o
  1. void timeView::setupScreen()
    # s! G# f. X9 W9 v; F0 c8 V2 t
  2. {4 n8 K( L% e1 z& }% `; t& l& m! u' D
  3.     timeViewBase::setupScreen();
    $ b6 j: r* O" x. U! {& @
  4.     digitalHours = digitalClock1.getCurrentHour();2 p8 h' }$ m) q5 T' v2 p2 x; R
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    " y7 w3 B$ l" h
  6.     digitalSeconds = digitalClock1.getCurrentSecond();2 z/ R! \% D( N- S, X) j  V: P: p
  7. }
    " ?7 s' v: J* H5 i# k% m

  8. / o$ q+ ^- }  f& E+ [# y
  9. 3 W) d3 _# G" Q) u  D
  10. void timeView::handleTickEvent()! V( I6 c1 B) z8 _" S6 A
  11. {
    0 P6 ^$ O2 M" d+ f4 g
  12.     tickCounter++;
    . r5 m7 Q4 @7 p  a8 _

  13. 6 m4 w2 X3 r" G0 ~; d
  14.     if (tickCounter % 60 == 0)) g9 M1 t" e- P1 z" l
  15.     {( L: Z5 s% I# J' _& g, e7 K% |" S% i
  16.         if (++digitalSeconds >= 60)4 A9 ~4 m/ R4 y. @
  17.         {- z( K" `1 G" f- k0 u9 ]9 b
  18.             digitalSeconds = 0;; q4 O+ ~/ k3 n- v. K- A
  19.             if (++digitalMinutes >= 60)3 e6 Z! C% C* @- A- d6 O
  20.             {
    % c. W2 Q2 [# b% {9 P
  21.                 digitalMinutes = 0;
    : p! U& C( d: M6 B3 m
  22.                 if (++digitalHours >= 24)
    / K( X4 w* e7 \9 i6 o) \
  23.                 {: L- f8 ]1 d' P. ^  ]' t6 n
  24.                     digitalHours = 0;
    9 g( Z6 B. g/ c/ u/ `
  25.                 }- E- b% t7 i3 d  D2 M2 v
  26.             }
      A6 e5 ~: H4 R* s: e) m$ G
  27.         }, g0 z+ \. Y4 {. J! z$ ^0 h* o$ T: q
  28. " s7 F. X4 t8 T' U4 s% ^
  29.         // Update the clock
      G7 L& @% c! A' A* E; X. P
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);7 e! S' n* j* h8 U( u+ w) Q+ z) `7 H, u
  31.     }# \( m" Z7 t& Y0 g/ l& V) y
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
8 t0 ]" P( k. b$ y0 m4 u$ }: x项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。8 o- e# d; A; o5 Y
在RTC中使能并设定好时间:& z7 v2 {2 F/ c) g* i
微信图片_20241227142423.png
( I+ Z& ~4 p, R% u0 K对应的程序也要需要重写一下:
7 P8 D  F0 w6 g5 k+ e0 o首先要在modelListener.hpp里添加RTC相关函数:
9 O4 r9 \; P1 R" S# L
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
; ]$ e5 O6 n3 H1 q0 @8 p
  1. extern RTC_TimeTypeDef RTC_Time;  l3 |; X. z9 {# F% L4 v
  2. extern RTC_DateTypeDef RTC_Date;
    ' d# z6 [$ x4 L- ~; E. z
  3. extern RTC_HandleTypeDef hrtc;/ q* i. v7 l. a0 Q3 O3 A' v
  4. 2 `% h& c, A. J" U; w# z7 e2 j0 Q" ^
  5. Model::Model() : modelListener(0)
    ! U) f5 J/ D3 H& d. @# Q& u/ g
  6. {
    : M+ n, [) r/ ^4 @
  7. 1 m1 ^# I4 ]! a$ k  B$ v
  8. }
    4 c, A& {2 E1 D* l: K
  9. ' U& a& ^! P* Q# o9 `
  10. void Model::tick()9 t( S# v. v! Q& a% M7 ^) Q- A
  11. {! D) z9 ~) }9 ]
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);# d9 ~$ i6 ~( Y. b4 ^4 q) n/ K; ]
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);* a* x0 D; k: O/ k

  14. - ^8 y2 k: K& a
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);$ P/ A! P  ^3 L* Y# a
  16. }4 Q* ], B& A- ~+ x( c
复制代码
不要忘了在time里也要再定义一次updateTime函数:/ H$ b6 I/ U) h6 h3 U, b$ \
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)! x  P( {" {) B% C  L
  2. {7 ?: o! b3 w5 z3 V1 K8 y: @
  3.         view.updateTime(hour,minute,second);7 x! S8 ?8 J* T7 H+ r3 P: p
  4. }
    : N& e8 ~0 Q0 _0 P4 `' V. s6 j& Z
复制代码
对应的.hpp文件也要定义一次:
& F; }; d2 }4 u) P! ~, I
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);- I& r2 T& w) v5 B7 P( w
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
  M9 r: A4 Q1 X& E' @
  1. void timeView::setupScreen()
    / X$ Q# w. ~# `
  2. {
    0 v. c8 L( _( p) ]/ l. f5 q
  3.     timeViewBase::setupScreen();
    ) V, D, l4 |  q/ n# r2 @: O
  4.     //digitalHours = digitalClock1.getCurrentHour();
    ) V  ~1 y1 B& w* P- N, _, q
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();' B8 @" K( }6 x0 }( S
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();) w$ Y) Z  r' b% i
  7. }8 |) D' B; d" C- c9 ?* _
  8. ' U: v6 h1 @2 {+ ~( t' {
  9. 1 R6 d5 |; @9 m
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    ! l! A" t. ^9 `5 E, L" I
  11. {* S7 ^6 p" d3 r) y
  12.          // Update the clock
    ( G+ K% t2 l* l
  13.         digitalClock1.setTime24Hour(hour,minute,second);
    # a' X) h; P& Z& P! }% r! i" F9 K

  14. 5 ]3 w  y5 Y8 t* V
  15.     tickCounter++;
    - }5 w. p) D: O- c2 d+ a
  16. 5 A6 D) z6 ^. M- ?$ e
  17.     if (tickCounter % 60 == 0)
    ' w# N2 v/ Z5 Y0 ^' H$ Q6 |
  18.     {& [( T4 ~7 d# a5 y2 i7 O3 f& H
  19.         if (++digitalSeconds >= 60); y3 o7 j9 v& D( T8 z* s2 c: q
  20.         {
    ; A. h6 r  P, z9 w7 e4 W1 [
  21.             digitalSeconds = 0;
    0 Q0 K5 t' e- D$ Z1 T. i
  22.             if (++digitalMinutes >= 60)' E  Z4 f: Z1 ~( X% o. ?" i
  23.             {
    5 s- j+ P* x! Z: X+ e
  24.                 digitalMinutes = 0;) O/ l& C" D) O
  25.                 if (++digitalHours >= 24): T4 t( Y  ?6 n8 v4 _- ^; E7 \3 g  X
  26.                 {( I: I& h7 `. {1 g$ g  k1 [
  27.                     digitalHours = 0;
    4 S7 }. }0 s1 x: J9 f6 c& f
  28.                 }
    8 J& e9 l% _1 ^
  29.             }
    , H# U2 \7 w+ W8 U
  30.         }2 M" ^4 ?9 e/ a% r5 h3 R
  31.         }: v" ]* h+ C# d0 R) K- J) e
  32. 4 m) `' E; M8 F! Z/ s9 U% |
  33. & t6 C' k0 @- L+ }; `) v/ k: n
  34. }
复制代码
对应的,hpp里也要修改:1 H' L$ U+ I# Q+ i, K: }0 @
  1. #ifndef TIMEVIEW_HPP; R' v* p3 x- H4 g% Q5 K
  2. #define TIMEVIEW_HPP
    & U( j1 u% P8 s: Z9 Q5 x( U+ Z4 i

  3. 3 s3 E  B4 R* m4 W2 w" ?9 I9 ~
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    $ b# ~6 ?' m8 v' U
  5. #include <gui/time_screen/timePresenter.hpp>7 C+ m+ k: D6 O6 `* Z& T
  6. , ~/ }( Z6 p  i/ q
  7. class timeView : public timeViewBase
    . C' r8 D3 i1 g  @* P- Z/ {
  8. {
    3 s# w- p; f4 b2 w! K: q/ ]
  9. public:1 w& }8 B# Y, d* O  _
  10.     timeView();4 c% a" y2 h' E( {( a
  11.     virtual ~timeView() {}9 H0 P) b. r+ Z0 c
  12.     virtual void setupScreen();
    5 d+ n* _/ F. c
  13.     virtual void tearDownScreen();
    7 c( J* f4 r# s! C6 Z+ F
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);! G7 d- D/ O( a
  15. protected:' L& h1 S5 u# B7 ]$ P: k
  16.     int tickCounter;$ y- l& q9 j6 r: H
  17.     int digitalHours;
    4 W+ P" f" h0 f' g6 N, {. M
  18.     int digitalMinutes;
    + l2 R$ s3 p( H& z* q* M$ [
  19.     int digitalSeconds;
    , p+ S5 P# q, q
  20. };7 D3 z; N# O# _

  21. " k! s5 j) `, t& C
  22. #endif // TIMEVIEW_HPP/ j5 }" }' G4 X6 u0 u! e
复制代码
3 M6 ~# H& X) P% W; w7 c
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
- _% D, ?' g2 T0 e3 v- ?5 l
  ]; i! Q4 v! y! T: ~最终效果:
7 C$ v$ T5 ?3 w- N8 T* d' r7 m" z9 V" p! {8 O2 e2 W) D
& ~: G. d3 Y' `8 m' [6 m

9 H0 u4 _5 _4 ^' G  @9 O
5 c: S! `3 G9 ~9 A# j* k
" P" p+ r9 o: C6 V! ~5 H9 i# }) q
赞 收藏 评论0 发布时间:2024-12-27 14:44

举报

0个回答

所属标签

ST中文论坛活动

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


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版