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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。0 m5 y  f4 M2 j5 ~. n
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))- [) c7 g0 U0 b$ b; u; ^7 ?$ n. B! x) @
微信图片_20241227143242.png * p. d/ Z; l4 e, w
之前项目里的时钟是用一个counter慢慢累加:
$ ?8 G4 i6 w1 a) q# ?- Y4 X. O
  1. void timeView::setupScreen()
    ( M, J% [' Y, D  t- x1 J7 v, ~
  2. {
    9 u0 l6 ?) `/ u" t
  3.     timeViewBase::setupScreen();
    * a: ]* {9 d# W0 C6 l7 j- B
  4.     digitalHours = digitalClock1.getCurrentHour();
    8 p# q: b; {" q% N& \& K/ K# L, S! W
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    & T  B. D( `7 m1 F$ |
  6.     digitalSeconds = digitalClock1.getCurrentSecond();, e+ _1 S8 W: D/ L) Y: p
  7. }! G# V7 t4 d4 ^& _- I* \$ K

  8. 6 i) T( ^$ a7 T/ A  I2 U
  9. 8 l, a: R# j$ [' }# s) h" V/ y( s4 w
  10. void timeView::handleTickEvent()& h! ?1 m7 D' s# R4 l% w6 W
  11. {3 x% P: l" l; C- ]$ ^3 R
  12.     tickCounter++;6 u- R8 e* f$ O: C$ ~
  13. 0 D  h& f6 L" D( C
  14.     if (tickCounter % 60 == 0)/ S3 l6 A4 D" X' Z
  15.     {
    ! K6 q9 E4 P$ ?$ ^( O6 N3 b9 d
  16.         if (++digitalSeconds >= 60), r* C7 h0 L& H$ {
  17.         {  r+ A. G( _2 a
  18.             digitalSeconds = 0;
    # D( p7 h2 D: Y: Y) v
  19.             if (++digitalMinutes >= 60)- F9 C& d' F+ y% ?% Z
  20.             {
      J' a5 a: k7 o8 ~( v# u9 P
  21.                 digitalMinutes = 0;2 w3 r' D& M: Q) u' w' N
  22.                 if (++digitalHours >= 24)
    ! H" D, f! {/ C# W) k* O5 Z
  23.                 {
    / ]* {4 ]5 {: x9 k1 k5 q. f
  24.                     digitalHours = 0;4 K! W6 K6 r- }$ |& M9 E' x- a+ u
  25.                 }
    * u! x* |3 K" Z5 G# V: q. X7 D7 Q3 x
  26.             }, g. E: s3 z2 q$ q. k' c
  27.         }: f' b6 ~. p6 i

  28. ! {; w. u' H8 H6 S6 ~! |% Y
  29.         // Update the clock
    # s$ g2 j0 G8 E: Y+ B$ C* F
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);( J& r6 ?4 C" V/ E% R" _, I9 h
  31.     }
    % a" y* D6 {, z. q
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数," Z' a: i; Q) \8 Z; f
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。. Z9 k/ a! A4 S
在RTC中使能并设定好时间:
: H9 Q- U2 Y1 `1 O' X3 a 微信图片_20241227142423.png 3 O) O& R. s; _8 q, h  o4 w9 h6 j; U
对应的程序也要需要重写一下:! S0 j; @6 W; {, }
首先要在modelListener.hpp里添加RTC相关函数:; }: \4 ~, R- _
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
3 t) E# A7 P! B; _. S
  1. extern RTC_TimeTypeDef RTC_Time;
    : M2 T2 |" j1 r, g6 W# |0 H
  2. extern RTC_DateTypeDef RTC_Date;
    % B: K9 p  F2 Z. {2 b$ R& f7 _
  3. extern RTC_HandleTypeDef hrtc;4 Z% d8 v8 {$ l* p" t
  4. ) F5 C  F% U8 ^  K/ @1 h
  5. Model::Model() : modelListener(0)1 ]4 p3 c" a5 J; x8 i; ~- K1 D
  6. {
    2 l0 M2 H+ H  U

  7. 0 a/ y$ g+ \/ D, A
  8. }
    % O9 v- q# {: E9 V( F

  9. ! n  O- B' [2 k$ T9 U& c
  10. void Model::tick()! u% T4 f, Q- |4 E& u* e3 R, w
  11. {/ I4 S3 v* o' q8 v! A& W) @
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    , {- j) X5 W  G7 q# }4 n
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);. g5 f6 `3 ]: q* ~# _

  14. 4 E% b  {  R" `6 u& C  o" ?) B
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
      o1 Y. v, E+ O6 h+ O
  16. }5 t1 u; ?* Q1 L2 J# n7 n
复制代码
不要忘了在time里也要再定义一次updateTime函数:
8 f, N( @+ D% k3 Y; q3 y+ t4 U
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second); l& f4 [" l- |; Q6 Q; J. K
  2. {* L7 {* \" |* y: ^, A
  3.         view.updateTime(hour,minute,second);' A- U  y5 L) g  s& s
  4. }
    , ?0 a! Y, \' u5 D) ^
复制代码
对应的.hpp文件也要定义一次:
' z7 A6 b( U$ T* i( ?5 k& H
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);# P& w& g3 E/ a/ M. S" ?/ W, k
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
) x) U# f# B* e
  1. void timeView::setupScreen()
    5 k% ]/ k( E7 E/ [# p. O% t- Y
  2. {
    6 Q, t% l6 V, Q4 j8 s, Z2 d: {
  3.     timeViewBase::setupScreen();
    ; I) a0 y" N+ i7 R- O+ G) V
  4.     //digitalHours = digitalClock1.getCurrentHour();+ S8 k0 S0 W3 a  x6 t) H
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();
    0 M3 G% Z( l# u" t% a
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    7 u! u6 g6 u' G$ s. m
  7. }2 d3 G5 A% \, x# G' \$ }
  8. 9 Z  y+ l+ H" x

  9. & q) {" ^9 l6 y! P
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    3 N# M( F' B3 }% e; }9 ]' T
  11. {, ?& @3 D3 ?! Z
  12.          // Update the clock' A7 r$ J. T/ p) V2 X
  13.         digitalClock1.setTime24Hour(hour,minute,second);  w6 `0 P7 f% F3 P# A1 H$ ~/ H9 u
  14. / N, V9 w4 z8 Y( q) I& z; {) a
  15.     tickCounter++;
    $ p- D  s& F3 @9 Y* ~+ p% U

  16. - a2 ~  T8 D0 k8 [2 |
  17.     if (tickCounter % 60 == 0)/ V" v% i! }" A$ G8 |. J5 c
  18.     {# M# j8 `- g: i9 M3 _
  19.         if (++digitalSeconds >= 60)  N, ~2 S& b! L, L9 ^/ V5 k
  20.         {* _2 ?$ t6 b" y* h  g% v* Q
  21.             digitalSeconds = 0;
    - n7 L% A3 {' Q* q* m3 c" o
  22.             if (++digitalMinutes >= 60)& w8 @( _" B# P; |4 w, y" z
  23.             {
    ! |/ J" J& |# v: D, h' Z- N
  24.                 digitalMinutes = 0;9 m! w: i' ?, b" ^: K
  25.                 if (++digitalHours >= 24)
    * T" u! q  X; z0 }
  26.                 {, M5 B$ W* B- b! |# ?: _) b
  27.                     digitalHours = 0;  T5 l' W6 N" Q4 b. a1 B, s7 h1 T
  28.                 }4 N& T: p# p7 Y: r) ~# d8 z
  29.             }7 C: B# `; ~6 W( D* i
  30.         }
    + o) k  l3 h- b) r
  31.         }. y; @' S4 M6 A& B, }# W& W

  32. . A4 x9 w; Z; ]9 ~
  33. 5 j/ s5 w3 _$ D& y$ Q; A, P; `
  34. }
复制代码
对应的,hpp里也要修改:
( B+ m" T. F5 A( d! B' h3 E0 c
  1. #ifndef TIMEVIEW_HPP. j" Y; \* W7 _% L% G
  2. #define TIMEVIEW_HPP8 r' v7 G3 \" A+ A$ p
  3. . Q; i/ M5 C5 b+ k" n* ]$ h9 \
  4. #include <gui_generated/time_screen/timeViewBase.hpp>) @: u' f+ R" c$ B- `$ I! Q; r& O
  5. #include <gui/time_screen/timePresenter.hpp>2 y1 e1 [" H7 B: z4 E

  6. 0 [- }' R# V) N/ U( v) I
  7. class timeView : public timeViewBase
    3 I; g4 ]. W6 n8 M
  8. {/ L% X5 e, B1 W8 @  q4 [+ d/ v
  9. public:
    . I' z. z4 w9 @: a3 @
  10.     timeView();
    ; [0 _8 b9 s6 k7 V7 Z
  11.     virtual ~timeView() {}
    ' X# l9 u5 e3 q
  12.     virtual void setupScreen();
    : B8 A; i$ |1 p: Z
  13.     virtual void tearDownScreen();8 a) N6 v) \. t- ^
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);# M0 x& f, O6 G5 U9 S
  15. protected:, ~0 M0 D2 ^# {7 `+ M" y
  16.     int tickCounter;% u; w; X- W- Q% }* F- F8 I9 l8 m
  17.     int digitalHours;6 w7 r# t/ x+ P* l
  18.     int digitalMinutes;/ \0 v- J- ?- }2 g) O+ t
  19.     int digitalSeconds;
    2 b% o6 S4 \( @! u% {# S
  20. };
    7 \* q+ C7 U4 r- v4 W
  21. ) N( C7 k7 x7 ]4 [# u, p! O
  22. #endif // TIMEVIEW_HPP
    1 c" Y2 I3 A- Y' |  \1 r
复制代码

( Y% K% t5 I3 F( `$ W# ?这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
+ v  m, ?, p9 A- j$ T/ h3 g' T2 q0 P2 \+ O) i8 d  A
最终效果:7 m  C/ X. g4 N7 m, K* b
3 r0 j0 [; ]9 \# J

9 J6 z4 O; [7 O- K2 n+ h" Q1 M; r2 F0 R
- e2 p7 R6 \% h& w8 h% E/ P* X& c$ j
, {' m5 G- q$ B0 T8 N
收藏 评论0 发布时间:2024-12-27 14:44

举报

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