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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。8 r; d2 t" g0 ?1 [; C& v! |, O) L& X
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
( g/ k& \+ {6 e 微信图片_20241227143242.png ) i, o' H+ V; [2 N) W7 s6 N' N* @" n
之前项目里的时钟是用一个counter慢慢累加:3 z2 Z/ P" z, w  g8 d9 n) r" F3 N
  1. void timeView::setupScreen()
    $ `- n. {0 D, k
  2. {
    0 V7 w7 _, D5 U3 [) p. N$ j
  3.     timeViewBase::setupScreen();
    - D1 w5 m( K$ U- q3 w  ?% H& g8 z
  4.     digitalHours = digitalClock1.getCurrentHour();" v+ N. }3 Z4 F. t, m
  5.     digitalMinutes = digitalClock1.getCurrentMinute();) _; f6 |  Q1 l& w2 ~8 \
  6.     digitalSeconds = digitalClock1.getCurrentSecond();' M0 Y; h/ i7 b  z( k
  7. }) ?; e0 F" U' [5 B& K% V2 U. F

  8. $ u  p+ \: ^! f3 S; R2 [7 F; P" F
  9. 6 T% v* Q" `5 V/ v- k  z, v# O
  10. void timeView::handleTickEvent()
    , Z0 K* q0 C' K( r! }+ S( d. _
  11. {
    ; y; _$ I! a: U# D  P+ ~& Q4 T
  12.     tickCounter++;/ r7 c9 T" t. M$ @  M9 h

  13. 2 Q2 G! g6 U5 p- z( u
  14.     if (tickCounter % 60 == 0)
    * @3 t7 A+ i6 P0 l* p! F
  15.     {- Q3 n& H( G' H% E0 }7 L
  16.         if (++digitalSeconds >= 60)& S" V" C- w4 e
  17.         {
    9 U! `  V& B7 T. }
  18.             digitalSeconds = 0;
    7 ]) n. {/ R$ [
  19.             if (++digitalMinutes >= 60)
    1 Q# |: b# h  X# K* T2 e
  20.             {
    . r+ P; y4 ~1 W0 a' t3 c  |3 c
  21.                 digitalMinutes = 0;* o6 F/ L5 E" V' r2 p& u7 u* |
  22.                 if (++digitalHours >= 24)
    ) T, S1 V; I! i% U9 g
  23.                 {
    7 |$ K, K. Z7 c' I8 C
  24.                     digitalHours = 0;2 _: Y8 @5 @4 _( [) Z* r
  25.                 }% L' C- j' X- {  v& Z: z
  26.             }
    " f* R: |2 P: W  \2 F  b0 D
  27.         }
      Z# S* [* z$ h( U- s: p" Q
  28. 3 f. A! V  ^* y6 ]+ k. l, Y
  29.         // Update the clock6 v) L) P: K( x: g6 v. M9 Z: y
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);
    & L1 h) u- e- W: I
  31.     }
    4 p0 T2 d  {/ @2 o" C  F, c
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,$ k/ f3 N; [  g4 l* `
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。
0 z& j' M3 A, Y在RTC中使能并设定好时间:
3 V+ y  O* X# @2 b 微信图片_20241227142423.png : m) B. L, m0 g8 j# K
对应的程序也要需要重写一下:- {3 _, \5 a* b4 g7 Z
首先要在modelListener.hpp里添加RTC相关函数:
' Z* y3 W# j) o+ y5 C( r0 Q
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。; m' A6 e2 _: ~% n" g9 M& ~# t3 b5 S3 y
  1. extern RTC_TimeTypeDef RTC_Time;
    7 @1 s/ J5 E1 ^) E$ J
  2. extern RTC_DateTypeDef RTC_Date;) X2 P" ^3 e& i* @' X. L- F( [
  3. extern RTC_HandleTypeDef hrtc;0 t( a. j- X! O9 R. N1 q6 ^8 B

  4. , v0 |0 ~8 X, W2 B3 K! U+ ~% F7 R
  5. Model::Model() : modelListener(0)5 J# }. E& W1 t( E6 f; n( b# c
  6. {5 }: h; y1 x# M; ]9 b$ k* `

  7. 6 s9 K- r; |$ \% S( `7 w* w
  8. }+ [" ~/ q+ v0 }8 F! T+ r1 x$ t
  9. 2 J! G6 `! j0 @$ h8 T9 y% a, J
  10. void Model::tick(), L) m2 e  Q: \, H1 h  }- [7 H
  11. {
    ! E3 o! Y$ Q& j9 {$ x2 A3 R& i
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    " p/ A, C0 ~( c+ h% y2 o* N5 o
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    ' d- l0 Z& Y( W3 P2 U2 B

  14. . I! o' q3 E6 k, i: C
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    & C* z7 s  q" j& a: r
  16. }, I5 H* p1 f% l+ s
复制代码
不要忘了在time里也要再定义一次updateTime函数:* l# s9 q6 s5 `4 P! |. P
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    : ]# s1 o* {, W* @- A
  2. {4 p+ r/ i( K6 }4 e7 x  d
  3.         view.updateTime(hour,minute,second);
    % ]% H0 b& o- c+ Q# d7 O. P& m1 S2 X2 t
  4. }6 o0 C- g; ?' `1 m/ @( E
复制代码
对应的.hpp文件也要定义一次:
. W" A: V( g: E0 a
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);) B3 V1 ?( S/ \( l. l" f
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间
4 h. b* j+ B$ |+ ^  o
  1. void timeView::setupScreen()
    * W- C7 r5 x* Q% U, D' n
  2. {
    ' b" u# O3 J" A5 k! _2 i( l, D' V' g
  3.     timeViewBase::setupScreen();) [6 N5 w7 `% c+ ^5 b
  4.     //digitalHours = digitalClock1.getCurrentHour();
    9 e  n1 M# L6 G5 q9 X6 B$ S
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();/ P/ x5 [; K" W2 N" ]/ E
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    . K4 N. J# [& |7 b, w" P& F! n
  7. }
    % V7 {6 n7 \( J

  8. 7 g7 S9 d6 C1 A& h
  9. 8 k& F, s. Q% y) n, H7 e0 M" z
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)1 C) x8 o' D  X& q
  11. {
    2 A0 U) w3 q2 c; K
  12.          // Update the clock$ N) F* T. h$ u- b, ]
  13.         digitalClock1.setTime24Hour(hour,minute,second);) @& U/ L7 @; n0 _3 B5 }) l- X% R" f
  14. 3 r+ {- d8 ?, Q+ |7 o' }& w
  15.     tickCounter++;
    , Q; s/ i9 s; u8 F8 W; f
  16. # k6 L) s& K  T4 L4 ^# s! r, ]: U, `
  17.     if (tickCounter % 60 == 0)0 t( o: W, @3 G9 Q  W
  18.     {
    + ?: H: p: Z( e/ V6 o, J, K7 o& @" W
  19.         if (++digitalSeconds >= 60)
    8 B/ ^, z/ D. ^$ A/ m* J+ f" z3 C! t2 {
  20.         {; R- j' D7 o. \! H
  21.             digitalSeconds = 0;
    : y9 p: @" z- n: M, E3 G- P
  22.             if (++digitalMinutes >= 60)
      O, F% p+ `0 U* _- i6 Q
  23.             {/ ?3 ]: |, \! `2 A8 i0 B# x. x
  24.                 digitalMinutes = 0;/ _: h; X( C; F' k
  25.                 if (++digitalHours >= 24): ?( N% A, F* Q' w% A3 ?: P
  26.                 {, Z) `( D5 n1 g7 e7 {. w- f) k
  27.                     digitalHours = 0;
      }+ E8 \/ ]; R( G# K
  28.                 }. ^$ n, G0 \; ^1 i
  29.             }6 v! _/ q7 \$ i' e% {
  30.         }
    ' H. O0 T+ }$ v
  31.         }
    9 F: X) l- u. ^

  32. % n& u1 w0 {' o: [; g
  33. / ?" b. o" T2 f0 E" J6 K
  34. }
复制代码
对应的,hpp里也要修改:
/ @; c+ a5 W$ U5 b
  1. #ifndef TIMEVIEW_HPP
    + F* u6 k, ^. W2 _, l8 a' C% w% n
  2. #define TIMEVIEW_HPP9 b& R6 t  p$ Q3 N

  3. * ~5 w5 y  c+ j4 A
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
    6 h$ _  S5 b* a; |( I/ Z. e
  5. #include <gui/time_screen/timePresenter.hpp>
    ( I: n9 [' U& }8 y+ g, ^) r4 l* ~  S

  6. 3 W9 r2 _& m8 ?2 k7 [& h
  7. class timeView : public timeViewBase) r/ z, r' o4 K2 Q4 I
  8. {
    " `/ X3 C8 \4 c
  9. public:
    ) g: d6 M# J) }- P
  10.     timeView();
    3 Z) M9 x4 O) o: r4 J5 d! P7 ]9 `# U
  11.     virtual ~timeView() {}1 V% [6 G& F5 V. @# Q( ]) R3 u
  12.     virtual void setupScreen();
    . R& }3 Z9 p# {& f
  13.     virtual void tearDownScreen();9 t8 E1 ?1 i+ a# ^4 \" _
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);8 f3 a. K! I  `7 Z5 p$ |
  15. protected:, C  @+ B" r9 j, p* V. w6 ^
  16.     int tickCounter;+ t* b; a. y- [+ ^& {5 y
  17.     int digitalHours;
    ) n, T# Z% D2 K# x$ v# ^
  18.     int digitalMinutes;& q: J7 t4 o; [! `& j# X4 b5 G2 [
  19.     int digitalSeconds;
    % m9 _/ N. H/ q! d$ ]; q
  20. };
    % L; W+ X4 h& T% O9 {

  21. ; R0 J0 }2 J5 L
  22. #endif // TIMEVIEW_HPP
    5 m( g' y7 a. X1 Q" F
复制代码
( C2 b. h) }  v  c
这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
% E8 W8 O3 U3 |6 e/ c
5 W1 ?4 [/ E5 w* F) ^4 r0 g最终效果:
2 X' r8 p. ?! t, j! F
% O- h7 Y8 a: s, L* N7 f
/ G' t' p* o% h& G( [- \: i
$ l$ {7 z+ r; B0 M5 o  f* K# n! O" X* `9 i$ O; v+ V( z

) W3 p8 X7 T' A, h
收藏 评论0 发布时间:2024-12-27 14:44

举报

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