实验目的:
# d% x) M% H% m通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。5 g: I# A/ A& W# s) V+ p
1 @6 U+ u, _: V J
一、STM32CubeMX配置如下:! N2 g' r# s X% J1 H
1.时钟树配置:
4 x& ^" M' t3 l: w4 M因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:2 @* A$ q- a* z9 j
" y* N8 V+ V7 t# h1 U
8 p; T2 `& q& M7 z: k9 g
. V% |- w) C# a! b# k( N- ?6 R2.RTC配置:
1 R, S) x( W6 _
$ M; o" t* l8 I
1 C2 f" I5 l, H! y3 w6 q5 P
1 x; o" o) W6 H. w(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:
! Q/ P$ s2 x& L8 P; g: c
4 T4 x% N# Y1 t" g- I9 ^7 b
' I% Q% F7 C) v; ~1 o
7 z, t" c3 ]$ ~, {& ^/ @( @" A, m
; `* O5 k4 H: r0 G0 @0 ^+ s
% ~" R; m# I1 K1 n因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即: z% h; D# k( c& {0 `8 S
! T. ^( |' q8 z5 g2 [+ R: f" {Asynchronous Predivider value :127
6 p8 T+ e3 s; Z) m* [) l( w, vSynchronous Predivider value :249
) \& L3 M" M6 N4 D
( K& o$ A7 V" G( M, e5 p5 G2 Y8 M(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
' b# O, N7 u; t k1 ]' o二、STM32CubeMX配置生成的HAL库如下:4 r" ]- ]/ b$ {! |! H8 }5 b( J
- /**
- {; Y- Z+ L, W: h# O8 R' ~ - ******************************************************************************
2 g* b8 F& I4 R3 a" U - * File Name : RTC.c* G" g" m$ E' V: W/ v3 Y* D& |
- * Description : This file provides code for the configuration
4 m& P. s0 w5 W6 `2 B) c5 P - * of the RTC instances.9 U( l7 g8 k P7 M- G2 I, O2 f6 M
- ******************************************************************************
& N+ ?; M9 k, ^. m1 N - * @attention
. j8 ]; P7 T2 e5 D1 f8 M - *
) ~, \! a, p5 C" N7 y8 B - * <h2><center>© Copyright (c) 2020 STMicroelectronics.
' o0 e/ j, ]; B4 @# ]# X" Z& }7 S# P - * All rights reserved.</center></h2>5 g' r( ~4 g7 M8 A, p
- *2 J: N- r$ r7 S4 B( I/ j
- * This software component is licensed by ST under BSD 3-Clause license,; X* X3 I7 ~! C
- * the "License"; You may not use this file except in compliance with the2 Z. u0 e, n8 Q6 d; f4 e
- * License. You may obtain a copy of the License at:
( w- ~' {% t" J/ m - * opensource.org/licenses/BSD-3-Clause7 d* M6 I2 c4 h+ N' K& x2 ]
- *
/ _5 [3 s3 K2 X2 g( m+ C* g' D( E+ R - ******************************************************************************
% t) e" J1 j7 \4 T; `4 P* _4 z - */
' ~: e1 A. L; }, v$ s- a, n - 5 T* l9 z* X6 Q w K" S" I
- /* Includes ------------------------------------------------------------------*/+ ?4 b# k6 ?8 r8 K) a! \& }0 e
- #include "rtc.h"
; ]$ p7 X, A, g6 w. g/ l+ b
- G9 [! n! K- ?- _3 R5 s- /* USER CODE BEGIN 0 */
, _7 {6 |0 o! S0 r) g; h H9 F - RTC_TimeTypeDef GetTime; //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä+ I/ \* }% }1 b( s4 e
- RTC_DateTypeDef GetDate; //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ' Z- C1 k, `5 i7 c: p
- uint8_t RTC_READ_Flag;- Q9 b4 W: E5 N/ U; Q, b/ I
- /* USER CODE END 0 */8 U2 v# _8 u% ^9 d e3 {1 E
3 K8 c! q, y. \' A% _* e- RTC_HandleTypeDef hrtc;
! P: _& M' p$ J& }0 W6 R& c
4 D1 I/ P4 w/ V' `( W/ P- /* RTC init function */
* \) {( ^! f2 a# q3 U8 T - void MX_RTC_Init(void)" f, ~; j5 y, {9 ^. [, D( q( A3 a
- {( p' w8 c+ @! j
- RTC_TimeTypeDef sTime = {0};
3 X) U7 L" W3 H# w3 l" @+ ~ - RTC_DateTypeDef sDate = {0};
5 y1 |4 L2 V7 ^8 ^* w - - W! X4 d% ~" g
- /** Initialize RTC Only
2 V* ^6 e3 c0 \+ _+ D/ i+ K# w2 D - */
8 v. n- g- [5 y* g - hrtc.Instance = RTC;
3 I0 J7 ]. h j& p7 x) s - hrtc.Init.HourFormat = RTC_HOURFORMAT_24;2 Y+ [* u' Z* ^5 T9 V5 c
- hrtc.Init.AsynchPrediv = 127;
7 q. t& j4 A( I V5 ^ - hrtc.Init.SynchPrediv = 249;0 ?& |4 a+ w& v: J8 Y
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
2 M; d/ t! a9 E8 |8 s8 Y. y" C - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;: [4 a2 F/ G7 A1 }& @! S. |4 h
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
, N2 v( w; A3 n$ i# }: | - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;$ P% @% h0 x! }; _8 [/ V5 X' G
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE; d: s' P- y! _* N, Q
- if (HAL_RTC_Init(&hrtc) != HAL_OK)9 t5 W' S8 g. g( b
- {7 P0 `, k- x6 H
- Error_Handler();
) y; N4 o! z0 R4 Q2 X8 n; E: } - }
# ~+ J" S9 G7 {3 Y - % ~. s/ ]1 I) F2 Q
- /* USER CODE BEGIN Check_RTC_BKUP */
% E9 r/ z/ n& J4 H9 E5 b, v: }
# Q6 f* r# M; I% K5 e/ v- /* USER CODE END Check_RTC_BKUP */ F( S/ @6 G0 [' p) c; c6 L9 H C: f
- - H8 T3 m% r7 {& @
- /** Initialize RTC and set the Time and Date ; v( g4 Z h2 j: Z
- */+ O0 o/ y- d( O' ~* L* Q: R7 j0 L
- sTime.Hours = 19;, L8 I8 ^# B# i
- sTime.Minutes = 07;
( f. n. K6 y7 f, O f) v6 v/ ^ - sTime.Seconds = 00;7 {2 A. w% R) i3 |
- sTime.SubSeconds = 0;
' k1 }$ s1 P o* i3 Q - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
& G' T& X" a- n7 t0 i' S - sTime.StoreOperation = RTC_STOREOPERATION_RESET;
$ M0 H6 i3 i' q3 k$ _ - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)/ c0 E$ j$ t0 m% ~0 L
- {
4 p( Q; L# p( R4 |. C; q" K( M5 k - Error_Handler();& ^1 x' a) e' M9 z" l7 D+ O L- c
- }) O; V$ a, i/ H/ v4 F0 m# p2 d( j& n
- sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;1 y6 |1 F' ^$ L5 U$ ~. B) {
- sDate.Month = RTC_MONTH_SEPTEMBER;/ L% l X! t3 C: Q
- sDate.Date = 8;* {- f* k: f- A2 k( [1 {. _% G
- sDate.Year = 50;' ]; C; L; o5 i i
- - ^! K; |1 j8 a6 z. T1 n$ K
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)- o0 e% x; n8 B, [) \) l( A
- {" F" t7 Y' ~5 m3 o
- Error_Handler();% `" l1 I/ H5 m+ [
- }- Z" t3 L% G- |9 z, k. x; n, u+ o
- : U& ?& \ P/ C. h5 V' R, S
- }
: w9 a/ K$ z( m& y - 9 Y8 T3 E$ k! e; y9 S% g8 O
- void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle), o8 c9 f5 L! ^# p! C, w$ Q
- {
6 Z } y! @- J ] - 1 D8 T. k! c+ b9 x# H( Q& t
- if(rtcHandle->Instance==RTC)
& v b, {6 S& S) r - {
& T. U6 z& K$ R- ~" K - /* USER CODE BEGIN RTC_MspInit 0 */
* a/ R: D6 b$ J2 o) ?+ ? - ; \+ A4 b- e& }3 O
- /* USER CODE END RTC_MspInit 0 */
+ X0 {2 f: F5 L* w5 H' W$ ^# Y4 } - /* RTC clock enable */: k0 a+ | v/ E0 c* t1 K
- __HAL_RCC_RTC_ENABLE();
% x! S! ]+ b# P - __HAL_RCC_RTCAPB_CLK_ENABLE();
7 P" t4 {8 u) X X! } - /* USER CODE BEGIN RTC_MspInit 1 */
0 k0 H1 x0 v* x0 o - ( j9 p& [1 G, A* o) g
- /* USER CODE END RTC_MspInit 1 */ |. u# M) `9 ^4 P4 q/ b% H e
- }
; N' P5 C3 y( i8 t4 D H6 @" g - }. m4 S# `7 A# F% p8 G. s
- # c4 `1 I- o2 r; n1 d1 _4 [( D
- void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)% Z3 h" h$ M. t) z4 W
- {
r, i' ?) P) U7 _) [- \ - 2 ?7 ~8 k$ g! l* y
- if(rtcHandle->Instance==RTC)
7 S7 Z' h) [5 o: i. y4 ?. A% V, o - {- n9 s. v" j* k
- /* USER CODE BEGIN RTC_MspDeInit 0 */
7 D' {$ ~% o( ]8 ]: j6 W
- l8 b) c9 g3 F0 \: H- /* USER CODE END RTC_MspDeInit 0 */- D- F: b t8 `+ v: F: R9 Z
- /* Peripheral clock disable */! u" h0 v/ H& J* C+ g, W
- __HAL_RCC_RTC_DISABLE();
1 y# i6 q/ p% y% l/ Q; t/ D - __HAL_RCC_RTCAPB_CLK_DISABLE(); |$ P% Y; z- e$ n
- /* USER CODE BEGIN RTC_MspDeInit 1 */
! B$ {- B- Q; _
* W. b+ o% h5 u8 F* _# N/ F- /* USER CODE END RTC_MspDeInit 1 */ Q/ b3 ^; B3 X+ |' B
- }
3 I2 S- M0 y& w, D8 G0 h - }
复制代码
1 y9 p6 F4 p ?* y3 T) T0 i) q 9 Y; q* q: N( i3 Q% I% P4 L
三、时间日期获取设置等:$ m9 y0 x. `& q7 S5 U9 |+ b
1、自己重绘一个设置time的函数:
- k% t9 ?9 I- h0 }# Y- /* USER CODE BEGIN 1 */' r) [4 E( H* k, \ D$ m% b
- void RTC_SetTime(u8 hour, u8 minute, u8 second). ]$ b% O6 T: M3 \! |6 S4 }
- {
, z8 |' u5 d" {3 c' _0 b5 E+ ?! F - /*##-2- Configure the Time #################################################*/
3 G) ^9 U* m7 d: Q/ y. t$ A% } - GetTime.Hours = hour; }1 N: @' {5 v u! ~* N0 @1 o
- GetTime.Minutes = minute;7 O8 S: N0 E. \2 W
- GetTime.Seconds = second;
( O }/ f% [( s/ P* @% K - // GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
1 e! U! X. u4 Y1 n3 V - GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;1 z1 `2 E9 |7 x$ ]' v+ R' q
- GetTime.StoreOperation = RTC_STOREOPERATION_RESET;$ ?8 k0 R& k+ n, X$ c7 }
- H$ ]9 N; V0 O5 r- if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
: Q' i/ P& E# y% y - {
& J" d; f) w; H1 Q& Q, {
' d" q$ Z" M/ u0 f$ R; {- }( p9 c" Q$ Y/ P4 \9 a' b# q$ x
- }; W4 i2 d, w. @# a5 a1 F2 w n
- /* USER CODE END 1 */
复制代码
! ^, u1 t+ C. n& F* M& H% V3 u2、调用函数实现RTC:
) ~2 i% |6 Y5 I1.首先初始化RTC时钟:
B8 I* R0 ?1 E( G; ]) u
% ~1 y2 z* a6 T; G2.接着设置time时间:: ]. Y: \& b5 U% @
- RTC_SetTime(11,59,50); //设置时间为11时59分50秒
复制代码 2 f9 I) d2 F; {4 Z# W g
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
7 _8 G' E1 `8 b/ S- HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
9 a2 o5 S% f6 H3 E0 y* V1 D/ D - HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间
0 K3 T- V# d$ o! p; I8 Z3 C0 Q
复制代码
; H( C$ ?) A- v |