|
今天来玩一下STM32U0的RTC,后续想用U0做一个电子墨水屏的日历,正好要用到RTC,今天就先来摸一摸RTC是怎么玩的
; ?( Y4 s5 ]5 \# m0 B工程还是使用之前的模板工程 5 Q# ?& c! ^; C$ Q+ Y" ~5 C" g6 W
一、cube配置 开启RTC,把时钟源和日历都激活
: r' S9 P7 A0 c% _2 ` 下面配置的参数基本上可以保持默认。这里面主要会改的参数是
" O! G2 p0 A( e
其他参数保持默认即可 我这边年月日时分秒周几就偷个懒直接用默认的,待会儿我会尝试调用set函数改变其值,因为在实际使用时RTC都要用户自己去设置一下时间才正确 然后把时钟改一下,这个工程之前没有启动外部低速晶振,用的是内部RC产生的LSI,为了RTC更准一点,我要把外部32.768K晶振用起来。然后这边选择RTC Only的这个,因为我没有其他东西要用外部低速晶振,选这个可以在休眠时功耗更低
( P4 K3 {; ~" s% d! c) l) r( Q+ N8 V : I5 [ d% P, _" W9 U' K' z
2 u( D& G' Y5 o% n$ j$ G
最后生成代码(截图略) 二、代码修改 先来写一个获取RTC信息并打印的函数 - void print_rtc_data()$ x6 \7 i4 f G# x- X
- {6 N: j8 [. h# U; E' }+ |. \
- RTC_DateTypeDef sdatestructureget;7 ^9 \9 _7 P! z: {: S. g$ _: j0 {( Z
- RTC_TimeTypeDef stimestructureget;8 e9 U+ W# j3 q) p' Q( {
- - P4 h" S, f# {# W7 C+ T: P
- HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
- a+ T# [5 j4 r7 d4 P( A. N - HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);) t" d" j' Y1 h ?2 A
- printf("Date:%02d-%02d-%02d WeekDay:%02d Time:%02d:%02d:%02d \r\n",
~, Z$ p& Q! l - 2000 + sdatestructureget.Year,
& h0 P; d/ I Z# d% o5 v3 | - sdatestructureget.Month,/ ]/ D8 R) n1 L4 ~4 e& \' F
- sdatestructureget.Date,
: k5 p* e |% f8 y5 J/ E9 T - sdatestructureget.WeekDay,7 Z) e1 L8 ^1 q8 [ k. q: L
- stimestructureget.Hours,4 |" W7 z0 |5 y3 s
- stimestructureget.Minutes,
, @+ X& P/ O) R* A# n - stimestructureget.Seconds& y7 V. @4 O/ k: w# x
- );/ ^; ?3 ]8 k: ^, F* W
- }
复制代码
$ x U' J* b- p+ n6 x0 p 这边需要注意的是,HAL_RTC_GetTime和HAL_RTC_GetDate都要调用,不能只调用其中一个,如果只调用其中一个,那么后续再次调用get时间也不会更新,会一直获取到和第一次一样的数据
% H9 V7 J) G [把这个函数放到while1中,然后再加个delay,避免一直疯狂打印 - print_rtc_data();
) C6 }8 r$ `7 p1 t) ?8 _) [ - HAL_Delay(1000);3 a) S8 r2 N" O" N f* V
复制代码
* L) O5 D1 o W/ @# |- j
然后编译下载,效果如下
( |# g( x8 l9 s" @
$ H a2 v( s: D) @, C- P6 x然后我们来试一下重新设置年月日、时分秒、周几参数 写一个设置的函数 - void set_rtc_data()- R: Z) e$ y7 U$ G
- {% Q$ |4 Z- G; v( K
- RTC_TimeTypeDef sTime = {0};* } Q1 b0 b2 h- R' A
- RTC_DateTypeDef sDate = {0};9 k# r7 z4 ?$ S6 `* {& A) X9 [
- n6 o1 {, H* B* q! i% f+ i- # W4 u3 N. m# S2 g- n
- sTime.Hours = 21; /* 21点 */3 v- I* U6 N6 }) X9 z" i1 C! G
- sTime.Minutes = 30; /* 30分 */0 p& i$ q9 B/ g9 e" V$ `: H
- sTime.Seconds = 10; /* 10秒 */; r, h8 l6 a v: B
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; /* 和初始化时的值保持一致 */
% M+ V: n$ s; F1 y+ Z, W/ V - sTime.StoreOperation = RTC_STOREOPERATION_RESET; /* 和初始化时的值保持一致 */
" v1 D& V: [) |1 G* Z - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)8 o, H( o9 x3 E& F$ R* m) K
- {9 s/ x* K4 ~1 [. P9 G8 \ v
- Error_Handler();
" M: g1 ?2 Y6 H, }2 }0 B - }
0 r) q5 Q. p u, N4 q - sDate.WeekDay = RTC_WEEKDAY_THURSDAY; /* 周四 */
- c. w* B6 L7 K7 X; I/ v - sDate.Month = RTC_MONTH_MAY; /* 5月 */
7 I- x* r9 c$ ` - sDate.Date = 23; /* 23日 */
4 B3 R$ C7 ^% U+ d: t' C9 d - sDate.Year = 24; /* 24年 */
$ a/ Q1 r6 Q' B( I
/ H9 S1 G: ^. d z, t& O6 N4 e- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)0 n: w" f: {5 H3 p$ M* I9 C
- {- c8 X# @1 V* F" J! z2 Z
- Error_Handler();
! m- M5 \" [8 p) \ - }
( k' b$ i% [! s! [: a - }
复制代码
. @3 i. D, L f$ H2 A# y 然后在while1中把它用一下,我上电后会让默认的RTC值连续打印10次,然后改变RTC的值,之后继续打印RTC的值 - uint8_t cnt = 0;
/ o, @, X0 r+ p1 O: c' D1 c - uint8_t flag = 0;) s9 T5 i+ T4 T4 {+ i5 y* W
复制代码
# T; ^2 R5 k: r4 R* J
- if (flag == 0)3 r( d1 s; [3 w
- {
1 p; ?' @! O! Y( J& b - if (cnt == 10)
, a! M- S8 y* ?- Y - {- s7 l9 J: i. F2 }+ m4 u8 n& a" o' U. s
- set_rtc_data();
& j) m6 J. K% Z5 h) h8 z - flag = 1;( r3 |, p0 I8 R2 c) N
- }% g5 N& t2 U8 j$ O8 O% `* E, a
- else* v/ u; a, g2 Q
- {
- u" \# Y1 @7 A+ \7 F8 y - cnt++;
4 T0 \' T1 g) ]: L6 v9 T) F - }
8 G8 [& i' k$ B2 s - }
复制代码
- b# }8 z' k0 T0 s9 D 然后下载,运行结果如图
, K0 k; e" p+ S. y3 y! k1 M4 [ ! F+ y+ r% G7 `4 T# u! k) h
|
感谢分享