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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
% Y( E0 U8 E( w6 C([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
8 E- c, f, D( o* t# ] 微信图片_20241227143242.png ( ^# K7 l; H3 C8 {' c* z; Y
之前项目里的时钟是用一个counter慢慢累加:" h* a- `7 [2 P) c) g% Z/ S
  1. void timeView::setupScreen()1 b  l  l3 i/ I
  2. {4 [% h( `4 N  n' Y9 b
  3.     timeViewBase::setupScreen();
      J$ X  q& m8 h- n" |
  4.     digitalHours = digitalClock1.getCurrentHour();: S+ q  }( Z# Q5 M( S6 Y
  5.     digitalMinutes = digitalClock1.getCurrentMinute();8 ]- }9 a! V: k6 d
  6.     digitalSeconds = digitalClock1.getCurrentSecond();
    + |' Y. H9 Y, L! b; @7 c
  7. }& Z0 `: J( T  s# B$ }/ w+ M
  8. 0 ?3 {  m- \( r0 S) s/ K' e5 ~

  9. / H. f% J" \$ k) K( {
  10. void timeView::handleTickEvent()
    $ w: U7 v, F6 g3 v
  11. {  W4 t. _* l$ a- V, {
  12.     tickCounter++;! J+ l8 Q- w9 h* ]' t
  13. # N3 F  K. ?2 F
  14.     if (tickCounter % 60 == 0): B# f  \1 S* ]" N9 V, a/ G6 W. }- W9 ]
  15.     {
    & J! t0 ^" w8 J" E
  16.         if (++digitalSeconds >= 60)5 v9 O" s7 N2 h6 |! K( i
  17.         {: X7 V6 M& x4 u8 K
  18.             digitalSeconds = 0;+ H" o1 v$ J) O
  19.             if (++digitalMinutes >= 60)4 |% |5 c8 g% ?7 k0 v9 k! j% i5 s
  20.             {+ ^2 M/ B1 v2 a6 _7 Q
  21.                 digitalMinutes = 0;9 U1 V8 |6 l# i  m4 U+ }
  22.                 if (++digitalHours >= 24)( Y$ @* z0 U4 j. b* Q7 k
  23.                 {, \2 x' C9 D7 G6 W( N
  24.                     digitalHours = 0;6 A4 g( S( i; t5 D! P: f
  25.                 }
    ' Q% o2 S/ `  f/ o. a+ ~" c: F% B
  26.             }
    ' U% p% ^' s& _9 y+ l
  27.         }
    ' ~0 Z' v, C( `: l+ t

  28. * x& ?& D! P, j. j
  29.         // Update the clock: L1 ]  J' s* r8 m
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);! N# G1 c! Y1 p/ y3 _* P
  31.     }1 v% |7 P0 A% G6 d6 g2 P/ U! S9 X) R
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
& f; Y4 v. b( w) N  S项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
6 T: i1 W6 ?) z7 w0 D) \' K在RTC中使能并设定好时间:2 Y( q* j1 I& Y+ F  t; o  X
微信图片_20241227142423.png 9 V- I) i+ `" i2 z
对应的程序也要需要重写一下:* U1 ?8 e4 A' w- \. P; z0 _7 U8 H
首先要在modelListener.hpp里添加RTC相关函数:
0 r. Z) ]6 P% k$ f3 V! k3 E
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
3 e4 b) H  [3 k, @& ^
  1. extern RTC_TimeTypeDef RTC_Time;( k/ A; E) L. ^, D$ s) z6 [! E0 f4 F
  2. extern RTC_DateTypeDef RTC_Date;4 H; }+ D; \- p. \/ q
  3. extern RTC_HandleTypeDef hrtc;3 p( y, o! F/ \

  4. 6 x2 E5 |8 w* x) z
  5. Model::Model() : modelListener(0)
    ' c% U. y6 {( g# N
  6. {
      I% R. F; K' `" O) P6 M6 k
  7. ! ?4 q" N, q/ y* Z* c! J# @+ `  l
  8. }" f- J$ I  d1 R. j

  9. , O9 O& _! ~" P1 s5 [
  10. void Model::tick()
    6 }" c5 l* M. w( d( Q
  11. {
    % \$ ?% V9 V8 X0 W$ C. n
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    ; t! |* I- Y$ f" t
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);9 B+ p& M' U! {% a9 x. p
  14. 5 K" ?/ i$ G6 x* N/ j
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    & @; h  ^% R- B4 i/ J* V
  16. }5 R0 o; T  k  C, [( W, @. T8 E
复制代码
不要忘了在time里也要再定义一次updateTime函数:! Z1 |' G, C  z! `% j' P3 N
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second), Y1 O( B( {- c
  2. {6 ^# r+ Z5 t% f% T
  3.         view.updateTime(hour,minute,second);
    % J7 s0 H2 K; Z  M% x2 g
  4. }
    , M3 A" N- |& S  d
复制代码
对应的.hpp文件也要定义一次:
! R2 o6 v9 x* K* l7 D0 x$ E3 |
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);- N+ x' E/ f  G) m% [
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
! C3 P5 A9 ^; A; t
  1. void timeView::setupScreen()
    # Q0 J2 Z3 W# {, ~$ l
  2. {. a- I# u% M6 A" W7 L! _) D# E
  3.     timeViewBase::setupScreen();
    - W8 n/ V" u3 }5 Y  N9 j% t
  4.     //digitalHours = digitalClock1.getCurrentHour();
    " D  T' O7 I% @' a$ V! `" A) X
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();; }/ w1 v' |  M# `- f( w) G& I6 j
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();- C: G+ S$ e' w0 @9 A
  7. }
      ~: r2 G3 ~' k

  8. " R4 U% x9 t$ a' t5 a$ Q

  9. 2 L5 s: }# ]  I# a
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second). F  e& z% ?3 O4 g1 s' S+ F
  11. {
    , d2 a0 g* _2 _/ N) t; W
  12.          // Update the clock# @+ R# T6 Y8 ?0 y- E" J
  13.         digitalClock1.setTime24Hour(hour,minute,second);: x' w0 {2 [! g8 E$ i) @5 A$ C

  14. ' w% U# R$ I) b; a. ]& X
  15.     tickCounter++;
    : X* O9 O. e( i6 ]' j

  16. & ]: Q& }  n! L! K; c' L
  17.     if (tickCounter % 60 == 0)
    # m  T% m+ a. `* J# j; j
  18.     {2 P6 S6 \6 A: I' O3 b$ W& r) l
  19.         if (++digitalSeconds >= 60): U( {5 }9 q! W7 Q3 `; O
  20.         {9 Q6 A, _1 v7 w" D
  21.             digitalSeconds = 0;: F. \* X# ~2 ]. z+ `) a3 l1 \! s
  22.             if (++digitalMinutes >= 60)
    7 n5 ]- _5 ?' e  W
  23.             {6 s2 q; R  q& y$ O! @& _
  24.                 digitalMinutes = 0;
    ( L& Z; T5 f/ `0 P! h2 ]6 q
  25.                 if (++digitalHours >= 24)
    3 g1 U, ~; u4 {" x
  26.                 {
    ! q0 A5 \" E& t/ Z3 Q5 P! l
  27.                     digitalHours = 0;5 w3 r( W4 m9 G- Z
  28.                 }
    / L+ j7 W! t# L
  29.             }# R) b' ?. B$ |0 M9 i. P' j
  30.         }6 t$ z& j+ d& N. T$ g
  31.         }# K- `2 r- G8 i/ _+ \, T- _9 n
  32. 1 p/ |$ I! T! R2 [& v- M0 R3 {  \
  33. 9 i; ]  N2 C- Y# c, ~* h
  34. }
复制代码
对应的,hpp里也要修改:
! A% z4 v& o5 t# y' d
  1. #ifndef TIMEVIEW_HPP5 x1 ]! O$ v& n: a$ J
  2. #define TIMEVIEW_HPP+ U0 I7 t+ A! W+ d7 k0 O, \

  3. . _1 x$ o8 b) _# o7 I# p
  4. #include <gui_generated/time_screen/timeViewBase.hpp>% q& I2 o7 P" ?( Z6 |
  5. #include <gui/time_screen/timePresenter.hpp>' Y5 I' n3 ]; I% {& c8 u
  6. ' r; V6 Z. h5 w& ~2 E. @
  7. class timeView : public timeViewBase5 W3 ^* h9 G. t  i) G) T
  8. {
    & d# b. |; [; l0 D# t
  9. public:
    3 E% p9 M8 J0 C: {
  10.     timeView();6 ~- n$ v. t5 R! V  w+ A
  11.     virtual ~timeView() {}
    0 K- V3 j3 i$ P2 L' f
  12.     virtual void setupScreen();
    & e& R, z& U# p/ ~9 _& L2 R% ]. Q* Y
  13.     virtual void tearDownScreen();
    3 H, O0 b1 |1 E
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);7 I. ?  x; T7 R" [
  15. protected:; x4 @; D' j5 A# w: z6 x
  16.     int tickCounter;
    0 m7 ?; M# C" ^! c; G: L
  17.     int digitalHours;
    & e  }8 R% A! P5 I! a1 l
  18.     int digitalMinutes;  K7 @* U" E) b, s- c6 G) y
  19.     int digitalSeconds;
    - ?4 X! N" B4 K! z  y' l  L* `
  20. };" f( N' O) C) m+ R/ r8 ?* }
  21. 3 ?3 g; A+ c, N. H4 F$ w2 C4 H
  22. #endif // TIMEVIEW_HPP
    ; I, _/ k- \1 u" [8 S
复制代码
- u8 |) B  {) E' b. F
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
- ^$ i+ }% @6 M1 W3 D% M/ K. N
& e" v% M0 K) w, y最终效果:8 G1 Y0 P  X$ s" b) `& q

5 W8 F4 c7 _! @) Y0 |& @. J  v, s5 b! X+ w3 B3 q

1 F7 c) T6 r( e; U0 `: o5 l4 M8 B' z8 L- |; H+ C* V7 G( X. u

( b/ @. P" i4 r+ |( t" j
收藏 评论0 发布时间:2024-12-27 14:44

举报

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