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

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

[复制链接]
电子烂人 发布时间:2024-12-27 14:44
之前用F746板卡做的工程有些问题,在切换页面的时候,时钟模块会被重置,这次加上RTC来解决这个问题。9 e: |8 j( H5 j) S, Y
([基于stm32f746的智能冰箱实物设计 (stmicroelectronics.cn)](https://shequ.stmicroelectronics.cn/thread-643676-1-1.html))
6 K; h" y, c0 F1 f! f 微信图片_20241227143242.png
; C+ h( B8 [: H  H4 @# i, f之前项目里的时钟是用一个counter慢慢累加:
( z& a0 p5 m4 p2 n' l4 M! C+ Y
  1. void timeView::setupScreen()! n$ V: l6 [' k  I; G* e+ [
  2. {
    - s. W4 k: P% M2 `. _- l% ~8 M, Y
  3.     timeViewBase::setupScreen();/ S0 X; ^9 Q$ y' y& x- q) u% I
  4.     digitalHours = digitalClock1.getCurrentHour();$ o4 V3 [0 F( g( a: k
  5.     digitalMinutes = digitalClock1.getCurrentMinute();
    # Q: a# {) P0 N/ B! S: t: t) K
  6.     digitalSeconds = digitalClock1.getCurrentSecond();
    ) Z6 d! \6 E! G8 }
  7. }
    , E; n; K* S. j# k' F
  8. 4 q# z4 v- M/ S5 C  T
  9. 9 s9 M: T, P, X$ e+ r) H- v
  10. void timeView::handleTickEvent()
    ' J+ g% M9 \- W. @
  11. {
    . V) a* S9 G* j( j5 g  ~
  12.     tickCounter++;
    & K# o3 Y9 X5 d: M0 ]

  13. 4 W& a# F& A) B+ o
  14.     if (tickCounter % 60 == 0)/ Y: h: Q4 P4 H9 X
  15.     {  D7 a! g! ~- z  @
  16.         if (++digitalSeconds >= 60)% N0 Q  ~" @. ]( Z% |$ R) r8 O
  17.         {; B) ?* u) i0 ]1 ?( E+ ?+ z
  18.             digitalSeconds = 0;
    9 o  [1 _& B/ N. A4 V7 X1 i
  19.             if (++digitalMinutes >= 60)
    ! m0 U/ \& O' G6 {% v- H4 B
  20.             {
    2 D% z& s3 {" U$ o" w
  21.                 digitalMinutes = 0;. {! }& B* D' P( `- E/ R5 `
  22.                 if (++digitalHours >= 24)
    ; m' [  s- p9 s" l0 }
  23.                 {
    ; F- `8 d4 P+ n  M
  24.                     digitalHours = 0;4 Y% X) D# s& M! R1 Y$ _" ^
  25.                 }
    # i: E0 o0 }' k: {& N! `
  26.             }
    3 a' T; N+ F9 M! ?
  27.         }
    " G6 Z' l+ W# V

  28. 1 m8 c7 Y# O6 K9 Z: ?
  29.         // Update the clock1 @. }" ?/ _: ^& C; s
  30.         digitalClock1.setTime24Hour(digitalHours, digitalMinutes, digitalSeconds);9 @! j6 X: v" Z* m) X
  31.     }3 Y0 h# {0 ]* ^( P) ^
  32. }
复制代码
虽然可以达到数字时钟的效果,但是当翻页的时候,时钟就会被清除重新计数,
$ }2 `" D9 X8 y1 |* p项目用FREERTOS开发,在里面设置进程间通信特别复杂,要解决这个问题,更快捷的方法是在这部分中添加RTC时钟。4 Y7 r; J0 ?; ^
在RTC中使能并设定好时间:9 a2 N4 q& S. @: ?
微信图片_20241227142423.png
2 W9 O+ k6 f* r0 [$ H- K: c0 M对应的程序也要需要重写一下:
! P( g+ E" g& S2 q6 G7 ]首先要在modelListener.hpp里添加RTC相关函数:
5 l. t( y: S" l. X, t% Y# |0 s
  1. virtual void updateTime(uint8_t hour, uint8_t minute, uint8_t second) {}
复制代码
然后,在MODEL.C中,把主函数的RTC TIME和DATE拉过来(注意要两个一起,不然会有BUG),并传参给updateTime函数。* a; U  w$ Z$ v# \
  1. extern RTC_TimeTypeDef RTC_Time;' {6 h4 {& d% Y) K( Q' b$ i
  2. extern RTC_DateTypeDef RTC_Date;
    4 K8 G# o/ n4 y$ D3 g+ A! G6 c# y
  3. extern RTC_HandleTypeDef hrtc;
    ( u, s! q! H! m/ F! o
  4. # ?6 e$ D. o. C5 r3 J
  5. Model::Model() : modelListener(0)
    ) y# p) t4 h. H# f2 W0 W8 r3 n( o
  6. {
    ) c! f" r; L# |, `3 P$ r

  7. 5 s+ @& ^& I+ k
  8. }
    # f) H$ ?% Q9 ~
  9. 5 ^/ ~! ~; ?  O1 B# s
  10. void Model::tick()
    1 Q  z1 J$ o& n$ T$ A
  11. {" F7 R# x4 Y! V! H2 c; Q
  12.         HAL_RTC_GetTime(&hrtc, &RTC_Time, FORMAT_BIN);
    ; v( I& R, Q2 }3 M4 Z
  13.         HAL_RTC_GetDate(&hrtc, &RTC_Date, FORMAT_BIN);
    5 W3 E( c9 {; u' y( W

  14. 5 [$ W' `; |! X& [* i  F0 G
  15.         modelListener -> updateTime(RTC_Time.Hours, RTC_Time.Minutes, RTC_Time.Seconds);5 ?* Y" u# [6 l6 H9 x
  16. }* p7 Q; o0 L+ d8 t) D
复制代码
不要忘了在time里也要再定义一次updateTime函数:, f* \4 p, J7 o1 d
  1. void timePresenter::updateTime(uint8_t hour,uint8_t minute,uint8_t second)0 |% H6 x: e- P' J
  2. {
    $ C/ J: D+ n. @5 ^5 g# ^
  3.         view.updateTime(hour,minute,second);
    7 @$ t: m0 m) l7 d2 f  f& O
  4. }
    ' {- z; r% Z- J. N# l2 x
复制代码
对应的.hpp文件也要定义一次:
( n; ]! E" I; t7 o  y% _
  1. void updateTime(uint8_t hour,uint8_t minute,uint8_t second);! \* C( Z% k- D2 x6 x
复制代码
最后,在screenView.C中修改,把其他几个全部注释掉,只留存累加器,并在开始累计之前就获取一次时间+ Y: i0 |0 d) V3 P3 r0 j
  1. void timeView::setupScreen()
    . Z0 Y2 I7 ?$ {% T) O9 U7 g4 {. p
  2. {
    , M+ K2 ?" x1 J8 @( Q: o7 p' y
  3.     timeViewBase::setupScreen();
    ! k, d* y, g2 ^& C- [" i; q) k
  4.     //digitalHours = digitalClock1.getCurrentHour();
    7 W: P- s# q7 y
  5.     //digitalMinutes = digitalClock1.getCurrentMinute();
    ( |/ W+ [5 e. T9 N
  6.     //digitalSeconds = digitalClock1.getCurrentSecond();
    2 A. }& f5 P  B. B) o- E! J* T
  7. }7 b) x% M% G* B8 T; p0 ~1 G

  8. 7 T4 }$ \8 e- v: p

  9. 3 }6 v# h: U' Q. ^& e
  10. void timeView::updateTime(uint8_t hour,uint8_t minute,uint8_t second)% E/ b! p6 Q+ Y) a8 q
  11. {9 ]  `1 \& Z8 p
  12.          // Update the clock
    5 a4 S7 v8 A8 E9 w0 b5 B8 p6 B
  13.         digitalClock1.setTime24Hour(hour,minute,second);" W. \: I* P0 F2 L
  14. % B+ I( w) F! S  x$ D) T
  15.     tickCounter++;! H" v; w: F8 D4 a
  16. : H6 p2 c5 O: R' D, P- w$ ?
  17.     if (tickCounter % 60 == 0)
    2 \. G' U# P1 y" ?$ E1 w3 j
  18.     {
    # H6 |# N( ]5 T' B" l
  19.         if (++digitalSeconds >= 60)+ l3 [" w" _) ]: D9 R2 G1 q
  20.         {) h+ `' q& ^$ i: v% d
  21.             digitalSeconds = 0;
    4 z, m( d9 C! `. U/ D
  22.             if (++digitalMinutes >= 60)! O! Y( R! e6 e: W& c( \
  23.             {. L3 y! l+ J% H% N' o6 }# {
  24.                 digitalMinutes = 0;1 {9 D: l/ w" V3 }/ p4 L2 F
  25.                 if (++digitalHours >= 24)7 P) @3 t* N% u8 a, k
  26.                 {2 B5 G7 j9 x0 A' ~6 l; l; p
  27.                     digitalHours = 0;$ H6 g) N: f# M4 w8 R: u$ G
  28.                 }0 M9 f/ I3 H/ Y2 D* n) V+ `2 p
  29.             }8 J4 A+ j' w: T$ _: r4 j7 Q* p& c
  30.         }: Z8 M7 E; t- \8 l; D/ w1 o- v  ~
  31.         }
    : H4 P2 o& {. Y/ D- }4 c  d# C! z; m% m
  32. % W% l% A' v( Y$ _& ~9 Q
  33. + U) g" }. C. C8 d' f5 g$ d
  34. }
复制代码
对应的,hpp里也要修改:
, {- j/ ?$ k* q' ]" p1 A5 c
  1. #ifndef TIMEVIEW_HPP
    ! D0 z4 i5 j. C4 ~. d2 O) U' a
  2. #define TIMEVIEW_HPP  E! Z" x: i3 a" c
  3. / ^: U. u# `" d* H
  4. #include <gui_generated/time_screen/timeViewBase.hpp>
      x& N  I4 D7 S/ e
  5. #include <gui/time_screen/timePresenter.hpp>
    & c( A8 a7 n7 C) k

  6. 0 u% X/ u) Y% T" b7 `$ a, J2 W4 v
  7. class timeView : public timeViewBase. o5 f/ `4 o4 V  l
  8. {
    / P! ~  |% W' c8 O( |
  9. public:
    - I# |: Q/ W1 O! F& E6 M( [
  10.     timeView();
    ' \3 V) u. _/ k; J4 ~; B8 ^) G4 f3 Y
  11.     virtual ~timeView() {}* b& G  R: W% B: Q
  12.     virtual void setupScreen();+ q9 [; `) ~+ f' b9 }) k. P3 m# q
  13.     virtual void tearDownScreen();
    4 }( J+ W0 }3 z6 `  ^* F
  14.     virtual void updateTime(uint8_t hour,uint8_t minute,uint8_t second);
    . s3 P, |# ~) w8 R
  15. protected:
    $ Y* }+ n& U* L) {1 N# x9 C" ]
  16.     int tickCounter;. D; I$ F# |7 `1 ~/ V: T3 B9 F
  17.     int digitalHours;1 S, O, t9 }3 B: R+ j7 S& P5 T3 ]% M
  18.     int digitalMinutes;5 ]% Q  R: N% q+ `: H# n4 j0 E
  19.     int digitalSeconds;! _% O, j! u* x. X
  20. };' Q9 d! \! V- u" ]
  21. 7 q) a; e, [4 p0 s# l7 C
  22. #endif // TIMEVIEW_HPP
    " B; t6 j% r# w6 [/ Z2 p/ ?
复制代码

5 G9 i7 H1 S8 f- p: [这样就可以在TOUCHGFX中引入RTC时钟,也不会出现换页面时清零数字时钟的问题了。! N  f1 |, s3 h* C; ~$ @
+ p' W3 K' w5 N( A+ E9 G1 t
最终效果:; E( f, L  |( A" s* B# n6 H: A% K
8 f- W  x# t# P$ V6 x# O/ d% [& j6 S  }
3 e3 `- n% r, V

" B" C4 B9 B5 g  K; f2 y3 S: i# Y) c# t5 T3 a

5 k* `' f5 G8 T2 |! m% Q5 a
收藏 评论0 发布时间:2024-12-27 14:44

举报

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