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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。1 _. C2 v4 D, x- {" X) _
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html)), Z, N2 }" r  R* f* h# o
微信图片_20241227143242.png 7 h1 e7 x7 p( Q6 i1 d
之前项目里的时钟是用一个counter慢慢累加:. s7 R+ ?( j+ \$ h) L5 U- q
  1. void timeView::setupScreen()
    4 U# l3 b  L/ F
  2. {
    2 f" |+ l, [+ _( L: ?  l
  3.     timeViewBase::setupScreen();$ y: y! X9 I0 J. F  h$ e
  4.     digitalHours = digitalClock1.getCurrentHour();
    7 R0 V6 g4 {7 x. v' B
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    6 c$ ]" @# G# ~% k5 ]
  6.     digitalSeconds = digitalClock1.getCurrentSecond();/ x& g5 g) e1 d# O2 M6 e9 Z
  7. }6 ^# S& l0 ^9 s3 X. ]+ [; l) N/ }: X
  8. ( Q( u5 ~3 t! u; J
  9. 7 u  b( P4 q, x# g
  10. void timeView::handleTickEvent()
    ( G* x7 y2 p; j' w
  11. {; K0 }* s% X' _- n" S3 K+ K. k
  12.     tickCounter++;
    / Q$ e3 T( W% A- q) {. c/ O

  13. % a" N. M6 C2 q
  14.     if (tickCounter % 60 == 0)3 Q# u$ y, U6 O
  15.     {9 _& v) Z' [/ t
  16.         if (++digitalSeconds >= 60)
    , E, a6 ]( f, i4 S1 T& ^2 o4 {$ @& E
  17.         {
    9 a: z9 x" _6 g; B+ D9 {/ w- d: T
  18.             digitalSeconds = 0;* I: m+ @# N$ x) a1 p8 G* z2 A
  19.             if (++digitalMinutes >= 60)1 C0 c3 ]1 T5 U  e2 P$ @0 X
  20.             {% [3 Z% z& t, Z1 p
  21.                 digitalMinutes = 0;
    ( _- |+ D7 H! [  r
  22.                 if (++digitalHours >= 24): J% i/ I2 N7 p: E9 f
  23.                 {
    & G! M- `/ c2 j8 ]$ \! ?! p
  24.                     digitalHours = 0;3 n6 Q+ B+ {# x2 r8 @- n
  25.                 }: b# `7 a  I3 e5 s
  26.             }
    & ^, I& J( M% k3 g2 o" F
  27.         }
    , z/ t4 H3 y: \0 @

  28. 1 Q" v/ q  a3 u9 [- ~  n3 j, H+ g
  29.         // Update the clock, u' ]7 L0 X) Z9 m3 |
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);- @% I5 U8 R* P4 z- v7 o  Q
  31.     }
    - ^# x4 b* b/ y) U& T
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
( _" e; d2 g1 m* _4 d/ @" y0 r8 {项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
3 P, t9 ]5 w, E# O$ i; ^' Q; Z在RTC中使能并设定好时间:
% @2 Z! P0 M0 g0 z 微信图片_20241227142423.png 3 }5 t1 n( {9 B& P3 w7 R' @( e8 k
对应的程序也要需要重写一下:: l; O- T  v% m3 b( W7 X
首先要在modelListener.hpp里添加RTC相关函数:0 K( K4 [) C* y2 s2 U  Q
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。4 s2 M( x8 t7 v# e- D
  1. extern RTC_TimeTypeDef RTC_Time;1 E' A+ J9 k0 y% t4 a
  2. extern RTC_DateTypeDef RTC_Date;$ L# x5 L) ~8 l% S2 p6 j; n! V# l
  3. extern RTC_HandleTypeDef hrtc;
      c; i+ C0 }* Z9 u

  4. 4 u  {3 O# o' S
  5. Model::Model() : modelListener(0)" e- D: K& \0 L3 J; J/ |
  6. {
    8 S7 j0 i/ x6 J/ y0 E3 ~" r
  7. . D, }; T  d0 h% Z1 F
  8. }
    / h5 p2 X+ x( N! S- s; M

  9. $ F1 \$ w# f9 `3 q
  10. void Model::tick()
    4 L' N) \: ~' E1 c: A  s
  11. {
    / R, Q$ W& J; N( Y  R( D. K' G* W
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);$ r/ x. i1 w# v; j0 k3 |2 J! D, R$ f$ ^! I
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    9 {6 g0 @$ U; p' `

  14. 3 x6 R: @& O4 e) J8 V2 l
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    6 }/ ^; i' S, {. C9 X
  16. }6 k" z" `" z2 d
复制代码
不要忘了在time里也要再定义一次updateTime函数:
/ b, d  `% \2 \+ ]9 t' N
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    ( @5 b/ F- z; f+ R
  2. {
    8 j9 A, c- J0 [  E( F4 Z- z
  3.         view.updateTime(hour,minute,second);% b: _! |1 k8 W7 G' Y
  4. }
    ! @9 C+ R* K1 v0 ?) r
复制代码
对应的.hpp文件也要定义一次:5 g/ l$ y* E6 w3 J! e6 l
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);3 x* u2 u8 U! V  e! W- J
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间( J' W6 f% b" q( U. }1 S
  1. void timeView::setupScreen()9 @+ r3 S9 J7 y8 W
  2. {
    , U2 a# i9 `# `& _: @
  3.     timeViewBase::setupScreen();. c' W  t3 h* c0 s5 A4 O- X
  4.     //digitalHours = digitalClock1.getCurrentHour();
    ( e: I; u  }3 g( n: j# ?( m% \
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();, }# M8 }6 n( ?8 k$ K. ?) o6 n
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    0 X, B* i0 Q' A! y* q% y7 K9 d" v
  7. }
    $ S4 E* Q# m3 J. D9 v: u1 ^
  8. # N. ?0 R9 ]4 L5 b, d+ W

  9. # U3 a1 R: u5 P- r# X$ U4 |3 K3 {
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)* ^& ^- v! _+ _, Y+ j; I  _0 ^
  11. {
    0 ^; u+ M* [; S
  12.          // Update the clock. L! G1 v( W- T  C  R* {
  13.         digitalClock1.setTime24Hour(hour,minute,second);  J" H, t! n  h  b+ Z# E
  14. 3 C% p% x! q( P# i
  15.     tickCounter++;0 a) m! F5 \8 K0 c: K
  16. . Y1 |" |5 K4 O
  17.     if (tickCounter % 60 == 0)
    2 e) n$ P& _. f" }' ^3 Z
  18.     {" |8 j+ U5 F9 C4 f, v
  19.         if (++digitalSeconds >= 60)8 v- u4 E0 g+ P* q9 x
  20.         {
    7 _. T# ?7 }7 e/ b) M
  21.             digitalSeconds = 0;
    6 G6 p) n. v/ h- Y) r0 W" j2 ^: B, r6 {: G
  22.             if (++digitalMinutes >= 60)
    ' P+ M* p/ N2 V" [2 j: R5 z
  23.             {
    % L- R) X$ s+ ^( z* d
  24.                 digitalMinutes = 0;5 v3 X; A4 a% B5 q# Q! {
  25.                 if (++digitalHours >= 24)
    + Y+ m0 c/ Z( p) I
  26.                 {. B% \8 b- n9 h
  27.                     digitalHours = 0;
    . O. |4 c2 X  K5 b6 Y# V& ]
  28.                 }8 \. o0 z6 u0 A3 Y/ B6 y
  29.             }) o4 i0 z( s9 M& x% |5 u+ d
  30.         }
    % z+ ~& \( c, v  M! M
  31.         }
    0 f0 b9 Z7 ?) y- @' ~1 }

  32. & c/ M' I. y" Y- P5 x
  33. $ ]1 D5 X! H# M; P, k
  34. }
复制代码
对应的,hpp里也要修改:& K+ {7 J8 a. j) q- `
  1. #ifndef TIMEVIEW_HPP# a8 M( d6 j5 v9 I  p
  2. #define TIMEVIEW_HPP
    1 O# O" d8 V7 U" c+ y# O; U
  3. & H# Y: ]! r# g- T
  4. #include <gui_generated/time_screen/timeViewBase.hpp>& }* w5 _/ G+ ]8 e
  5. #include <gui/time_screen/timePresenter.hpp>
    6 `8 p0 k5 e' u( C
  6. " w. g0 j& s: r  s7 |4 A2 r
  7. class timeView : public timeViewBase7 ?+ B+ x- ], [9 e: q
  8. {' l( q# t$ F: i: r
  9. public:
    6 U1 P& x# U! d. E) _7 D
  10.     timeView();2 B9 t7 x+ }5 r1 N
  11.     virtual ~timeView() {}
    ( j1 P/ `) l! N$ m% M
  12.     virtual void setupScreen();1 W, b$ X4 ^) \/ X5 C! D% p
  13.     virtual void tearDownScreen();
    % D& s7 n# k$ O# U; r8 U( D
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);4 p3 {( s" W4 X* b
  15. protected:
    ; G; L  ?8 o  z% T% T
  16.     int tickCounter;
    ' \" [& q- j" n' A) S) h
  17.     int digitalHours;" u) G5 T( ]# f% d
  18.     int digitalMinutes;
    9 b/ E, h  |" D% m
  19.     int digitalSeconds;
    . t# g1 U: D; G7 V8 Y
  20. };5 v4 O# D+ ]) e: y' _$ t2 a  T
  21. : ^& T7 \; C$ V1 `
  22. #endif // TIMEVIEW_HPP
    " W6 a# B, Z" b' {; ]
复制代码
8 e$ e" l6 r+ C  J! k
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
, _" k9 M  E% h5 z; l( ?4 A# }4 }3 T. i6 H4 _
最终效果:) n% G+ Z1 e" G) j% _1 _0 W& m

+ l# J% l6 `$ H/ T+ B5 r. u! U
, i- |, R: e( o0 t2 Y
  l5 h+ f+ K! e) M% {( H: Y  @; x1 ^) m& t% ?5 a5 L) k: N5 H

3 @7 ^1 f$ A3 @& Z" f5 C
收藏 评论0 发布时间:2024-12-27 14:44

举报

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