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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。
) p$ ?4 \# f: }+ A9 |! X, s([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))- m9 h% o. a# s) }9 Z7 m
微信图片_20241227143242.png
" t. s' _& q$ E- S/ k' X) R之前项目里的时钟是用一个counter慢慢累加:
4 l4 L) K3 ]1 @$ b
  1. void timeView::setupScreen()
    ! |4 I6 k0 j+ R6 u9 A/ L7 f, w1 e
  2. {' Z5 w5 K) y1 b& T! w: g5 I6 V
  3.     timeViewBase::setupScreen();
    ' `. N/ t2 K% x: W
  4.     digitalHours = digitalClock1.getCurrentHour();
    # I  I) {' E9 b3 k
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    - u2 ^  A7 i! V
  6.     digitalSeconds = digitalClock1.getCurrentSecond();1 s6 Y' C' v& W& o! Q3 W3 u/ o
  7. }! N$ G! w( g6 P! T7 t' b
  8. ( _8 w2 h% J- l
  9. % {" {& T/ c7 U( p" @" G1 `7 g
  10. void timeView::handleTickEvent()
    9 h9 U$ ^& x# N( i/ Z' a; b
  11. {; A+ `) E* v: u9 g) z
  12.     tickCounter++;/ k7 l4 _% M" a5 ~& b. f

  13. + q" {% }% Q4 R
  14.     if (tickCounter % 60 == 0)* S2 Y$ n8 V9 q; u
  15.     {
    0 z, _* b) j1 u$ X8 Y# `
  16.         if (++digitalSeconds >= 60)- P6 q" M2 B' m% R# P
  17.         {. H8 S; J4 d' O5 r7 @$ e. p
  18.             digitalSeconds = 0;. I0 A, L2 m# ]1 @$ d. Y2 p6 Z
  19.             if (++digitalMinutes >= 60)6 o' z  a6 J% q2 O' @9 `% K  r! n4 O
  20.             {
    - n, n4 l7 D& Z, I
  21.                 digitalMinutes = 0;
    8 f$ A. m, m$ U4 O, \! t1 M
  22.                 if (++digitalHours >= 24)
    9 q+ N6 Y  E1 x! l% E: |! v
  23.                 {
    1 ^# ?& u! R. |
  24.                     digitalHours = 0;+ l/ M8 t! w9 a6 g" b
  25.                 }; F% |  X( n# _
  26.             }
      [2 y9 ]2 k7 {
  27.         }4 F/ s. \0 E8 e# E/ ?, v2 s1 R4 h8 V

  28. 7 G5 _: V$ d$ u! y$ \
  29.         // Update the clock
    1 J0 j* ~1 o1 X. @6 o
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);8 E+ G* c- h$ n: ~+ F
  31.     }! {5 V% C4 l& R6 W, b; u
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,/ S# e2 P- P0 z8 c5 D0 ?
项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。8 S% {1 S9 U: [
在RTC中使能并设定好时间:& [1 a, h$ p) D- @
微信图片_20241227142423.png , E$ `% |. ~# \5 K& E
对应的程序也要需要重写一下:
1 {& B7 u6 Q% D7 N3 {. U8 R首先要在modelListener.hpp里添加RTC相关函数:
+ @9 D% w: I) H& G0 \) |, v
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。
0 S# y# N3 v; m' B+ Y- |
  1. extern RTC_TimeTypeDef RTC_Time;
    2 ?* @3 H9 ]6 f: s& c
  2. extern RTC_DateTypeDef RTC_Date;& |% {) m: ]5 i! }6 P1 c
  3. extern RTC_HandleTypeDef hrtc;
    5 F/ T% g/ M: Q; T$ q8 h
  4. 2 Z5 X# W) j/ Y2 m; |
  5. Model::Model() : modelListener(0)
    ! d3 ]: _& ]) U: G$ X2 l' B
  6. {1 G" S9 Y5 y0 p6 ?  _( y

  7. + E% d* z" E" c
  8. }- Y$ o$ S4 q  P$ N

  9. 9 i7 D# a, g, ?! u. v
  10. void Model::tick()
    ' @; Q8 H$ `( t; F
  11. {
    - U; b! y) V9 J! D' G  O5 S
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);, V5 n) p" K  R" O  f
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);3 F4 W5 ^. {( Y) {) g, |
  14. 7 G6 N% K6 i+ p! F( L1 c) V
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);
    6 {3 B, {/ o3 U! I9 j1 k
  16. }
    9 n  o; I4 b. i  @0 U% M
复制代码
不要忘了在time里也要再定义一次updateTime函数:8 k4 O+ p3 ^6 y! q( `% [
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)- y7 I6 E) F# _8 y
  2. {
    2 ~8 Y: N4 Z' F2 }
  3.         view.updateTime(hour,minute,second);% ^; C, ~& X& Q
  4. }& M$ j/ x, ]/ \: u9 d
复制代码
对应的.hpp文件也要定义一次:
9 }0 k7 W, D: p0 e
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    " k9 a6 L! ~3 V/ q7 L
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间0 f; U4 I" h4 h% _! f8 w% V
  1. void timeView::setupScreen()
    1 P% A* j: B' ]& h' D
  2. {' i, `4 x4 b4 h7 v6 `1 ~
  3.     timeViewBase::setupScreen();
    0 W) a+ V" N9 B, ~
  4.     //digitalHours = digitalClock1.getCurrentHour();
    ' y9 b; H6 ^3 S# b& H
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();
    " s2 b( ~: Y* ^) [2 q+ {( f; T$ s
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();, Q. c9 E8 L! X; H9 F
  7. }& S! |/ u1 |( p4 H

  8. 0 x, _) {: F6 s( q) _( j

  9. : \+ Q! [. d# v( s' \7 |+ I3 [
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)
    ( F& m- K9 i6 F. U
  11. {
    ; m+ S' ]/ S* ~0 @
  12.          // Update the clock
    2 Z" x, V. q0 a" O
  13.         digitalClock1.setTime24Hour(hour,minute,second);! G. r; _5 L3 R; e& t5 w' f

  14. 0 z8 @1 O. M- |" C
  15.     tickCounter++;$ A! T1 M* W  k! p. w

  16. 5 |3 c0 x7 R% `$ `/ t
  17.     if (tickCounter % 60 == 0)9 H0 D/ {0 z+ T% k; h
  18.     {
    5 }1 o2 H( x$ Q" U( f1 s
  19.         if (++digitalSeconds >= 60)* a4 n8 Z9 _$ S9 w
  20.         {" ]6 ~# `; b% ^. e
  21.             digitalSeconds = 0;, _9 u" e2 v6 o/ u3 D
  22.             if (++digitalMinutes >= 60)
    % v5 d8 ^8 a  o1 d6 p. P5 T  C
  23.             {8 x; M& s/ t& f3 j/ U. [
  24.                 digitalMinutes = 0;! `! f  {) o4 _! m: a
  25.                 if (++digitalHours >= 24)$ d# C0 b2 Q8 C% t8 R4 a# B
  26.                 {
    ( G$ C9 Y4 P9 X9 }
  27.                     digitalHours = 0;
    ' ~; W* A- c. U- ~+ I0 {
  28.                 }) U/ ~0 Q( A+ v; ^; S0 R! f
  29.             }
    9 b  P" I1 U$ C: Q
  30.         }
    0 U/ q0 F+ k! B- M: `0 B
  31.         }
    # m; J0 |- T9 Q* T
  32. 0 `" i. j0 I- n2 D; C6 D( d. O

  33.   \# q6 Y2 ^. [9 ^+ V+ I$ w6 p
  34. }
复制代码
对应的,hpp里也要修改:
6 W, r1 _: l5 I! O7 Q
  1. #ifndef TIMEVIEW_HPP
    0 m% |% ?, m8 _! b7 b
  2. #define TIMEVIEW_HPP2 a2 l# T* ?' V5 `7 H
  3. 1 c; ^& ]% J, I: N- ^% f! q) \% R
  4. #include <gui_generated/time_screen/timeViewBase.hpp>' S0 e8 w, A7 ^1 a0 M* F
  5. #include <gui/time_screen/timePresenter.hpp>+ `' @) ^& g) w0 l* }, C

  6. ( F8 t' q% q$ o8 {2 {" W
  7. class timeView : public timeViewBase
    ; Y! X# w, m2 {3 ~6 \3 O0 C, [! D
  8. {
    % W* o5 J1 u3 i! G  u1 `
  9. public:
    4 ^' O: e/ w9 x' y' |8 `
  10.     timeView();
    5 d6 h" ]) @9 W) g
  11.     virtual ~timeView() {}
    ) Z) j7 |2 O* l
  12.     virtual void setupScreen();
    ( H1 x0 H  p, k1 b! b
  13.     virtual void tearDownScreen();8 S+ x4 _5 y6 H4 h: w
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    & {) k7 K: {; g* V3 A
  15. protected:8 j  m* J) p7 K
  16.     int tickCounter;
    2 W) b; E: D0 J+ g
  17.     int digitalHours;! x2 }  f2 b, k: C
  18.     int digitalMinutes;: x6 p( N' }3 V& ~
  19.     int digitalSeconds;, r: i9 Z; |, o/ R7 r" N* ~
  20. };
    - G# e9 H% J. [$ q

  21. " E4 _4 e' t# y, `
  22. #endif // TIMEVIEW_HPP
    ' v3 G6 W; O. M. t% D' T
复制代码

5 q, }2 @' g- [: V* w! G* l( c2 \  o, R这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。
" E0 C) a, ^  E$ ?6 \7 T3 D; a% I% i- f6 b! L5 j8 Q% s& O# O
最终效果:% ?: Z7 u: X! `" s
https://www.bilibili.com/video/BV1UhCEY2EpA/?spm_id_from=333.1007.top_right_bar_window_dynamic.content.click
  H" K  n+ n$ {6 ]( r/ i4 N6 w
! d+ r) b: Y0 v8 z0 f  ^1 ~9 j& Y" L9 y; t& u

" d6 ]; }% Z( v! S5 A. s2 _8 G; ^9 X2 T  }+ q0 \6 v0 }
赞 收藏 评论0 发布时间:2024-12-27 14:44

举报

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