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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。$ Z2 c/ R8 g( c6 S/ ^
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))2 f( ?; u3 Z  i) l# o: q" G
微信图片_20241227143242.png
0 Y2 J# o7 y; P2 I: m; }之前项目里的时钟是用一个counter慢慢累加:2 A" y4 z; ^! w6 s
  1. void timeView::setupScreen()
    ) S! H' L1 X9 [2 d
  2. {
    8 c! A4 s% w1 \( u! Q
  3.     timeViewBase::setupScreen();
    & M5 T+ n% w0 G4 d( C
  4.     digitalHours = digitalClock1.getCurrentHour();4 c: t& {" U4 o6 z, ?1 K6 E3 N. w5 u
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    % I, r) z# Z+ ?1 c/ C7 K+ _
  6.     digitalSeconds = digitalClock1.getCurrentSecond();
    % J" ~3 d( ^* k3 i
  7. }1 |3 i. ~& j' T

  8. 1 i' Q9 x+ q5 c3 ^$ n9 v
  9. , `( U0 O, k6 O
  10. void timeView::handleTickEvent()$ Q0 A  y) l7 F
  11. {* Q/ i% B! l; e. G
  12.     tickCounter++;
      V0 a$ a5 g& `+ h  \: B
  13. 0 t; r- G# \- C: Y# Z
  14.     if (tickCounter % 60 == 0)
    " r: Y) J9 `# b2 a7 W
  15.     {8 ]& b$ I5 M1 L0 F6 }2 b, c% O+ ]
  16.         if (++digitalSeconds >= 60)# x7 C  R' i- H& ~. _
  17.         {# h/ J. K! |' ?: k8 Z: e% v  k
  18.             digitalSeconds = 0;' {0 Z9 f- k& {
  19.             if (++digitalMinutes >= 60)
    5 n3 a# a: H0 g2 b7 ^3 O2 ?4 Z
  20.             {8 C5 ^9 j. G2 X( V/ a5 d1 W
  21.                 digitalMinutes = 0;4 F$ v& h7 W9 j
  22.                 if (++digitalHours >= 24)
    ! I0 R2 ?) f! G. ?8 A
  23.                 {
    7 J% M; }: j' [) I9 X
  24.                     digitalHours = 0;
    ( W3 q) k; V8 Q$ ]
  25.                 }
    3 m5 A0 B; _5 H9 D$ Q$ t
  26.             }
    ! |; I9 `8 Q8 l$ U/ C- R! k* w( j
  27.         }& V  l+ h& O9 _' u: e. ]

  28. " j! p# W0 n* |# ]' G/ l% n
  29.         // Update the clock+ G8 l8 J; |8 a+ G7 y& ~4 S0 F' o9 y
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    5 Q2 i9 u0 {. s) j' S7 H1 ]8 p" J
  31.     }
    ( i3 p. W. e6 T# w
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数," z7 O1 [5 x6 k# e3 z
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。8 V& T: r$ f" h  v: K
在RTC中使能并设定好时间:. N7 f. u( l8 T
微信图片_20241227142423.png
, k+ K6 l" C" F+ X3 z% f对应的程序也要需要重写一下:
5 x. j/ z5 \" b  ~首先要在modelListener.hpp里添加RTC相关函数:( o% t6 r2 a7 ~
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。/ H% O* S  l2 Z: [
  1. extern RTC_TimeTypeDef RTC_Time;
    - K% n' M2 L7 \3 A0 r
  2. extern RTC_DateTypeDef RTC_Date;! {& o* Q, f4 m7 o5 e; }9 R, q
  3. extern RTC_HandleTypeDef hrtc;0 R! a3 a( N7 P+ O

  4. ; A, L3 J5 [/ F4 D4 P% O; X
  5. Model::Model() : modelListener(0)
    0 a* c4 C2 {; G9 {: b  m; G* {
  6. {
    ! z9 n6 @" a) }" V- F4 [

  7. 3 I4 d6 @8 `3 M5 }+ k+ K8 i' P& O
  8. }
      R0 Y  K4 K1 U' j# g  i/ h

  9. ' }" f  `6 U3 _; {: z
  10. void Model::tick()5 p5 O: ^  v" V8 |9 N! s
  11. {
    * q& M+ A& v: e/ g3 t9 b
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);+ B: {8 c: B- V8 K% d2 \9 ]- j( c  _
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    $ j1 X  z+ d2 C9 D. @9 q" F
  14. . ]1 i6 U3 ~* l1 l' t
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);5 D9 `" ]5 q9 u! F2 N/ o$ T( }
  16. }
    9 R$ h1 b$ h; l5 _
复制代码
不要忘了在time里也要再定义一次updateTime函数:
2 M: q1 X8 m- ?; T/ r, J1 O
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)2 U/ m3 o. p7 x7 g/ s
  2. {& C. c6 J3 Q# @9 D6 H3 [
  3.         view.updateTime(hour,minute,second);5 [; \% D4 S% h! {- a, {, B+ ]
  4. }3 A( ^: M# ~) u! `
复制代码
对应的.hpp文件也要定义一次:
+ k4 z- F$ @5 |( @4 c" b$ A9 g
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);  c3 K' ?6 d7 w
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间) `& q, o% T$ v2 V0 D
  1. void timeView::setupScreen()% Z2 k8 \" I0 \  E' {
  2. {
    0 r* W# n- f% \' w0 F" l' a
  3.     timeViewBase::setupScreen();
    9 ]' b1 }3 i' k+ }
  4.     //digitalHours = digitalClock1.getCurrentHour();
    4 Y9 {# D" j. c6 P. T
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();
    6 Z, `2 h+ j  V. a' I, h# H# X
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();, s$ V7 z7 F- W7 d
  7. }: `. a* t- }* U( u4 ?3 h

  8. 0 M- Z% Y3 N! G2 b9 t) X, _; v
  9. * B% m- w* s* R- e, Y" [
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)+ d# }  y/ x+ r- G' v
  11. {# }6 f1 P4 o+ Z
  12.          // Update the clock# d/ ]( S& p* T$ u9 R. h+ k, X
  13.         digitalClock1.setTime24Hour(hour,minute,second);. \# ?6 k. d0 w; s4 S! k3 a
  14. 7 |6 o5 u, Z' C% S- a6 G
  15.     tickCounter++;1 v; `$ ~( T, i) }, U

  16. . s2 z* E' v6 [: w  ]
  17.     if (tickCounter % 60 == 0)
    ! n  x# ]7 Z, Y% L# D3 G0 V
  18.     {5 u8 b& D' t  ^7 p; l; h3 Y/ K
  19.         if (++digitalSeconds >= 60)  O# I: x3 J% h& Z0 a5 x2 [4 b
  20.         {
    1 o, A6 I4 W3 ]
  21.             digitalSeconds = 0;4 B! p9 _" M% f% f6 S  z
  22.             if (++digitalMinutes >= 60)
    " h: G  E8 x! |4 n
  23.             {1 \, P" f2 C+ E( ]
  24.                 digitalMinutes = 0;* ~0 ]. `% n9 [5 K9 d, V( _
  25.                 if (++digitalHours >= 24)1 v) l& B: L5 R% k% ^% q" X
  26.                 {2 p0 u; @8 v6 R0 W; R1 A
  27.                     digitalHours = 0;7 \4 R: b$ r$ N1 e
  28.                 }6 }! i% O% f4 [9 ?) t& n; X
  29.             }. A; a+ P% m: I
  30.         }
    8 K. i& L0 x! `+ t1 J
  31.         }
    + T' ^. c' x0 |! n' C/ b- U/ ?
  32. # B4 E: Z! g. v3 G. y7 n8 B

  33. 6 P7 {0 G6 Q& N7 O4 y( V, a; e+ h
  34. }
复制代码
对应的,hpp里也要修改:
- z% h0 `9 Q6 N( V
  1. #ifndef TIMEVIEW_HPP' ?( n$ v$ R* s) u2 d* f* g
  2. #define TIMEVIEW_HPP2 F- n$ ]# t$ q0 I6 C, g
  3. $ `" U2 J1 ~) M  g
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    ! f9 E4 J, _' r
  5. #include <gui/time_screen/timePresenter.hpp>
    8 @0 r- ~* o( b

  6. # D( P0 j6 \% k/ M( e) ]
  7. class timeView : public timeViewBase* e% H+ f5 u( G* c/ @
  8. {+ ]9 o+ m- p7 a  ~8 q* W2 {
  9. public:; w# D! L, j& Z# s7 `( a' D1 T# o
  10.     timeView();
    : @, S2 l9 T' ]; z. b' i$ s
  11.     virtual ~timeView() {}
    % F6 ~1 d- ]8 Y/ O7 z
  12.     virtual void setupScreen();
    , K: Y" H( O  A
  13.     virtual void tearDownScreen();
    ; r: J) A, O0 [) M4 ~+ \* F
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);3 B- t' b, n7 P  K7 o3 _3 p
  15. protected:. i: t( T* z! E: \
  16.     int tickCounter;: g7 ~' |0 x/ W4 r5 c! l4 f
  17.     int digitalHours;
    1 V+ E8 b" Z) ]8 U
  18.     int digitalMinutes;: b, J9 R! b: m7 K7 N0 D
  19.     int digitalSeconds;
    ' J) R3 c( a( V5 Z% s1 j6 o+ V9 _
  20. };
    0 n3 e9 s& A5 @  p/ m+ Q
  21. - u- W4 H2 {% O. z5 D1 V6 b
  22. #endif // TIMEVIEW_HPP
    / c8 v: T9 G( w% ~3 H/ e
复制代码

$ N( d6 W; u$ y0 O7 m) W2 |0 }* e这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。- a) w: g& w  |% G

, @/ }) Y6 i# S% ~% w) @$ e8 S* f最终效果:9 o4 H: `0 T% p2 p$ K* n

' ]1 V+ m+ }: f; G
8 h8 O% O; R8 n+ M8 @& B2 w7 ^, l5 O1 [
) N# n& x2 i, ^! n1 }+ }2 G$ Z; T

  M% E, [9 @) M& ~- x
收藏 评论0 发布时间:2024-12-27 14:44

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版