今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
# f9 j5 X8 S; ~) q4 F& f# b7 O工程还是使用之前的模板工程
+ S6 N. ^7 x5 o. I5 Z% M一、cube配置 开启RTC,把时钟源和日历都激活
1 H/ N4 p1 X# ?8 q' e; k
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
2 t0 z6 r! s* [' V: }$ T- \ 其他参数保持默认即可 我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确 然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
1 v8 s! P& p, ^1 V( V
1 c5 R& F5 O- o2 K
: v* G" Q1 R- \/ n9 k
最后生成代码(截图略) 二、代码修改 先来写一个获取RTC信息并打印的函数 - void print_rtc_data()/ {) k7 o: s' p' n$ i4 j
- {4 K9 J+ ?5 O" I& d3 `
- RTC_DateTypeDef sdatestructureget;! p3 f6 I3 Z+ h% B$ V
- RTC_TimeTypeDef stimestructureget;
. O! M4 c- U/ F- }5 f0 n/ B
# Y B3 R4 n4 d, R7 ^) d# ^- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);) O7 H* x7 C% @; c e6 z( g
- HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);1 E/ O" Y( e# B( K( K3 @
- printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
2 o* p8 g7 z% M: x - 2000 + sdatestructureget.Year," m$ c4 L" J, ]' U2 w* y( I+ C3 X
- sdatestructureget.Month,2 z" M1 \. [5 A, u& N
- sdatestructureget.Date,
. s" F/ d$ N6 ^7 t9 y - sdatestructureget.WeekDay, @6 ~9 G) z: N" t G
- stimestructureget.Hours,, X, j: Y4 [- C/ ~! v. ?+ ]
- stimestructureget.Minutes,
/ B" K a" E; W2 M1 X4 M$ @ - stimestructureget.Seconds3 D R# w7 q. r3 l" m a
- );( E2 a+ w6 L% q. c
- }
复制代码
) L6 o/ j Y( c3 b. b1 s 这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据 8 M+ ~8 z5 ]- S: ?
把这个函数放到while1中,然后再加个delay,避免一直疯狂打印 - print_rtc_data();9 V, ~2 y, Y J% j
- HAL_Delay(1000);
$ `0 \! v: X! q+ _& o& q4 y
复制代码
& w9 c! q4 ?, D+ e z1 c% }
然后编译下载,效果如下
4 |7 e1 V2 H: S" x0 Q
9 ?! {* d* l( x8 W然后我们来试一下重新设置年月日、时分秒、周几参数 写一个设置的函数 - void set_rtc_data()
) N+ U! |# |' C - {9 N/ w( I0 E! v! n, h& [( H! ?
- RTC_TimeTypeDef sTime = {0};
1 g" \; O1 w0 p( ]- F, @ - RTC_DateTypeDef sDate = {0};
; E, |& H- @* ~ A# b& m - 6 i; V* q) D+ Y1 `: I/ ?9 ]
. \0 z* e# m( i' [! j* M* E; I. M- sTime.Hours = 21; /* 21点 */+ d" @+ e0 h" {0 h& v+ F9 g8 ~
- sTime.Minutes = 30; /* 30分 */
+ I' T6 t! B# o! X$ m0 \& S3 i6 i - sTime.Seconds = 10; /* 10秒 */2 H9 A5 r! X/ @3 ?8 v* l2 i
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */' m( P, Q- G. r1 T& d7 Q/ E
- sTime.StoreOperation = RTC_STOREOPERATION_RESET; /* 和初始化时的值保持一致 */
, M- @; `5 } a, r - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
C. Q$ ]6 x! }. ]- n - {& e& `4 Y6 [1 q0 M. B
- Error_Handler();- Q6 r/ t# g" s: m3 J" [) r
- }3 U5 h; J; X1 Y5 g4 \$ U+ f
- sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
1 y# n! O* d& m& _# r - sDate.Month = RTC_MONTH_MAY; /* 5月 */( \! P7 P$ ~- C& h3 k% V- p
- sDate.Date = 23; /* 23日 */
1 v1 {: M Z t; ~& R: r - sDate.Year = 24; /* 24年 */6 \6 i$ ?" X |! f4 e% }- w
7 m$ b) _& J- w) P( S- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
4 q# }& k+ n. c) ^! ^, p# M' f - {+ {! e4 S' I5 P3 N! J) d
- Error_Handler();, v }% k0 t P7 a; \
- }
5 g1 a5 C3 Q# s: E1 i - }
复制代码
' c. ]5 M' }) C5 d- A
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值 - uint8_t cnt = 0;
7 d. B- }5 i) O - uint8_t flag = 0;. Y" w+ ?# |# b* \
复制代码
5 \5 c" V4 e" I; m% E0 C. B0 }
- if (flag == 0)$ S) T, B7 l+ J5 n4 L0 u
- {! Y9 R; e; R. k' M2 O
- if (cnt == 10)" r( N: ?/ w4 Z1 Y# X; V: ? B. X
- {
5 o) Z& h2 [, c; M8 I0 _2 i - set_rtc_data();6 k$ _8 x5 ~# J' o A- l6 d a
- flag = 1;
7 M, e/ k7 n+ E, r0 v' t! Q+ n6 ?) D% K - }' u/ s; O8 v( j' }' ~
- else
* b; i, [- T. ?9 h - {
8 A. h: Z1 @! O: N* ]0 q - cnt++;7 c! y9 j& p0 q2 S
- }
: j! [+ k4 R) B5 }6 _; a - }
复制代码
* J& I5 t& E _& c9 J/ _ k! ~
然后下载,运行结果如图
8 D; K9 b( O. e3 ]
: A9 t2 u' ]+ g: l$ d! Z
|
感谢分享