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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
+ O  H3 U$ O: p) W([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
$ Y$ ?- ~# |- f; I0 C6 n  y 微信图片_20241227143242.png
: M0 x" _3 C8 k' ~7 _( N之前项目里的时钟是用一个counter慢慢累加:
# K4 ]' a( q# b. p" m; Z8 X2 ~
  1. void timeView::setupScreen()* o" A0 M0 `6 f6 a3 {5 i- U
  2. {
    6 D/ W( M7 l$ f$ Y( D
  3.     timeViewBase::setupScreen();
    $ e' M7 Y5 j1 o$ J: H' w: U, }
  4.     digitalHours = digitalClock1.getCurrentHour();3 }; m8 Z  ]. ?7 P& F; E1 ^  y
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    4 y5 m$ _' s! Q7 j. l
  6.     digitalSeconds = digitalClock1.getCurrentSecond();7 e. J- ?; O6 [( Y3 x
  7. }
    ! g: Z+ w" x9 v9 [3 w
  8. , R* ^2 m% g2 K- X  V  L- L2 F

  9. + J% F6 W" |! K" H0 g, c. _+ A8 z
  10. void timeView::handleTickEvent()
    $ E0 Y; A9 h5 T% a& M! K9 v
  11. {
    # `: ~  T! p9 g& P
  12.     tickCounter++;
    , f; O, o6 e2 |& r
  13. - Z! f1 \, a7 u+ P+ {* Z: f+ l- q! b5 r
  14.     if (tickCounter % 60 == 0)
    ( Q+ {$ [- a4 @# |& k
  15.     {; }6 l+ j  ]/ ~) O5 c0 I
  16.         if (++digitalSeconds >= 60)
      I+ X) L7 k& x& O, t
  17.         {
    % a+ R, o( B% Y% i5 c
  18.             digitalSeconds = 0;3 S9 c* m2 V. c
  19.             if (++digitalMinutes >= 60)
    6 @$ I4 U+ d! W, a) p  P
  20.             {9 M, {$ H# U: z; L% K
  21.                 digitalMinutes = 0;' \% j$ J, T0 f2 m
  22.                 if (++digitalHours >= 24)9 _( D7 m9 M3 Y; o- m1 U: p4 s
  23.                 {) K' G" U" [  k% t+ T9 M
  24.                     digitalHours = 0;9 h8 N- z/ p9 i  c9 d# L! {
  25.                 }. ]1 B7 B3 j, ^/ h+ H/ T, ~
  26.             }
    3 {" E7 O* f& X% @
  27.         }2 O5 T. U! f4 w, n6 N% f6 k+ d9 J

  28. 9 s: f5 I% x- l; s2 l. i# X; i" s; o
  29.         // Update the clock+ Z' q2 ?% g' L* f  q3 D8 }
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    1 o  ]% y5 t1 c2 ~) ?/ s2 v( }
  31.     }' I% S/ k- a4 N8 [
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,$ @* T  |( b  W) E
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。; ?& p) K2 N# g
在RTC中使能并设定好时间:2 c! ^, Z+ z' i% N" a# w
微信图片_20241227142423.png : o* ^- |0 q* _  h/ P) Q
对应的程序也要需要重写一下:' z8 R* v% Y. M  `
首先要在modelListener.hpp里添加RTC相关函数:
9 N, E5 u$ i9 A0 f
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
4 ^; N$ W. ?1 U# m
  1. extern RTC_TimeTypeDef RTC_Time;
    2 H% y% Y/ m& k
  2. extern RTC_DateTypeDef RTC_Date;) R8 M1 a6 Q8 e; d  e7 e
  3. extern RTC_HandleTypeDef hrtc;
    4 ]+ ^. @- z, g7 P

  4. * b; j7 v' C! k1 b
  5. Model::Model() : modelListener(0)
    2 N9 @4 q$ Y/ B
  6. {
    ) G, ^$ R" m! X6 ]* }% z$ k
  7. : g. h' }3 k4 d- n$ d2 C4 J
  8. }2 h$ {' l- I4 j
  9. 8 k% K. k4 e( U$ F" W3 D" }9 ^8 p- _
  10. void Model::tick()8 m5 Y' ^: H* j: P7 L$ ~+ p
  11. {
    5 K1 {  c9 Q4 ?
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);2 p2 Y2 F2 {$ G
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);! G% @$ |- L2 ]; C: R

  14.   V3 m$ P+ y9 N3 @
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);- B# s6 m1 W6 a" l+ c
  16. }
    2 h; ^& }4 h' b4 g  v' w
复制代码
不要忘了在time里也要再定义一次updateTime函数:
/ h" }3 S8 Q; V- z2 d% V' l
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)& y( ~5 |% C8 P; r. A
  2. {
    ' A  @: ?. Q; s
  3.         view.updateTime(hour,minute,second);
      {' I2 c8 m  A0 i
  4. }- L6 H) Z9 v+ `( O) y0 J; B
复制代码
对应的.hpp文件也要定义一次:8 e; R0 @- v( x9 W6 H9 U( K0 d3 P( m
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);/ D0 s  W' v5 f) D8 D# E
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间3 H/ N+ P# }( o  u1 u( _
  1. void timeView::setupScreen()8 ^/ }- m  |$ p/ e& A  r
  2. {
    : ]1 P- t/ |9 J9 G; V4 s  L
  3.     timeViewBase::setupScreen();
    % s4 m3 ~7 F' c
  4.     //digitalHours = digitalClock1.getCurrentHour();; C9 R& Y! Z; [
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();* x, {% v1 i  Z* U1 o, D3 O. z+ l
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    ; N0 w" a7 D8 l
  7. }$ K" l/ h/ \! Y5 C& Z- v
  8. & n0 y/ |6 ?- j% ?

  9. , a3 o: t5 O  t. q- M" A0 q4 Z
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    + I& P% ~' \2 Z8 d. @( e
  11. {
    # S0 q$ X2 C; E6 v1 ]1 Y
  12.          // Update the clock* k5 x- g; Q- l
  13.         digitalClock1.setTime24Hour(hour,minute,second);2 c% N; c# m+ S# z' Z
  14. + L$ {) x- ~. u+ l
  15.     tickCounter++;0 L* s0 j% w( f+ w# {  c& q2 i( u1 x

  16. 0 t" G: U3 H" E7 j5 R2 z
  17.     if (tickCounter % 60 == 0)
    ! U' f3 X/ H, P& T! @3 Y
  18.     {
    $ M8 B6 A; e) g8 B- _
  19.         if (++digitalSeconds >= 60)2 v! H' [' ]1 V; }1 |% o8 a2 P
  20.         {
    ( b- c) t4 r  A
  21.             digitalSeconds = 0;* y0 r2 n2 h) F- _
  22.             if (++digitalMinutes >= 60)
    9 {" T. C6 e: ~* R9 C
  23.             {
    4 T* Z1 y$ N& _4 O
  24.                 digitalMinutes = 0;7 X* V1 t  r' g  s, a8 R
  25.                 if (++digitalHours >= 24)
    $ w- l0 z' a  K1 ^
  26.                 {! F- O/ A2 Z. t/ A
  27.                     digitalHours = 0;, r8 O% G8 s5 ?8 E7 W3 O8 C( B! Q) j- f
  28.                 }
    9 @* ?2 l; V& q+ e* G( n# ?
  29.             }
    . ^! K7 C, Q0 ]+ ~( R' [! p
  30.         }% {7 m' @! q$ M  J* w) {* y
  31.         }% H4 b; P) t! y# Q3 }  b/ n

  32. 3 n& ?0 G4 n4 X$ \! {/ Z

  33. 4 g$ {, |" o: o( x; a+ T
  34. }
复制代码
对应的,hpp里也要修改:
" z4 O- [& ~, C. u- E4 R, x/ E
  1. #ifndef TIMEVIEW_HPP% z1 Q1 F1 s3 C2 ]0 \2 `6 [  s
  2. #define TIMEVIEW_HPP
    % C7 i$ y2 ^9 b- K0 G. ^
  3. ! b: q1 d* j" a; w
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    3 s) M; Q6 {: }  ~" T& T
  5. #include <gui/time_screen/timePresenter.hpp>  X5 E, Z) {3 m) b
  6. & v; Z' v( r. N/ Q, A
  7. class timeView : public timeViewBase
    2 J4 b6 ]7 T0 g2 W
  8. {
    ' e) E8 P7 R+ ?: F* w
  9. public:
    ; j* o5 \- G& `7 M
  10.     timeView();
    6 ~$ v6 j6 w1 ?; I  H, F2 H
  11.     virtual ~timeView() {}7 |" `% K* }) `6 _: B
  12.     virtual void setupScreen();6 k) y- C" Y3 i
  13.     virtual void tearDownScreen();
    # p& ^% y  P1 h( b' v
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    & x* K" H6 c! ~0 Q5 E9 c
  15. protected:
    6 z+ |. ~7 K  p5 A
  16.     int tickCounter;9 a" o- E: C$ v/ O8 C
  17.     int digitalHours;* t0 l: N, m0 y  c2 t" P
  18.     int digitalMinutes;- x( q9 y& G* z( o. O2 z* R
  19.     int digitalSeconds;
    : u$ B6 x1 B+ m/ G" s
  20. };' a6 W8 s: S( j! O' g" G1 a
  21. " C7 N; G- s7 s
  22. #endif // TIMEVIEW_HPP
    . l7 E. m2 `' V1 [* N+ ~% e% S
复制代码

5 `& V9 U$ r& B+ R$ [1 P5 J7 o这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
. t$ x0 b: S- n% D1 t. G' V$ o* L/ z4 g2 Z
最终效果:8 f9 D% q, p9 {  I

- |2 h5 v! l4 ?) L( ?
! l8 X' u0 X( z  y- K+ w+ M
# E/ G1 I0 v- a+ H
" R7 b% G2 e6 w- a$ D
' O  }9 G4 I. }9 p/ \
收藏 评论0 发布时间:2024-12-27 14:44

举报

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