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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
7 v) P$ m% h# G([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
4 B0 w# A, J. S) v! m" y+ D" I# D5 m& Q3 L 微信图片_20241227143242.png
' B" y6 }* p2 }7 P) J之前项目里的时钟是用一个counter慢慢累加:/ A# ?* ^0 {2 _
  1. void timeView::setupScreen()
    - g& A& i) i- e
  2. {
    " j. F! `! q0 |8 L( O; o
  3.     timeViewBase::setupScreen();8 |  U: j1 ~! l6 y- _0 O; V
  4.     digitalHours = digitalClock1.getCurrentHour();
      T8 g: [+ }' [0 Z6 s6 ?
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    " N' m9 {9 W* P% {+ l) n- |
  6.     digitalSeconds = digitalClock1.getCurrentSecond();$ E+ z2 g5 E0 E. R- Q
  7. }
    1 a+ p% k. T/ m9 u. O( O
  8. ; g& l- v' d( j
  9. , E* X' M6 X+ C$ W2 G( ^7 }  Q
  10. void timeView::handleTickEvent()' Q% G, l7 K+ }% m/ s. m
  11. {8 ~. @3 w# y6 y1 h* Y
  12.     tickCounter++;
    * ?/ ]) h0 k0 v% a' c. Y
  13. 0 k8 K- \) N' J% |# l+ Y
  14.     if (tickCounter % 60 == 0)
    0 |4 {$ m" P: A" M+ w. [6 J
  15.     {
    & h* ]' y* n- H/ z0 @
  16.         if (++digitalSeconds >= 60), {2 N0 c/ C; x) }1 ]# i/ h& U
  17.         {
    0 j% h! U8 v6 `# n( `9 l
  18.             digitalSeconds = 0;$ z/ B+ r- z8 Q2 J  t  L
  19.             if (++digitalMinutes >= 60). U+ w1 K& E# M( G: ?- R+ p
  20.             {. N0 c; V+ @8 W& P: T7 _! T
  21.                 digitalMinutes = 0;) E! E* }5 b/ S9 P- m
  22.                 if (++digitalHours >= 24)
    ! {4 \. B2 H8 u6 i( O& s/ \* j
  23.                 {
    - I$ K5 v/ C! d
  24.                     digitalHours = 0;
    ' P: u" D2 F0 K& ^7 T+ M
  25.                 }
    2 l3 Q7 r) P8 D
  26.             }% a# }. v2 w9 G& U# w& n- v
  27.         }: i9 K, f! V0 X$ t
  28. 8 I8 I. Y1 a6 {
  29.         // Update the clock0 a5 Y& \- V, F. K
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);9 E# n2 [8 [8 Y& i) {2 t2 J+ j
  31.     }
    9 n- d& V- `1 l
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,; O7 J3 s% W* W9 d* G, {$ O
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。7 E  t7 z5 y) a2 w5 _4 S
在RTC中使能并设定好时间:5 }+ Y' T% A/ w: }: R* h; F
微信图片_20241227142423.png 0 [* q' b; K: m( L; [# J2 A
对应的程序也要需要重写一下:  ]# J  @6 x" R" y
首先要在modelListener.hpp里添加RTC相关函数:
" A. C3 z  O# G2 \1 M7 `. W7 C  ~" d
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。6 }# R6 K, d: y8 b' ^% N: k$ k9 O
  1. extern RTC_TimeTypeDef RTC_Time;9 A1 C. r: ?# O) I# e2 @0 R- T
  2. extern RTC_DateTypeDef RTC_Date;3 {1 h; m2 L! f) v2 A
  3. extern RTC_HandleTypeDef hrtc;
    ! z3 q/ h+ V: \7 a! r  L4 a
  4. 6 |3 `. F7 p( `% l& }4 d
  5. Model::Model() : modelListener(0)
    ) G- M' u, z9 Y! o+ v" i
  6. {
    . q- d  u5 x! Y' T2 f

  7. 7 h8 M: b! d3 |
  8. }  W; k) E5 f5 P+ @- u

  9. 1 G( B, p8 }/ X, h% `
  10. void Model::tick()
    ; Q+ f7 z/ f6 r" T7 e# R6 @  T. |
  11. {/ Y' V( e2 @1 M2 r' x, Y
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    - A; M3 ^$ y5 u+ P) k$ @
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);* l5 P) S( u% {" o! i
  14. ' T; `9 v$ Q0 O' b/ V
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    - V3 y5 q* p/ e0 D. [& Q
  16. }$ ~1 `! t$ i5 D* [5 f4 h* H
复制代码
不要忘了在time里也要再定义一次updateTime函数:; N- `) w& L7 D/ O7 b
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)2 L, d- U" y8 s2 w* o
  2. {
    , p/ Q+ ~" C( Y
  3.         view.updateTime(hour,minute,second);( R- X: f! A! J1 @! ^) t) a
  4. }
    # b. R4 M. T* |/ T
复制代码
对应的.hpp文件也要定义一次:1 E( }$ l" o! G& {" X
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    3 z0 i$ W& v2 A* |
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
+ I$ F# o, T9 d9 g5 ^. i! |3 {
  1. void timeView::setupScreen()
    6 m5 k! Z" n" M/ P- k2 f; E7 z
  2. {
    0 l1 @: c, X& Y- o% T$ E. [
  3.     timeViewBase::setupScreen();0 B5 O" A" @3 F
  4.     //digitalHours = digitalClock1.getCurrentHour();
    3 y+ R; J5 M4 v" Y1 \: B
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();  S/ m4 L/ w; y3 o; f
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
      k( g; K  K4 T/ X( b
  7. }
    - \9 k! n. S' ^6 g4 u' s
  8. ) C+ ?5 ]" M) s) r" p* W
  9. / m  C. t  I8 O7 |" [3 c
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    $ S* T' P' y$ P5 O
  11. {) w3 o! c5 c7 ^" M2 @  k
  12.          // Update the clock: c! G2 ], A1 g9 }7 q
  13.         digitalClock1.setTime24Hour(hour,minute,second);
    3 d' Z' w5 g4 i6 n" d, |/ O' P

  14. 9 _2 x+ ~7 v- W1 H% c
  15.     tickCounter++;
    2 m# C" k9 `( F7 m0 l. j

  16. / n2 q7 ^) ^& {: a- u1 @
  17.     if (tickCounter % 60 == 0)+ d' {/ Y. ?% H( ^9 X, d
  18.     {# a: o& b& _: L( P! P
  19.         if (++digitalSeconds >= 60)# a. R6 \) U" t# O7 w% f" P
  20.         {
    " O- r1 T; c. d
  21.             digitalSeconds = 0;# @, @9 q& c) L
  22.             if (++digitalMinutes >= 60)6 b' _2 F# \1 P$ q- Q+ C
  23.             {' r; P. m# p3 I. A$ D' K7 `% ^
  24.                 digitalMinutes = 0;) s9 M1 H9 f6 C, }6 l& D& E
  25.                 if (++digitalHours >= 24)4 S4 @% _4 z, T6 e: Z8 u) S7 _5 t
  26.                 {
    ' Z) r; j+ v. h7 M, C  U2 }; `  O5 D+ A
  27.                     digitalHours = 0;
    ' W# F4 Q, ^9 x
  28.                 }: X$ t6 g' _+ p8 S. B, n
  29.             }# T& z+ W+ V) b" r! I  B4 i! S4 N
  30.         }" Q  \3 G4 }2 g
  31.         }
    1 f: ?  Z, j3 s4 l8 c1 {( h) y% M
  32. - b" I# X* V: h4 U9 c% s4 a  m
  33. " y: o: g1 p, v0 h& C! P% v# V
  34. }
复制代码
对应的,hpp里也要修改:
4 l9 E$ d. x/ X3 r3 ~3 Z3 @
  1. #ifndef TIMEVIEW_HPP' e0 v9 i- C7 {4 v, z* q5 }
  2. #define TIMEVIEW_HPP
    # @- F$ ?! r' h, b* C

  3. + L  X8 W# D2 i: C
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    7 p5 q' i+ j% G1 K# c( G) c# W8 [9 t
  5. #include <gui/time_screen/timePresenter.hpp>
    , n1 Z6 @) r# n* i" z8 t
  6.   Y4 f, f- m# ?% _! v5 V
  7. class timeView : public timeViewBase8 X( }4 G2 f' Q' S1 r$ Y: X
  8. {
    - ^1 e. q( H$ C
  9. public:6 g; H9 C& S8 a
  10.     timeView();$ |' {7 G; r9 n& K3 H
  11.     virtual ~timeView() {}# }2 j+ E1 P4 c% u* @$ }+ F
  12.     virtual void setupScreen();" a) c* l2 ~3 s( F6 n7 L4 d
  13.     virtual void tearDownScreen();
    5 L9 k2 E! M& F3 d0 Y
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);) ]  Y  `0 s' `/ _" j
  15. protected:
    . _! R0 c% D& _. v
  16.     int tickCounter;* N: T2 p, W7 k$ g4 D3 M8 _: d
  17.     int digitalHours;
    6 n* W: `% O' d6 ~! N
  18.     int digitalMinutes;
    . H& T: H" U# I# m( v+ b( o; ]
  19.     int digitalSeconds;
    * [: D1 K) x: [1 [
  20. };
    ! c& D2 m& w2 S8 n7 Q' a, b1 `

  21. & Q& C  Q0 I- x% }) V; F! @
  22. #endif // TIMEVIEW_HPP
    ! F6 f. X1 m9 A
复制代码
9 Z" p8 U0 \6 h- J
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
5 A1 l6 a7 m/ w3 L! \9 H( ], E& z
2 [& d. N! g% S! s4 x0 y: N: o2 Y最终效果:
& i3 q! I. R! p7 T" D2 U& Q3 B1 k

9 h+ i; S, A) M% t/ W  A, s
5 R6 ]! }5 u* y$ N
4 u7 R$ q6 x0 S, _. x  @8 v4 r# I; |$ V
收藏 评论0 发布时间:2024-12-27 14:44

举报

0个回答

所属标签

ST中文论坛活动

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


最新内容

相似技术帖

官网相关资源

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