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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
8 A. P+ ~0 N: J) P3 r([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
& K% L1 ?: C: u( B9 t2 a5 S 微信图片_20241227143242.png
% u6 {1 o" M/ E7 @! w5 t之前项目里的时钟是用一个counter慢慢累加:, N1 W: b( x. Z& Z4 K
  1. void timeView::setupScreen()
    ! ~+ ?% D! J3 X" ^1 p
  2. {
    9 V; ^- u& A6 z2 \# n
  3.     timeViewBase::setupScreen();; y: Q' z8 f0 \) h0 O0 p
  4.     digitalHours = digitalClock1.getCurrentHour();
    4 J* A& r: G" ]
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    6 O$ l, _. W. H8 T
  6.     digitalSeconds = digitalClock1.getCurrentSecond();: M! |) M% I: a: S
  7. }
    % p* O9 `, a4 k, i

  8. ) ?8 R# ^: m9 E8 w% F
  9. 8 W" `, z. M# z
  10. void timeView::handleTickEvent()
    ' @; m, n/ `5 i& t
  11. {3 M/ B  @* B' u: Q0 F# E+ g1 y
  12.     tickCounter++;
    + d. Y& M' o" U" E6 [) B
  13. $ W0 B+ B2 x, }& P
  14.     if (tickCounter % 60 == 0)
    ' q6 S# C: b4 h/ W" i5 J9 I7 Z  Z
  15.     {7 t, ?" [' [# i. ?3 }
  16.         if (++digitalSeconds >= 60)
    2 U5 r; {0 n* a& M) \& j8 z  u
  17.         {
    ) l0 `- _3 v4 V" O9 m
  18.             digitalSeconds = 0;
    ' \' u3 c' P( g3 l$ R: n, n
  19.             if (++digitalMinutes >= 60)
    : x  s, D8 Z% K( d4 x: ?
  20.             {
    4 l0 e( o- @$ ~2 F2 j% r
  21.                 digitalMinutes = 0;" I& W8 B( j' A2 g/ d' G
  22.                 if (++digitalHours >= 24)
    $ c: A# [. K+ C
  23.                 {/ O7 e$ {+ z1 l; ^& o6 r
  24.                     digitalHours = 0;3 [) f/ ]' p6 _9 Y8 B3 Q# d/ [6 `2 T2 J
  25.                 }! T3 Q) E( ]4 i* d" b9 r' c2 ]* K2 P
  26.             }
    9 k* T+ _1 B% V* @! n
  27.         }5 V# b% X$ N& S8 o% |4 h9 S5 ^5 T

  28. 2 S: H2 ~4 r" J9 K
  29.         // Update the clock6 `7 I& Z3 F* Y, Y6 L9 z: z( I
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    6 p' ]0 k* p( E$ e0 A
  31.     }
    / Q, j* ?8 q( D2 ~( i- v) ^& j
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
/ k* P7 G' h4 ]5 x项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
  K# S* M9 o8 S& U* a: i2 a在RTC中使能并设定好时间:
( y; {0 }& ]9 H0 J. u% `/ a5 N 微信图片_20241227142423.png 8 m( F8 d  V+ n8 o, ^: b- r
对应的程序也要需要重写一下:/ z1 \2 m! n& _
首先要在modelListener.hpp里添加RTC相关函数:
. T4 [8 z: X+ w1 b, l
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。3 P4 o+ p/ S* P" j% Y
  1. extern RTC_TimeTypeDef RTC_Time;( C$ p. p, ?7 V
  2. extern RTC_DateTypeDef RTC_Date;7 g5 w: _9 f( g, x6 [. s/ Q
  3. extern RTC_HandleTypeDef hrtc;! e3 k% K$ r! p! d( K+ B% }( q" J4 r0 |% e

  4. / v7 ~% N& k1 W( v  t
  5. Model::Model() : modelListener(0)
    / @. Y7 @8 \% v' k" k( _
  6. {
    0 Q- u' y5 @, C3 [
  7. ) f8 S! X" _$ M! X" x% e- t( Y1 Z& I
  8. }& C: v( N0 a( D% s5 q' z7 F& m
  9. # b/ y8 |  n  ~
  10. void Model::tick()
    . ?. y4 X2 z  E" O7 \" o
  11. {
    . f; S0 P$ a& ?
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    * \, g9 b& M2 ~3 {6 R0 I4 Y
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    $ j2 n$ A- A; u- [

  14. 5 I6 W. L+ \& j. C0 \, }
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    . I: }) O1 u5 Q
  16. }% h- Q3 H# ?9 I
复制代码
不要忘了在time里也要再定义一次updateTime函数:2 L' y$ s) X( D5 n6 p6 Z% T
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    & w) Z- h/ l" [4 s8 d
  2. {9 O9 ]5 T7 n' r, D( g) o
  3.         view.updateTime(hour,minute,second);
    . j, I7 ^& j( L2 P& q0 a8 Q9 i( V9 g
  4. }7 Q$ g, Q& y9 D0 M
复制代码
对应的.hpp文件也要定义一次:. V, F) c9 A) U  }# a
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);7 r( a* f7 }$ k: [( r, [6 ^; H& V
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
7 K3 i8 R% b# u3 Y/ _, k& c
  1. void timeView::setupScreen()
    ! U/ @7 a  f* A0 _! h# l0 S2 X, W% `
  2. {4 l# ?' }1 [+ c! t+ u& T6 y/ {
  3.     timeViewBase::setupScreen();
      O: W3 W: {. _, W0 O
  4.     //digitalHours = digitalClock1.getCurrentHour();  A$ D1 D8 M: v* s1 ~4 n3 P& t
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();, n5 ]" Y4 K5 k6 z1 i8 W
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    4 R0 C4 G0 ~0 Z
  7. }% Y1 c- ^# z: r7 ]) a/ G
  8. 5 e9 {$ l5 p- Y: i% S& Q
  9. $ n6 w# p" F$ g* S% y8 b
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    1 d4 [/ I; I8 ^9 ~$ B( u
  11. {2 _! z& _4 L4 t
  12.          // Update the clock1 X% B; q9 W6 V  y+ ?
  13.         digitalClock1.setTime24Hour(hour,minute,second);, z* K' v/ U& z* z$ W; Z3 Z+ t( K

  14. 9 a! @3 x! k& I, z9 L+ q* R
  15.     tickCounter++;
    $ h- Z% A; s6 o% M9 r+ S) ?' F
  16. - s+ W1 ?2 g2 E" u6 |2 S
  17.     if (tickCounter % 60 == 0)
    ! i: t3 e+ D- B7 v  R
  18.     {- P; H6 X7 _1 R- o
  19.         if (++digitalSeconds >= 60)
    8 ?* M  V, x  A2 k- J9 P9 T  D# f+ ?6 u; W
  20.         {: B$ |/ K" w) |0 _
  21.             digitalSeconds = 0;% ?  V" H& H) Q9 b! D
  22.             if (++digitalMinutes >= 60)
    5 f* Q! G! l4 R
  23.             {' k# K# i2 f6 x& \
  24.                 digitalMinutes = 0;$ [5 t* Y. k; u6 B6 `1 t2 t2 h
  25.                 if (++digitalHours >= 24); S: I4 I7 [/ L! r% ?/ R8 h
  26.                 {5 {6 T9 \& {( q
  27.                     digitalHours = 0;
    1 W1 V# t! L! ]' O9 E5 ]4 t
  28.                 }
    ( X4 x! r* Y+ G4 ^8 T& V
  29.             }) _8 e# T% O0 a
  30.         }
    4 `$ r( E4 g0 ]1 W8 o' L  A8 U( J& u
  31.         }0 Z# E6 _: ~+ b( G% H

  32. ' b5 O3 d8 y6 N
  33. " _1 H4 E# D; a( a
  34. }
复制代码
对应的,hpp里也要修改:/ `; E+ n  p/ @. r. `+ M/ x( ?
  1. #ifndef TIMEVIEW_HPP
    : L8 O  K8 {2 W/ i! g
  2. #define TIMEVIEW_HPP, K. h8 f% I5 w' j5 z

  3. 4 i1 {: p& r3 M+ s- R
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
      w! L2 B$ R" S( X1 C, }
  5. #include <gui/time_screen/timePresenter.hpp>- ^4 U& y! t1 w3 ~7 f
  6.   s% X; p- x( Z' j% Y( K
  7. class timeView : public timeViewBase; z6 Q! T. O. v; ^
  8. {
    " O6 T$ t; C3 g8 X
  9. public:
    ; s% v0 ~" d$ i4 v# i: u
  10.     timeView();
    * G( P/ ~* M- z+ J$ m5 H6 Z7 a
  11.     virtual ~timeView() {}, N6 d0 r* [" `
  12.     virtual void setupScreen();! P! Y( h, a1 t" r( R
  13.     virtual void tearDownScreen();
    0 L; D, s* Y0 Y% i, s
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    $ G1 N7 Z0 M- L: S' d8 K0 J
  15. protected:
    / v  H  Q4 X2 D" l9 v1 v7 {% V; T
  16.     int tickCounter;
    * g8 I: H* t$ O3 ~
  17.     int digitalHours;5 E* O0 h$ B; _- F, F! }
  18.     int digitalMinutes;* W" l: K% p" i9 n8 G$ s
  19.     int digitalSeconds;
    5 @' E: I5 ~/ `6 f% c
  20. };
    4 A# @2 k' x! l: {! ^# O

  21. 1 R9 i, y$ K) B, x
  22. #endif // TIMEVIEW_HPP
    * ^. E6 `) R* r" L
复制代码
% r4 ]4 L! B5 U% X  n) j- O' ^
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。" ^+ }' K* f9 i$ ~$ M

8 b' o( l& U" J0 G: _; l最终效果:
' u3 n6 Y7 I+ T2 u2 R/ s( w' S+ c( V
! q; F3 k: k' n1 \: H8 W

. ^$ k: @: p/ I5 p8 s  _3 u
; a% _2 r4 \. P# m9 A( P. g
' N7 M5 l" Y; n4 |; b/ `1 E: k! z4 A
收藏 评论0 发布时间:2024-12-27 14:44

举报

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