1. 使用 CubeMx 创建 RTC 工程
+ g7 P# I5 h5 m8 ?; o打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.& U) Y; \) e. s& v# ]- f7 h5 V( l# {
: e! a+ z( R% ?6 a& l6 l* U* O- n9 T' d先配置一下串口,用来打印相关信息
6 l9 q/ C2 b3 H! @/ u0 }& Z
, _. g0 S0 S7 S2 T' P! \# _5 o1 p3 r. a& @/ u, d! T& l" P) \
4 e6 ?3 x7 G0 V3 v" W7 |2 D. B5 ^
再来配置 RTC* K5 @* E. T, `' \
& \& k0 K5 `( @& d H3 T# f/ M, f c; ]3 W' [) ~
. m7 M5 u5 q8 s( r7 J
, ]4 Z6 I- Y) c3 O' l. N: r
) D6 T/ o/ k) C4 r( u3 d' i$ z配置时钟' B3 x* a; ?( y: ? S
& d- c; T6 B5 C- _8 m0 }/ [
4 j3 G7 @9 f' Y" l+ n/ S' [7 @
e6 k7 q' G( O$ H5 K: vps:本实验使用内部低速时钟测试,未使用外部晶振.- Y8 v8 E+ I: |" E8 I% w, R$ V
% U5 E1 Y, P$ A q配置工程相关选项5 P w6 t' `# h8 U
3 Z* y8 [ L& |. n" f
. _0 T0 r) [9 i" Q8 J
s6 U: l( t# T/ a% C# i* s4 k配置完成后点击右上角 GENERATE CODE完成工程的创建% O/ l" f& R7 C9 o+ u+ R) k+ r
2 ?" Y' I) ^' \
2. 编程, R0 G$ a1 k0 X! J, R. `
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
; R' F( J, E% x9 X; M5 _- /*设置系统时间*/ X' ~" g( Q8 w# H) z+ I
- HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
7 J7 P! g, S. Z/ P! E& E8 A - /*读取系统时间*/
2 ]/ y. h& b4 t0 a3 a' e% y7 M - HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)0 \ W$ l( e! c: U
- /*设置系统日期*/- w" [8 y3 C/ T: {4 i6 t
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)0 g; { v! ~8 D. c0 u( x
- /*读取系统日期*/! L% ^0 S- C9 z, R# U3 }" J
- HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
6 M% b6 O1 ], q: G6 H# }2 Q - /*启动报警功能*/8 B9 r' K/ I( ~: @3 o
- HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)% |: i- S! e; c) Q4 ], f
- /*设置报警中断*/
/ {& A8 D, n. y4 W% ~ - HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)2 M k6 X, q) P d0 W2 M
- /*报警时间回调函数*/! `% R8 I: j, N5 ^0 l; A
- __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
3 X% E# ? J- n' m4 ] - /*写入后备储存器*/, T) i8 t7 a/ t4 H; R. ~3 x" s
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)1 G0 F6 b5 `, p* A6 Z
- /*读取后备储存器*/
]% c' M* P5 n/ K$ ?4 e; E6 y7 ?: {+ A - uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码 ! p. C+ d9 d6 b3 I+ k; K
2.2 串口相关的代码: X; c& y4 m8 a& A! ]- A: f
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数9 y5 `9 t* r) \
- /* Includes ------------------------------------------------------------------*/" n0 }! u4 o2 x2 C8 G5 w% [2 v" b
- #include "main.h"
4 |6 t3 |# c! r3 s4 N$ P
. n# B" @5 g& m. K4 w- /* Private includes ----------------------------------------------------------*/
' r1 [' Z' J+ q2 W" H5 G) V3 t; a - /* USER CODE BEGIN Includes */
1 x" E1 I$ a" F$ T, o - #include "stdio.h": D& d! [4 f& @' S5 ~0 H
- /* USER CODE END Includes */
* r$ ~ s: U. n! k* h
2 ]6 }3 C# n. y! v* ]1 Y- /* Private typedef -----------------------------------------------------------*/
5 K2 U% \% N/ I5 e$ R - /* USER CODE BEGIN PTD */
; v! ~. g% _) E" m' \" P - ; P0 u. N: e2 a% R/ X6 }
- /* USER CODE END PTD */
+ T" d: V. b, ~: d" V
+ ?' T$ U3 [$ c5 ~- /* Private define ------------------------------------------------------------*/& N5 \" `- Y, |$ h# j# d- V- K5 ^! U
- /* USER CODE BEGIN PD */
4 x% u t( d; V q2 F: G y - /* USER CODE END PD */
% f$ e( W/ `4 k/ B$ r - c4 ]# M* s$ o/ O. D
- /* Private macro -------------------------------------------------------------*/, I2 `7 {9 u( p7 Q! z' i
- /* USER CODE BEGIN PM */
# A4 c. k9 J9 h4 L - 2 H1 h% E5 z1 g( J+ P* Q' t; N
- /* USER CODE END PM */
9 Y2 w: B* @6 K/ v; Z2 O: H2 D
+ o ?+ a$ x6 c# B- /* Private variables ---------------------------------------------------------*/
/ W4 ^2 W8 |+ K - RTC_HandleTypeDef hrtc;
- ~3 V" Q" i% [8 s
/ V# O- g: M: s' X( Z5 h- UART_HandleTypeDef huart1;# ]6 P' J) l7 B6 ~
; H9 ?2 G' A. c- /* USER CODE BEGIN PV */
" m; z8 o. ^+ g - RTC_DateTypeDef date; //读取日期& @# y0 _+ } A8 T' j
- RTC_TimeTypeDef time; //读取时间6 A5 @2 A: v: w/ \$ |# f
- uint8_t RTCStatus = 0; //指示RTC状态
! p5 R) w3 r. X/ h* S1 J8 J2 v8 o1 n
8 S8 G! C# L, M4 Z' p' M$ I- /* USER CODE END PV */0 w' \( h( E8 r) V2 M$ I
- 4 j* x2 a9 @& w9 A; M2 b; S0 ~
- /* Private function prototypes -----------------------------------------------*/1 B. w) ^) Q, ]4 b3 n; S6 D% A
- void SystemClock_Config(void);0 K, m6 e" e2 o7 i
- static void MX_GPIO_Init(void);$ S, r7 o2 E( T. |2 q
- static void MX_RTC_Init(void);& f# R5 X3 I k6 Y6 n4 G! |
- static void MX_USART1_UART_Init(void);; T8 c: z* {2 [- X, @ i* R9 ]
- /* USER CODE BEGIN PFP */
) Z- x% z" A+ p5 s, K: u [ - // fputc 函数重映射
" S! P& W9 t& n! G - #ifdef __GNUC_
J: x- c C& V$ q5 ?! J# M. i - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)) ~9 l* J! i2 m* T0 I7 u6 a+ J
- #else% \5 e2 _' A: c. Y- d5 U
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)- U" o6 J$ }8 i
- #endif
e0 E V0 b( j% v. K7 k( o4 ~7 F - PUTCHAR_PROTOTYPE) ?! |" w2 Y" a1 i R
- {
' D: U% ~" w4 w% ?- ^# |* ^ - HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);# Y- W8 H$ Y+ y% L$ Y- I" K
5 e6 F, ]( ]- n1 ~4 |- return ch;
- x5 O( \4 b, t1 s - }" W5 y( ~: h/ |! d4 }1 w: P
- /* USER CODE END PFP */
复制代码 2 R; z J# Y V
$ [8 N+ B3 n( u, b- S
RTC 初始化 S, s& V- X" G% m/ R0 I5 i( D6 k
- static void MX_RTC_Init(void)
5 M# G* l) y, Z( V - {
]4 r: L0 R1 h2 i4 y - 5 O' |1 N9 C0 k3 Z" ?+ p/ ]
- /* USER CODE BEGIN RTC_Init 0 */
) p# q; \9 y+ u% |3 A A
& `% [* N7 n/ M) @- _- /* USER CODE END RTC_Init 0 */
! y- b" {6 \! `" P3 }1 e - 0 i3 z% V' e# F e/ e
- RTC_TimeTypeDef sTime = {0};# t( Q' a. U# P S
- RTC_DateTypeDef sDate = {0};
( o) D) m c. t6 Z - RTC_AlarmTypeDef sAlarm = {0};8 B, X( S; P, x, W1 G# O& f' Y& ~
& ]7 D0 X0 t0 F5 O. n/ H- /* USER CODE BEGIN RTC_Init 1 */
& {+ i$ F% {* |7 T# C, p
# H6 h, E! ^; j5 T- /* USER CODE END RTC_Init 1 */1 Z- Q+ l: c0 I$ _2 y& E
- /** Initialize RTC Only8 F/ u/ M$ Q$ q& v, z Y- M2 v9 A
- */# Y7 z0 U1 |, q" \' j
- hrtc.Instance = RTC;9 r* R; b$ c$ d6 f$ c' G2 A; ^
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
* C* w3 [+ v3 q% |; L% O0 J - hrtc.Init.AsynchPrediv = 127;0 h- v# D( x' B& u
- hrtc.Init.SynchPrediv = 255;
; w0 n* W1 T, M! s/ v3 n. f* @( [ - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
( T: p/ T0 g2 g" W' c5 J0 _$ z - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
/ ]0 N4 J" P+ k, A# `' o* b4 h - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;/ t3 z$ }1 c7 Q% u9 K
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;4 V; w# o( O: ?' V; r/ z
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
" S# U& @9 d- T8 I$ P3 ^ - if (HAL_RTC_Init(&hrtc) != HAL_OK)3 a/ ^: y* c. t) R/ h! d) |
- {
5 @0 x) X, ~( F0 Y; ^/ h' \ - Error_Handler();
/ L1 f" ~3 z" J% G1 B' { - }
" a0 m8 T* y: y3 Y - " M2 b5 @ _5 j) S, Z
- /* USER CODE BEGIN Check_RTC_BKUP */
' X3 R6 a' W) e' J# q p' T - // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿2 c5 g, Z& w! u( Z( J$ s
- // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)7 p/ K0 T" ^+ q; l* X( E1 i R6 A
- // { R. l A8 ~5 a0 F1 v5 J1 y! |$ {! g
- // //已经初始化过了,直接跳出初始化函
" z" _' ^6 v9 b' `0 s - // return;
! Y! d3 G' x1 V0 o5 g; l - // }
: }& Q% Z: G2 @. t+ A - // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿
( Y5 }8 N- }1 f - // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
0 m( s3 l& U6 l$ Q2 d5 T' v* S - /* USER CODE END Check_RTC_BKUP */( O4 F4 Y& F+ Y$ n# ^2 u" t
- % P% n* v9 @: D
- /** Initialize RTC and set the Time and Date
1 H% @8 H* x; I - */* d0 e( L, i* L$ U$ J+ b) V: j) O
- sTime.Hours = 14;, o1 u( a$ y: I3 }% ^
- sTime.Minutes = 50;
6 S4 S5 z6 g( c9 H+ Y - sTime.Seconds = 0; j0 w! m2 A4 N" g4 m& ~' y
- sTime.SubSeconds = 0;
* U0 i6 G R- S - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
/ s& s8 Q7 M# x6 {7 c% g# V( c - sTime.StoreOperation = RTC_STOREOPERATION_RESET;- S. Q( T% n# B5 r& C, ^
- if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
: w5 o1 l8 ], P/ z - {+ L% a& N( v: {" B ~
- Error_Handler();( `: Y* q3 ^5 x. J2 x: ]
- }
5 m' Z2 z/ y* q - sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
# g5 ?, T$ x2 U - sDate.Month = RTC_MONTH_JANUARY;0 S* G h! s& I; z8 p7 _
- sDate.Date = 28;1 B: q z( V4 D4 y/ D9 w* g3 D
- sDate.Year = 21;
+ A0 o' y2 o/ ~# ]6 n2 Q# x - 5 P8 l& {, G3 k0 `' j1 r
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
- m1 ` p) H4 S) e - {
5 P8 f, q& p, ^) _ - Error_Handler();9 r A; m! t1 q$ Y+ J0 B% \
- }
, g1 N, u: e) m3 v. {8 W7 R# T - /** Enable the Alarm A
8 n) X e; n' A# j+ a' } - */
- G' ^" U9 D8 |) A [# l+ D; ~ - sAlarm.AlarmTime.Hours = 14;4 x6 p, ?$ v8 K- {8 H" [
- sAlarm.AlarmTime.Minutes = 50;
1 j6 H% Z4 k( G. @& `, C: L7 }7 [8 T - sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断% ?1 l2 v6 t5 ?* Q2 Z: Y- A/ v
- sAlarm.AlarmTime.SubSeconds = 0;
# |" J4 s+ X* T6 J# w% _ - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;. e& E. O1 ]7 `/ \/ |+ Q# c
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;! B2 ?6 Z e# H7 {8 A7 a& c
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
0 ?# \! K4 D* ^& c3 o0 [9 m - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;4 {/ l; J5 \$ k6 B, u, {, b
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
. d- O3 G ^0 \2 V) t- D - sAlarm.AlarmDateWeekDay = 28;
% Q' s" Y0 D6 i7 \6 U* o8 g) } - sAlarm.Alarm = RTC_ALARM_A;
/ P; J3 N: `3 ]# ]: w8 ^' U; j - if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)2 z( `, e( x6 s; \
- {
* a. @* b; M0 D0 ? - Error_Handler();( { b* U9 f! M
- }
2 y, k( o+ y+ V - /* USER CODE BEGIN RTC_Init 2 */
% _" ^, e1 a2 s% N+ {6 K7 r& y
. H6 z0 T! A6 b, I! |- /* USER CODE END RTC_Init 2 */
3 }) k5 C. e: k& Z8 k; C: \* _0 \ - 3 d: M: {0 e0 U
- }
复制代码 4 x N& O" |) p' O" C. K# m
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
3 e+ S7 l& l9 ~8 r# [3 d3 |9 ~1 P/ a8 W( ^: w: a& a
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数& D7 J+ B' J. k& z! U. Y
- /* 设置闹钟下次产生的时间 */
, |# k l+ y; Q1 R - void setalarm(int hours, int minutes, int seconds). j$ M; Z! F& p% {. h
- {
v( N: W- _, M6 l- }+ m6 S3 K - RTC_AlarmTypeDef sAlarm = {0};0 J. d$ v0 u* \7 O# a7 J9 v
- RTC_DateTypeDef sdate = {0};
) B/ L$ ~$ @, H - RTC_TimeTypeDef stime = {0};
( I) Q5 W" v6 p5 v
5 Q3 C- E# g* _) ~9 _ l/ ~- //读取当前时间
, V- ~; M4 k8 m2 v& w* ~ - HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
W: v! d6 ]0 B - HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);, Q. |9 q) ]: S' b7 K
- //获取设置中断时的时间
7 z% h0 B3 U; v7 V7 O; J3 g* I9 D - sAlarm.Alarm = RTC_ALARM_A;$ |, z d, j7 ]# a9 O! L
- sAlarm.AlarmTime.Hours = hours + stime.Hours;
; P+ t2 ? S* P: I' q0 a# ]3 `- y8 q - sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;: r# C& _# F: G( h/ @4 Y$ T+ z
- sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
# m, V; W' X: m+ [1 j7 W! n4 l1 B - if(sAlarm.AlarmTime.Seconds >= 60)6 P; k7 |1 ?3 l) y; l
- {
+ M2 j$ W2 v0 ~ - sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;2 \1 c/ X' V F) _9 \
- sAlarm.AlarmTime.Minutes += 1;" E" o9 m+ d: Z4 e% N% F/ t
- if(sAlarm.AlarmTime.Minutes >= 60)2 q: v3 t0 ]. G
- {$ B# S* ^- p+ @/ P4 r
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
6 R7 w2 {9 o9 G - sAlarm.AlarmTime.Hours += 1;
0 p& J; i5 @/ S" W+ c( w - if(sAlarm.AlarmTime.Hours >= 24)
. y* h- p& e! K r x# n! G - {
4 U9 r' ~1 J! T$ B& I: P% l - sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
& p+ @& B0 c- r; i) h+ j - sdate.Date += 1;% P1 k# W7 K3 ^4 u% L0 j
- }
7 R+ I e6 p- w+ Z3 E0 n( I - }& E0 s$ {# q* d9 j% q5 e {9 v& L
- }0 Q" J. w) D! g! ^7 h2 b. r4 s M) @
- sAlarm.AlarmTime.SubSeconds = 0;
$ @* T- Y& f. o0 `% W - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;& B) d! B( G, j w- r2 h, R5 |2 d
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
* X" R% z" v: l& A - sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
4 G, h& r# \6 g% c& b' V4 r - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
( P( @! f) {, _7 B3 N. M2 g - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
8 f" j! A0 A( V2 K8 h3 Q5 ] - sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意
+ {4 R: _5 B% d2 K; w - 9 y+ D+ q0 z, ^5 o: ~0 m
- ( W, M# f, I; {0 O9 d
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
- ^: _8 q% d$ U' H - {
8 I8 p0 m3 }' C) O - Error_Handler();
z, d* Q! n: q - }
2 l( v9 ], G% L B J3 h - }- p7 M% j. i1 k
- % `0 t9 _8 @7 z0 q; F
- /**
$ {: p7 d z- Q+ J- L* l& P! @ - * @brief Alarm callback 闹钟中断回调函数
1 ~+ k- [$ j- Q+ p s& T, J( {6 C - * @param hrtc : RTC handle
0 _; J( y/ M/ l/ Z' V - * @retval None6 U1 K4 Z3 D7 M7 @1 P, Z& ]/ h
- */
) h8 f1 ]9 b, u4 S - void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)5 @& K0 G: C7 H
- {) y0 l9 T2 ~$ H: \9 M
- static uint16_t sEnterCnt = 0;
7 g1 L" B4 x% y+ R3 D
* V2 k6 x2 P4 D a' y9 i- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断9 @" ?- B* }: i3 [+ O; I
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);( F: B$ e8 \1 L: F$ \9 m
- }
复制代码 0 u& u* |- D" N w; v0 Q) r$ R
main 函数+ ~0 X( h4 ]/ Z: B
- /**. w% ~% R% E4 e2 y+ w
- * @brief The application entry point.5 t) v) ?8 K( j: J
- * @retval int' F4 m) L7 X7 I" P1 x* D0 D1 o
- */
: z) @( W" U; Y- j6 J; a - int main(void)
9 p* K1 v6 z% I - {
2 j1 M2 u0 T* l* N2 g3 `% G' D/ ^ - /* USER CODE BEGIN 1 */9 W. s, Z8 w! w( _% a
3 \4 N, v8 P7 t, K! c" z# {5 x- /* USER CODE END 1 */
/ U7 N8 X5 Y. u& K \6 n - # J' [. \1 _! [# u8 k/ X/ `0 u. n9 J
- /* MCU Configuration--------------------------------------------------------*/( C/ N; k4 R4 |3 z2 }9 |3 M
- 8 C) Q0 j1 |5 d$ t( T) E* o
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */7 y! ~$ Q8 R# }& _* A+ Y I
- HAL_Init();8 c' f+ f% c7 d( n0 k+ g
- 0 G3 _2 T( Q1 g' D6 b
- /* USER CODE BEGIN Init */0 l1 p1 n9 O) L* ~) }
- 0 v N4 Q: a+ C# l
- /* USER CODE END Init */2 [0 k/ x3 L: O* p
- # R# E7 k2 t+ j1 s( @) h
- /* Configure the system clock */
/ P/ ?9 [1 }9 U( k- J I - SystemClock_Config();
3 S/ I8 {0 o* M3 v5 N/ n9 o
X4 u% ~, }. D/ R) C8 G- /* USER CODE BEGIN SysInit */9 K C& R$ s6 b! n- W
) L: \ I- j" B, V9 ]: T, @. M/ u- /* USER CODE END SysInit */7 E4 p0 G' m+ i9 E/ a
- " r5 s! e6 M8 \. _! U
- /* Initialize all configured peripherals */3 |( o4 _: q- |0 G+ ]
- MX_GPIO_Init();& n" m# M: B; b2 v% {
- MX_RTC_Init();8 N0 C; g, [" g2 E/ j
- MX_USART1_UART_Init();
) n$ A. P) @5 `: M2 K - /* USER CODE BEGIN 2 */+ a/ p( e( C0 L9 `7 t
- printf("stm32g030f6 rtc & alarm demo start......\n");0 _3 x u. K- m2 b" ?- R% R
- RTCStatus = 0x01;9 E/ H" ~. O- r0 `* n% H
- /* USER CODE END 2 */
; o& m" A5 R; w: d: g% l - & x5 T) {! I0 `) A: O" ?' L- j
- /* Infinite loop */
+ q$ U4 E3 ? t4 |4 u& N$ B - /* USER CODE BEGIN WHILE */2 K$ {6 X" K7 j+ }
- while(1)
z/ a/ h8 G6 M5 {$ p/ x. A6 d - {/ G7 }- ?0 k- W7 H1 G/ w/ K! m" V& @
- HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);. a0 }( ~) R4 S$ Q6 N/ Y" k4 X
- HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
4 g) W/ F6 Z# f: b( u" T" U* D - printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);' t+ J- q' H6 R
- HAL_Delay(1000);
+ ~2 ^, Y$ ^5 K) t4 L+ Y& H- } - /* USER CODE END WHILE */
2 [0 F7 _2 k! j( w4 i% {
~2 F2 B& ^6 s5 ~, c1 D- @( v* o- /* USER CODE BEGIN 3 */: ^7 j, ?. N( K% D* L
- }
* m) p5 i; [2 {* { - /* USER CODE END 3 */
- k5 y* Y2 U( V - }
复制代码
/ Y/ ?# E6 u$ o. E主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
, B3 j6 m1 N# C; X
8 C" I% r2 U8 O& D; g3. 编译并下载测试
" w3 n0 Y$ `8 ?将程序下载到开发板中,连接串口助手并打开; R6 m; [- u1 O+ C8 y+ p
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.' j2 B7 g# _# T
/ f$ i: K+ w8 [5 v
* t" F; f" X- ^4 [/ [& p; `: G% k$ q3 U6 n+ n) B8 D) p
|