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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
% d8 J/ p- L5 q' V$ T! {([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
; L* |2 I9 a8 e+ Z 微信图片_20241227143242.png
( `4 a2 ]- `; E之前项目里的时钟是用一个counter慢慢累加:
* e1 x2 O7 R' s1 m8 V3 h; ^
  1. void timeView::setupScreen()6 }" ?' c, S  W& [6 H9 I
  2. {0 {0 C! }+ t# S8 D
  3.     timeViewBase::setupScreen();
    6 q! j, o& j9 A% R. z  u5 F
  4.     digitalHours = digitalClock1.getCurrentHour();
    2 n' g& h0 d9 D- G0 i
  5.     digitalMinutes = digitalClock1.getCurrentMinute();1 j' v, h6 z. y. F( o! J" E
  6.     digitalSeconds = digitalClock1.getCurrentSecond();8 G: M; J2 y8 Z6 D8 R! x
  7. }, F1 q1 v' F* x: P- J- Z" \
  8. ' }6 g5 s4 {4 F

  9. 6 V# u9 D  t' x% Y
  10. void timeView::handleTickEvent()
    / g8 D) b" h$ n( Q7 b
  11. {
    & z! Z! b" }6 \. K, }
  12.     tickCounter++;
    : N+ d* ]% H8 u. g8 r' w8 ]

  13. 9 ]9 G# |: a) }8 F) T( T0 I
  14.     if (tickCounter % 60 == 0)
    ) _5 }2 c/ e3 j- K. d& B5 r
  15.     {8 {# X% ]. Q% ]: v  Z5 z1 h
  16.         if (++digitalSeconds >= 60)
      e5 ~& w+ j1 z
  17.         {
    # o- E) i  Q% E
  18.             digitalSeconds = 0;
    & N# z  ?1 [( w1 i
  19.             if (++digitalMinutes >= 60)
    5 j. H. V; y1 W# s
  20.             {$ L1 X" C4 _' z7 Z# \. v  L
  21.                 digitalMinutes = 0;
    , m, r% w, }" e
  22.                 if (++digitalHours >= 24)
    5 q; p' H' N! j
  23.                 {
    , S0 }/ ^2 ?& M9 h6 E" N4 t
  24.                     digitalHours = 0;
    5 j) j) W: y4 t$ D& F) G
  25.                 }) s1 V& H4 q4 g6 U! D
  26.             }) t/ a% ?7 ]$ K
  27.         }: Q/ ]( [* v1 q1 I/ J
  28. 8 i7 n; E2 U; a8 N( R9 @
  29.         // Update the clock8 w2 h2 K0 j8 K( u7 m* c
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
      ]) N5 T+ \2 n) |& ^" y  K' A
  31.     }" y/ p. h, g: ^3 ^/ C4 H* _
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,$ w" m$ n' A  b  A; v
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
4 V+ |) a) s- k$ O6 |在RTC中使能并设定好时间:
6 s- g' s  g$ a' z7 C 微信图片_20241227142423.png
2 a1 p. d+ }: F) p2 ?+ v对应的程序也要需要重写一下:  Q; B  @7 o, c0 V  ~; Z1 Y4 u
首先要在modelListener.hpp里添加RTC相关函数:7 ], N. k( I! O4 W4 y
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。2 v- h4 C1 ]7 @) i
  1. extern RTC_TimeTypeDef RTC_Time;
    ' f! Q! g* J+ J; c9 y
  2. extern RTC_DateTypeDef RTC_Date;
    5 u1 ~# `  k' e4 M; i; x- B% J
  3. extern RTC_HandleTypeDef hrtc;  u( Y- }2 w3 ?$ F$ n3 e. W

  4. , A, n4 Z6 v2 J
  5. Model::Model() : modelListener(0), Y, {6 G3 V/ s
  6. {* j: ]9 T- Y: h7 _" a2 P
  7. 6 v8 A1 X: j  r
  8. }5 J3 L8 E6 u& c" M

  9. ) G6 E2 _' [3 ^/ p4 f% W5 A2 k, g
  10. void Model::tick()6 v2 P1 C( V8 n$ w6 O8 m
  11. {
    - q2 L9 K, \8 c0 v$ ?8 P! u
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);  o6 K# \8 `7 K: C- l
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    # D% D# s' ?7 d

  14. * b8 }$ ?6 C- m6 {, u6 p7 p
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    * x' r2 P* x; R! \" M4 C
  16. }
    9 s4 E  v- h' Y6 c. P
复制代码
不要忘了在time里也要再定义一次updateTime函数:
* z6 U4 u0 p. s9 j% `/ x
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    - D" R$ c$ }/ ~% P, g4 q# z
  2. {
    7 p2 ~/ V) j# w
  3.         view.updateTime(hour,minute,second);
    , y9 X7 ~' h$ b5 W
  4. }
    " M! b, l# e% O, K
复制代码
对应的.hpp文件也要定义一次:" L, U# D$ J2 z: J0 y' `6 o
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    * Q$ R5 R# @7 j& e4 Z+ _
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
! B- O9 m5 N; [3 G5 h# j  j& s
  1. void timeView::setupScreen()
    % ]: J5 c0 r# e3 ?- n" z
  2. {3 U% P0 R& k1 ?1 m
  3.     timeViewBase::setupScreen();
    " K1 ?& R. [2 y
  4.     //digitalHours = digitalClock1.getCurrentHour();5 s4 l! ^: V# c
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();) y  t0 ]* f  v
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();$ ^7 r0 U$ N, f4 a" D7 D
  7. }
    4 Z, m( P1 h( J2 U

  8. 2 `& C9 n) h8 }) w$ D' ~
  9. ; S" W6 T, l$ d% q
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    $ h3 I" E( S; w3 c
  11. {8 H. t& J6 l; ?, _
  12.          // Update the clock. Q! b# X4 i$ ^$ M: j
  13.         digitalClock1.setTime24Hour(hour,minute,second);
    * Z- R& w  E( W; A
  14. 3 R* X+ I5 R' I. q3 f6 O
  15.     tickCounter++;
    ) L7 J/ M8 _# l

  16. , C; K" B) G1 k$ {+ e  Y
  17.     if (tickCounter % 60 == 0)! @" a! x+ p2 |
  18.     {
    % `( p/ |% M3 A2 y& ?  y" l4 n- s! |' @
  19.         if (++digitalSeconds >= 60)" G/ ~3 U: w  K5 U6 m
  20.         {6 J; X( R3 w$ \2 B: K* |6 s9 b
  21.             digitalSeconds = 0;
    7 i6 K) J1 s+ y) o4 z$ Z5 V# U
  22.             if (++digitalMinutes >= 60): u8 }" P1 X2 |8 f* R
  23.             {
    ) F3 R9 y, J8 l6 C0 q
  24.                 digitalMinutes = 0;
    ' c5 R6 J. l8 ^5 y  E
  25.                 if (++digitalHours >= 24)1 _& P! z2 V5 S
  26.                 {
    , Z# h6 c$ l" `: n' n7 T
  27.                     digitalHours = 0;
    # W% p1 @- _: |; ^& C1 t* v
  28.                 }4 m* I) g0 e( B" ^; \& h
  29.             }. C; a, W2 W; J) A
  30.         }
    $ e, A' A2 r$ F! n: p, ]
  31.         }
    " v  G) ^: G' f2 _# R7 ^: r; I+ v
  32.   {/ Z; c" c0 a. d/ Z
  33. 3 Y8 l' N( F" p5 Q
  34. }
复制代码
对应的,hpp里也要修改:
5 h, ?9 R- d1 H8 W4 P8 `8 Q6 h
  1. #ifndef TIMEVIEW_HPP# m# R5 b3 F4 c( e! F
  2. #define TIMEVIEW_HPP
    5 @) I& L' E( |9 T$ F( K; z

  3. - y) s# g" D, G. E
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    & l3 \, I" w$ J. K8 ~" @
  5. #include <gui/time_screen/timePresenter.hpp>
    * o0 z, ^# R' F1 E  Z/ A4 r: J4 U

  6. * y5 N& X9 L3 L6 T
  7. class timeView : public timeViewBase" D% u! y* _/ ^" t
  8. {8 g$ [& r7 u2 }( j) w  y% A
  9. public:/ s3 T+ y8 a* @) F# T5 [
  10.     timeView();( G: X( D4 ?0 d% m$ n6 R" i
  11.     virtual ~timeView() {}- D0 D; j* ]3 {3 v* V5 _  u
  12.     virtual void setupScreen();9 t+ X: F8 U/ ^" Z
  13.     virtual void tearDownScreen();
    ) S: u6 r( i" V7 V
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);2 j; o3 a* R8 g$ p
  15. protected:2 r$ e5 l$ m6 t) T" P
  16.     int tickCounter;
    . L  }) l" k3 |1 y/ m  c
  17.     int digitalHours;: L2 k. G& U7 J' P
  18.     int digitalMinutes;7 l0 m" l3 k. _( U2 p: ~" z
  19.     int digitalSeconds;; k6 Q/ n4 r" F! i4 z
  20. };, m! W2 w- n5 ]5 I0 e; Y4 ~* J
  21. $ E& ]1 S8 K3 ~  v
  22. #endif // TIMEVIEW_HPP( D& _5 G- E5 w) n) l2 j
复制代码
+ d' J, s7 O0 A2 C& o% o
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。- W1 i; c% {) B' O; M- h

- L4 k  K" a& M, }0 ~2 |; I最终效果:
0 ?) {7 Q6 [7 F- B4 E' w9 w+ Y
, H+ C6 C6 |) N2 f9 D4 I& J6 H. h" N8 u! b6 A7 |- R
3 O0 O% Z) j8 V. r9 Z

: ?) q% U; Z& i9 K2 P/ u/ V0 Q% q( b
收藏 评论0 发布时间:2024-12-27 14:44

举报

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