|
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的 + g. Q; y3 Q1 _& m; C7 \6 A
工程还是使用之前的模板工程 . e8 Q- B. ^0 P( \- a- U
一、cube配置 开启RTC,把时钟源和日历都激活
5 `/ r+ t: ]0 v/ ?
下面配置的参数基本上可以保持默认。这里面主要会改的参数是
6 d# `, l( ^0 Q! _ c. z$ c1 \* `
其他参数保持默认即可 我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确 然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
0 W. Q! g: N; c1 [4 r; t
: [$ A8 \% K+ ?! S# e6 l
& \* _6 L, k* A, e9 O
最后生成代码(截图略) 二、代码修改 先来写一个获取RTC信息并打印的函数 - void print_rtc_data()
+ J3 P# s0 u- b3 m: @+ _ - {. P& S' B6 E0 r7 X" ?
- RTC_DateTypeDef sdatestructureget; Z) ~- k* y3 u3 p; |$ _0 g6 j ]" M
- RTC_TimeTypeDef stimestructureget; H6 S& Q! @( e8 p- S/ @8 S# U2 N
7 l$ a7 ?/ S% x4 _, Z- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
4 G+ g! h. J! t4 {6 u - HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);5 g4 S, s. Y- n2 P& C/ d9 a9 Z% G
- printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
% Q: F% g- u, S. A3 D - 2000 + sdatestructureget.Year,
' ^; N \3 y8 d. ` - sdatestructureget.Month,
; j# O* @& b% x8 S! h' F - sdatestructureget.Date,, g: Q9 n/ M2 i# X; J
- sdatestructureget.WeekDay,
) c% z. o$ s/ ?2 c9 g. l0 D. Y - stimestructureget.Hours,
; B0 c$ X1 Q) ~% ]) `( d. U2 Z - stimestructureget.Minutes,) V) J: \; `' d) Q% v1 h
- stimestructureget.Seconds" H; N! f- M5 ~0 q, ~! n" s
- );
8 }7 q5 K% ]/ o$ W: \2 C - }
复制代码
: y( ?# n& X7 l" @$ a1 Y, J 这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据
& e9 A/ o/ p( ^2 f* F# L# w* [把这个函数放到while1中,然后再加个delay,避免一直疯狂打印 - print_rtc_data();! H2 G+ ^' C8 u" H; n6 N
- HAL_Delay(1000);$ k4 V( e: Z2 C* {
复制代码
8 s f% ~: y! B* U+ x* d' a
然后编译下载,效果如下
) u9 _8 g4 H- f9 N, w
' e( s8 [2 ^' d然后我们来试一下重新设置年月日、时分秒、周几参数 写一个设置的函数 - void set_rtc_data()- c0 h+ @' [$ ]
- {
u& ^& V3 p0 j5 D2 R - RTC_TimeTypeDef sTime = {0};
9 s* J) `( j1 U7 |' w& ^' l+ ? - RTC_DateTypeDef sDate = {0};
9 b! V/ g9 {% {, } - . L; S9 B2 _9 @3 u* r4 E
- 1 a5 ^: V( [ p) ]$ B6 M$ r% a
- sTime.Hours = 21; /* 21点 */+ V1 L( ~+ K9 f, [# k# e$ O
- sTime.Minutes = 30; /* 30分 */
) a4 M! W3 w) S9 x' p/ R - sTime.Seconds = 10; /* 10秒 */
* x. H% I; E5 M* d8 b - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
, g& X- @+ \; F6 T4 Y1 e( j - sTime.StoreOperation = RTC_STOREOPERATION_RESET; /* 和初始化时的值保持一致 */: d; O5 X- J7 ]) H. i- R
- if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)/ e- o: R( H2 z5 r+ A
- {0 X/ z# W3 E# J) g. R4 s
- Error_Handler();9 B. O# l! N* S% h8 U! `
- }
; R$ c) R2 A( P - sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
1 G2 }# }: x6 P0 f- O" _ - sDate.Month = RTC_MONTH_MAY; /* 5月 */
9 b& z4 S: |/ X c* L: c' w - sDate.Date = 23; /* 23日 */
5 p; r7 G: S/ g6 Y% b - sDate.Year = 24; /* 24年 */1 A% ]( I' ]( g4 x
- ' h. `. d7 c- T9 ]
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
. d9 `7 X* [: A - {
4 B& h2 P" X; Z c - Error_Handler();# M+ k, i' C. T. T. q: ~: a
- }
$ A; M8 O6 g/ p+ N, v" A# m. D% J- g - }
复制代码
" b, `( Y) ^# I d, f$ {8 M" Z; s2 q 然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值 - uint8_t cnt = 0;
. P, b- _5 X; m; M/ n - uint8_t flag = 0;9 R) g9 [) S, v+ C/ i
复制代码
7 b- f- d' E% k2 p+ O
- if (flag == 0)9 G! x8 o$ v9 O5 x, V1 `9 @
- {0 s! _: ?. v' N- E
- if (cnt == 10)
7 V# I4 t d# r7 G: r - {
" S% }3 {' |" @$ G8 \# v - set_rtc_data();
. x; k; e/ v1 Q( C% W: n - flag = 1;
" b: \, c! w- T+ `0 y - }9 y0 P+ W- o2 L0 N
- else
$ {) W4 Z0 O% e - {$ G- K9 t+ X$ T5 i8 ? l
- cnt++;
" E+ C4 }9 B8 R1 m - }) U' a- ~ H5 i
- }
复制代码
# \ H7 C0 b& n& k6 y; n$ k 然后下载,运行结果如图
; D; Y% D9 h) n n
/ X+ R- U5 H0 q7 D5 f% \: @$ z
|
感谢分享