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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
# Y& s: S" v/ a4 G, V& ?0 \([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
0 X+ E2 L+ V& Z9 K 微信图片_20241227143242.png ) t1 M2 p/ W4 w& ~* P. G8 g" e; z
之前项目里的时钟是用一个counter慢慢累加:
8 T" E; `& l2 a! ?! z% g: f9 [& n8 D: p
  1. void timeView::setupScreen()
    / L" ~8 {' v4 K  B. W
  2. {% j# ]9 r. o* v9 ^% v/ S
  3.     timeViewBase::setupScreen();: \* L$ m/ r; ~1 S7 n
  4.     digitalHours = digitalClock1.getCurrentHour();
      d3 o: A( _( Q
  5.     digitalMinutes = digitalClock1.getCurrentMinute();0 z' v! b. U2 n9 z( o6 x% F
  6.     digitalSeconds = digitalClock1.getCurrentSecond();
    3 V7 F* b/ Y8 N4 J* K
  7. }
    4 O2 B/ B5 }: v, J
  8. ( g: ]0 X* t* H4 R5 Y4 J" i
  9. ) M" w7 `4 K  b3 M9 H
  10. void timeView::handleTickEvent()/ E$ {4 z. [' E% T
  11. {3 w6 b  D& g5 j0 k, H
  12.     tickCounter++;8 u$ s# h* V' t: J9 @
  13. ' y; e, @' }& A" ?% v
  14.     if (tickCounter % 60 == 0)
    8 B$ |( c3 y. b& t
  15.     {. ^! O, \: H- h
  16.         if (++digitalSeconds >= 60); E- K) i+ f# k. Q# U- Z
  17.         {
    ; l! N& k3 z; X8 u2 k3 O
  18.             digitalSeconds = 0;
    $ L- F9 h2 ~. g0 s0 m& m
  19.             if (++digitalMinutes >= 60)" i9 ^- g7 F; c4 p" q2 ~) W+ _
  20.             {
    * l% z7 ?6 \) s
  21.                 digitalMinutes = 0;
    : s/ m+ ^6 v& g0 Y- N' ]& W3 k
  22.                 if (++digitalHours >= 24)0 q" b3 `; C$ C# [& |. H5 F0 t
  23.                 {- v0 {& n6 @4 l
  24.                     digitalHours = 0;
    ) s) g; x' k4 b9 j. U5 f$ O
  25.                 }
    / a) @- P$ z& C& y( Q
  26.             }% _) p& @5 R& c/ ^$ E
  27.         }
    # k: Z* `9 G! j
  28. & s+ q9 i0 D9 X) B. t) o9 e
  29.         // Update the clock
    4 n! P" I0 b) F# W) [* _9 p6 `
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);: R* _9 V7 H  B8 M. `9 h
  31.     }1 e" t4 g* d1 C) D
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
! ~9 h! X! G" Q  t. x  t" j项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
# Q: @/ c: m2 |7 @9 a  N在RTC中使能并设定好时间:0 i7 {8 S$ u8 t# H, U, K
微信图片_20241227142423.png
3 l6 @  t; e* D! D% m对应的程序也要需要重写一下:
: X3 n& |4 O# m# s% D( d首先要在modelListener.hpp里添加RTC相关函数:3 S; y& B2 x( x6 r" ]5 {
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
' |% U  I; ^' q& T& Q# H
  1. extern RTC_TimeTypeDef RTC_Time;
    2 i; i- i0 i- o
  2. extern RTC_DateTypeDef RTC_Date;  y% O. e7 w5 K# o% w6 F
  3. extern RTC_HandleTypeDef hrtc;
    1 T% c1 ]* N2 t) z6 s8 r0 y. K* O' ?3 w
  4. ( v/ `; P/ u# }' A
  5. Model::Model() : modelListener(0); ]5 L7 Z) R* S- @' C% ]
  6. {2 ~# M$ G" c( t6 j3 n" [
  7.   M5 t- \. z; G( D2 B
  8. }
    5 B6 J1 [; U9 V' e* A2 L4 Q( e
  9. 8 j, o+ Z; j3 X
  10. void Model::tick(): l) y& r& e& Z% |& v
  11. {8 d0 `. q5 B& X0 T1 x
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);5 e  f) x  ^5 h% I) n2 ?( z
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    ; K* w+ l* n. H- h/ N

  14. 4 j2 G; {  y# e7 z, [4 g# Q
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);# ]; ?' }1 J+ z" l' e1 s' A0 z/ c8 N
  16. }5 Z5 K3 x( `# ]. s5 C* j, g0 w
复制代码
不要忘了在time里也要再定义一次updateTime函数:. X$ g! [% V# C
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)8 Q- y2 ^, r3 j: D+ a6 j" F" |" r
  2. {* |5 P9 }) T- V( e: {1 L/ ~
  3.         view.updateTime(hour,minute,second);
    . d0 ]  N5 b0 e5 |2 C. k- M) {
  4. }  E4 \* N. k6 l9 s2 S9 D3 _+ @1 ?- U. K
复制代码
对应的.hpp文件也要定义一次:
9 F1 Y8 H/ q- b! {" J0 t* Z
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    : Z  ~: I6 r+ L$ V: `& z
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间# {  N. {  s3 s8 a' y$ |/ q
  1. void timeView::setupScreen()7 j  I9 ~, \; C& q, k8 C
  2. {
    6 a. N% s, |3 K6 }- P5 [
  3.     timeViewBase::setupScreen();
    ! X8 _5 H+ K1 \1 ]8 ~2 s% ?
  4.     //digitalHours = digitalClock1.getCurrentHour();
    & i- r, I- s4 h1 R
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();1 r2 i: a" X" X& {) {6 P
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();9 e1 C+ k3 _$ ^3 R
  7. }
    - N- w6 |4 X* v) y

  8. 6 E6 e4 x2 T" k. e

  9. + T- `! }% A5 I) d" Y5 G
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    / L0 x5 F  b+ b( C
  11. {
    ! o( d* A8 M! d
  12.          // Update the clock
    + ]  [+ z  X, ]
  13.         digitalClock1.setTime24Hour(hour,minute,second);
    4 F- [7 c& D% j9 l3 |+ A! e9 o# q

  14. ) A  c$ u$ {( I+ C& {# I. p
  15.     tickCounter++;
    % M- P8 M: Y% x4 Q* |5 M% N5 Q9 b- p

  16. 0 Y- U6 x8 z3 l' A: e+ o
  17.     if (tickCounter % 60 == 0)
    1 M/ x; N4 c4 {. ?7 W
  18.     {
    ! t3 w) e3 T+ K3 o
  19.         if (++digitalSeconds >= 60)# s5 u# x! W( y& x8 [. I, @$ F
  20.         {
      p: Z3 s8 k- [7 m! e+ A9 N  T
  21.             digitalSeconds = 0;
    / T3 n5 |6 h0 j$ M, S. c& L
  22.             if (++digitalMinutes >= 60)+ |/ g9 f  M3 j6 ^0 c
  23.             {
    0 c; Z* C$ w8 f4 C2 r& q. w6 I
  24.                 digitalMinutes = 0;
    ( O1 O/ J1 R  I/ }
  25.                 if (++digitalHours >= 24)
    ( I2 ]* U( h7 Y9 ?3 D, h
  26.                 {
    $ j! n9 z  b' x. ~
  27.                     digitalHours = 0;
    8 \: R4 L9 C, v8 T% Y
  28.                 }& j6 |6 p0 E7 c% ?- b
  29.             }
    . I: M& E& H* b% {( S' L8 y
  30.         }$ u8 A9 Q: Z. C- H7 M3 u
  31.         }6 s8 Y  W" P+ B, @- S& [3 m9 ?
  32. # j4 ?. Y( n0 Q" r; ]5 w: ]

  33. . ]2 I; U  C  E  Y3 g# P
  34. }
复制代码
对应的,hpp里也要修改:" v5 i$ A; }" |9 I- Y1 K
  1. #ifndef TIMEVIEW_HPP. y* h$ {" W& b
  2. #define TIMEVIEW_HPP
    1 q& p) `0 T! O8 R3 n
  3. , A# w' t' G  L& ?
  4. #include <gui_generated/time_screen/timeViewBase.hpp>; K9 t- x: W4 K+ v" E
  5. #include <gui/time_screen/timePresenter.hpp>
    ) w+ t% T7 o4 w' P4 }8 h

  6. " F! m5 N: G9 Y, p
  7. class timeView : public timeViewBase
    # W) ]2 k: @" s+ Q  }
  8. {- c2 j& |# C4 ^+ a3 d
  9. public:- A) i4 a( |4 d& Q( u) t3 G
  10.     timeView();
    " ]; a2 I- c7 e* }
  11.     virtual ~timeView() {}
    / W* E3 ^4 y( J3 _9 l
  12.     virtual void setupScreen();, @- o; p, C+ @4 l2 g) W
  13.     virtual void tearDownScreen();
    8 d# ]! `3 Y3 Y7 J- S  \
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);. M3 e: D4 D. a$ U- H9 a6 Q# l# `
  15. protected:+ g# K: z3 _) L2 g, v' z% g/ d5 O
  16.     int tickCounter;7 X/ G3 R$ q0 L- L( ?: G7 V3 y- L8 D
  17.     int digitalHours;0 F% F! a" I& b. T: O
  18.     int digitalMinutes;
    ) b1 b5 C# j! x: P2 a4 N
  19.     int digitalSeconds;
    4 i* d3 x5 i# h! K. _
  20. };: S+ S  V0 \; Z6 E5 m1 w9 z
  21. $ X8 @. B! {. b9 {7 D/ w3 w$ S8 H
  22. #endif // TIMEVIEW_HPP
    : W3 Q8 w$ G  W% i/ d' j# `
复制代码
; ?. t- _* T2 p' L4 w/ J0 m/ g
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。! V# L9 N7 ?/ Q. t

8 B2 t! a  t: c最终效果:+ v4 _! O$ W7 j& ]) S0 j

% o) J. b2 q) D' e" M, n2 U8 q7 L; f
3 h2 E! }) O* m$ x% Q% r
- s8 P0 U( t  a) d, Z; K4 ?
* o/ W! X& Y5 Y, D* f! X. j( `: Q
赞 收藏 评论0 发布时间:2024-12-27 14:44

举报

0个回答

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版