|
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
8 n' J% W# v% K* w. w工程还是使用之前的模板工程
6 `! d& C) {5 l3 R& I$ U7 T* X一、cube配置 开启RTC,把时钟源和日历都激活
" K( X5 l# r0 x' w$ L2 s$ h 下面配置的参数基本上可以保持默认。这里面主要会改的参数是
6 T! ]7 e8 |1 d 其他参数保持默认即可 我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确 然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
/ D3 K) [4 {1 S+ T
; g- _( P3 A( g8 m4 m
, W/ b( _* M% o/ J2 G3 @; {% S 最后生成代码(截图略) 二、代码修改 先来写一个获取RTC信息并打印的函数 - void print_rtc_data()
' L+ ]6 c( G$ b - {
! k) l" @/ ] G# r5 ]/ r; d - RTC_DateTypeDef sdatestructureget;, n, M+ @" J# a A& }
- RTC_TimeTypeDef stimestructureget;
K1 d) K& N1 ?8 N# E5 H& n8 c - & u8 S# s7 s9 W0 s+ _
- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
# ^& R m9 U B7 q A - HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);8 D! s. L8 a, r7 b% } b
- printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
* _5 `) t" a' m- b x7 |+ c( N - 2000 + sdatestructureget.Year,# ~& w: Q- I9 E9 Z
- sdatestructureget.Month,
& T$ L; n' e5 x4 }! b# q - sdatestructureget.Date,0 A* }, W) I: A6 @
- sdatestructureget.WeekDay,- T5 B9 r( D/ @% r6 o' k8 D
- stimestructureget.Hours,6 {3 ]) }! M3 w6 f
- stimestructureget.Minutes,
3 q' e% K+ K( o/ F+ ?: W% K - stimestructureget.Seconds
4 X* N! y3 x9 g+ p7 r - );4 n. p# ~- z8 X6 x
- }
复制代码
% v+ W! ]9 |2 L# [/ \( W 这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据
/ k9 Q+ ^0 b S( F1 B把这个函数放到while1中,然后再加个delay,避免一直疯狂打印 - print_rtc_data();
! H6 V7 f* }+ U1 O: c - HAL_Delay(1000);
# K5 C' }" K) }9 T S
复制代码
0 ^+ u! A6 Z$ P4 s- ?% x
然后编译下载,效果如下
( i7 I$ _6 Y0 u8 O. z' m% a
) F: A k. t o' e% J0 n然后我们来试一下重新设置年月日、时分秒、周几参数 写一个设置的函数 - void set_rtc_data()
1 |# E( n4 \$ Y, ]9 \, }" l$ q. q - {, _0 y# J# T2 e2 S4 H4 U; e! b0 Q* `
- RTC_TimeTypeDef sTime = {0};
& p/ q$ a6 d6 t3 j/ F - RTC_DateTypeDef sDate = {0};( X/ f7 I( a' c: z, w* k
- ' J) s4 Q2 D) d$ B
- * t& i, O5 x* b! x/ U
- sTime.Hours = 21; /* 21点 */
2 t: |8 h/ F0 c% Y4 ~3 R E' M" \ - sTime.Minutes = 30; /* 30分 */+ H# j$ k0 q) \$ w
- sTime.Seconds = 10; /* 10秒 */# x4 K4 j6 l4 Y
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */. B$ D1 G& p& ^, L
- sTime.StoreOperation = RTC_STOREOPERATION_RESET; /* 和初始化时的值保持一致 */: l' F! E& n5 A# H8 A5 |
- if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
$ N x1 H6 ?! f7 @ v3 u/ R - {
# r0 F: w* n% T- E - Error_Handler();; w* W: Q* I) U) ^6 c6 {
- }
8 _9 u# I: s/ x; X& ?3 Z; t - sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
3 I; ?2 C' _& I - sDate.Month = RTC_MONTH_MAY; /* 5月 */
+ C% A, }: n# g7 N* J v: {/ \ - sDate.Date = 23; /* 23日 */5 Q/ X2 M8 W0 g
- sDate.Year = 24; /* 24年 */
" U3 ^) j% |! H G3 M% h
* g6 ^. V' x. ?7 G4 ~- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)4 s7 \4 k! K$ l
- {
; V8 w }+ a. T. `4 E0 e! l - Error_Handler();% ?* I' g- W( P7 w6 r1 B
- }9 A' h3 J ~+ Y) z' F% c
- }
复制代码
: {8 \ e1 V# i3 ^1 ~0 ?9 T4 `
然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值 - uint8_t cnt = 0;
$ O" `8 o3 N9 a1 M - uint8_t flag = 0;5 z' G$ R3 ?3 a5 {& q9 n2 A
复制代码
" L4 n: u1 o, h+ ?) u4 O
- if (flag == 0)' @8 j) x9 R1 j Y4 ^! S
- {
" t5 R% F* y" a, A8 ` - if (cnt == 10); `, m- s5 p9 r3 g$ V2 B
- {
% T+ R) N, o0 Q6 l, [ - set_rtc_data();
: \% B( \3 x: I- |( K f+ p3 \ - flag = 1;
: y4 }2 B* X! T. A; ]0 \ - }
( O" N: Q+ D2 q - else
+ d7 Q& b& v* P+ i9 i& ]2 L - {
1 a4 m& T [0 T+ d! S5 S - cnt++;' F5 ~- r' O; `) }! R" `# p C
- }( Y3 z( h: ^0 T
- }
复制代码
i5 A8 N" o) {" l, a; B9 L5 s
然后下载,运行结果如图
6 C* W8 B( b$ d2 O0 r. \. P % u- v9 s- X0 q" R/ P
|
感谢分享