1. 使用 CubeMx 创建 RTC 工程
a3 o$ b4 }* P& \& F) \打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject./ H& d+ y6 W# L! `+ v
2 J L5 }3 Z. U先配置一下串口,用来打印相关信息
9 p5 w* G, K( A% S
' U* ?, d$ [( q& X- y1 v8 h
& S D' B2 }: \; w
4 ], V4 N2 e( c; I1 p/ O. h再来配置 RTC
! Q9 s# R e; v* x2 y
& G( `4 G& X0 S/ i) P
, n0 a5 s7 w3 Y5 G9 M# T6 }0 Q) ^+ Y
! M2 }, F! o; \& ~
9 l0 ^) f1 U. D/ c# {2 c
配置时钟
2 k' ?7 d* M' P8 [. |' Y. w& o4 V
, f) x( P, G7 [5 @9 ^
# i$ W" ]& a+ d& B, ^( V: H* D5 C9 f1 y% J, O
ps:本实验使用内部低速时钟测试,未使用外部晶振.
( {# o$ Q2 e( D2 ?. P) z
( u" `( l9 \) j. \8 i配置工程相关选项
' N, p: v( I' B' p
+ O0 S$ W7 w9 Y( g+ }' H2 E/ _2 ?$ @( a' X" a2 N- @- W7 h
: Q }9 L, [0 y
配置完成后点击右上角 GENERATE CODE完成工程的创建
# U( b) V$ A; C! L8 c' c
" ~, q/ C4 C8 d/ i- z: T2. 编程
4 e4 i- _3 g' \2 @$ c0 \. E2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
; o- p; n( h" k# g! D+ p7 B" _6 V- /*设置系统时间*/
) g. n X1 C4 f7 d( |+ r$ x5 i2 ^' C - HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) 9 O( p' [/ y$ ~* T% | ~
- /*读取系统时间*/1 i4 Y8 m' W+ b, }+ W
- HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
6 q- C4 P% O/ C/ y/ r- I% g - /*设置系统日期*/
' k8 z1 E( ]$ W$ t& x6 \ { - HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
; S. o" k) u$ @; t1 o - /*读取系统日期*/6 D" D) l, {7 G1 x! x
- HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)' k4 Q" {6 t# c. ^
- /*启动报警功能*/
& C: `# ]* v0 [+ a. C - HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)3 z% ?& Q3 ~; R- i3 L
- /*设置报警中断*/
, s. p8 H1 I9 R - HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
4 v! i5 T& ?- u( [6 z3 e" w# t7 V - /*报警时间回调函数*/
/ Z& F/ u; [0 o; X$ N! ` - __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)2 s3 |+ M6 l4 W
- /*写入后备储存器*/: V, r3 T& }0 ~9 T5 k7 `
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data): o8 T# T" H% @4 z: _. Q' q7 Z
- /*读取后备储存器*/
' K7 [5 f* g; o5 L( \! D! O# H - uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
" [+ r {4 I: s) K8 a2.2 串口相关的代码' P' Q$ K4 K+ Q2 X' J( Z8 t4 r0 z* g
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数5 C) k7 {8 @& }0 ]/ `' x
- /* Includes ------------------------------------------------------------------*/" ~: M/ |- b0 L7 _$ R9 M' \
- #include "main.h"! j0 W) E& R6 v. [$ W, J; c: D
% L/ S S. Q$ h- /* Private includes ----------------------------------------------------------*// X! K% R" V# j6 A. k' M- P. D5 W6 C
- /* USER CODE BEGIN Includes */
2 u) U% g5 `( Y, [9 {7 D+ T1 e1 I - #include "stdio.h"; N$ d. w. Q- a. d7 U2 L3 ]( l
- /* USER CODE END Includes */
2 q4 f! o3 k7 q( r. C - ! o6 j5 E$ D/ M5 C$ D9 Y* Z* H) |+ ?' o
- /* Private typedef -----------------------------------------------------------*/ Q7 B/ K0 n# [1 P3 j
- /* USER CODE BEGIN PTD */
- Q! [, L! u2 G0 L6 _ - 9 ~8 y0 n- D2 L' [ |" F
- /* USER CODE END PTD */
1 b7 @ t: X2 P; g& h - ; i$ v/ y) C( ~. ?) B8 M' R
- /* Private define ------------------------------------------------------------*/
5 f0 E; Q8 ?1 c; r - /* USER CODE BEGIN PD *// I- E. P+ r3 ]. L. v7 m
- /* USER CODE END PD */
6 N' `( [% N. W5 c: a' m - 9 p5 y9 t( o) P7 a/ h
- /* Private macro -------------------------------------------------------------*/( H4 L# m P. Y* b
- /* USER CODE BEGIN PM */- f/ j& t1 z& a1 C( h
- 2 x$ R! [; R0 ]" b e
- /* USER CODE END PM */
* K4 W0 I6 u' s4 T - 8 [: Y; m# {$ A& Y, x0 Q! I* l# G
- /* Private variables ---------------------------------------------------------*/- ~( J$ I) y9 w
- RTC_HandleTypeDef hrtc;4 O- ~3 Z! x9 `. @3 Z) j
- 9 g) |, B$ N8 o8 b" O- w. n
- UART_HandleTypeDef huart1;
6 a) D. q/ Q8 ^3 A$ P4 n
6 w4 D1 `& d* u$ C' @! g! r' e0 o- /* USER CODE BEGIN PV */( ?8 M1 B( F: }( y
- RTC_DateTypeDef date; //读取日期
5 H1 U" \) f: v! u& B, P# c& U - RTC_TimeTypeDef time; //读取时间
0 l) |2 s& I; n2 g1 V3 x; |; b - uint8_t RTCStatus = 0; //指示RTC状态
6 r# }% f0 a T# h. y7 p- ~. m! | - ! d% @* ~1 Y1 v! A1 p" J( h; F1 w
- /* USER CODE END PV */- }. b8 f( b& A* d V
u0 a& S* W$ y L- /* Private function prototypes -----------------------------------------------*/
9 U/ h4 X5 _9 s* e8 F! W) ? - void SystemClock_Config(void); {" S! E1 ~8 C. \5 r( ^
- static void MX_GPIO_Init(void);% A4 L4 l5 C1 u1 c6 V
- static void MX_RTC_Init(void);! w7 U1 h4 {) d/ c, C
- static void MX_USART1_UART_Init(void);
) o3 a- s- F% c$ U, c& h B - /* USER CODE BEGIN PFP */0 x+ d. X# H$ Y" Y* X/ f' y" S
- // fputc 函数重映射& G# D" e7 ]( }8 s3 p3 l) g( v
- #ifdef __GNUC_
: a& b4 @( I5 B& v, Y' V - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
/ }* j6 k) J; {7 P8 a! P - #else
/ Z N" u7 {& ?# C1 M8 n+ s - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
% s1 m, M) u* a$ y2 V - #endif) {# z+ s" `) H5 V, N, S% Y! ~
- PUTCHAR_PROTOTYPE
. y/ K% c% x! |. O& x - { _! H8 I2 _ o( S
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);9 [( L6 S9 x/ T* I; f( U
- * w% u' ^; _" S- [. _! l ?
- return ch;# v7 H% w+ j: w: B8 S! t/ p
- }1 M/ E* F/ V, t! B0 g P2 w
- /* USER CODE END PFP */
复制代码
U6 B" k* Q1 F: I# ~! o- a! ^" }7 @6 B% w6 H$ g! w8 I, E
RTC 初始化
9 e" y4 |3 `5 u) Z- static void MX_RTC_Init(void)* H3 Q/ e" g! s
- {
/ w ?! d' R/ o8 ]9 k& u# ^
& ~8 ]- d( \2 `5 ~0 a0 l, L- /* USER CODE BEGIN RTC_Init 0 */- k+ a/ H* w2 ]3 F4 Y
+ e5 {. h/ @$ d# L+ g1 x+ }/ E/ E- /* USER CODE END RTC_Init 0 */
% r* |' P* _- D
) w, g7 P) Z* y+ s0 u' S8 c- RTC_TimeTypeDef sTime = {0};
" }* V+ y- c! T" g+ y5 _ - RTC_DateTypeDef sDate = {0};
6 Q4 r/ `4 N; B+ W8 v; E - RTC_AlarmTypeDef sAlarm = {0};
) `8 V( ]! w- @0 H
1 v3 {% V- ~1 R" m( J- /* USER CODE BEGIN RTC_Init 1 */% M9 y. t/ d0 c& P: w6 _# P
- 6 a9 V7 Q# R$ ?$ [7 ~3 U7 U
- /* USER CODE END RTC_Init 1 */- Y8 s1 ]; |# r, H) y4 D
- /** Initialize RTC Only
. N$ c1 g7 I( u( P( v. |* n& q* r2 d& P - */
* ^9 o: f; F$ h - hrtc.Instance = RTC;
5 F' J x& i6 o- i2 A - hrtc.Init.HourFormat = RTC_HOURFORMAT_24;$ V9 K4 U2 z% Q6 \
- hrtc.Init.AsynchPrediv = 127;" t" }0 `0 L7 b9 T4 H( g. B/ c1 A
- hrtc.Init.SynchPrediv = 255;! w, H$ s- g Y" j" Y6 n
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
$ Y. z% Y* I! O I1 Z9 k" s - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
* ?8 t( }! _8 u% `3 X2 q! [& H - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
S2 w# O/ p. k z% ~6 m! k - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
8 q- W, p- a! ~, s2 m T6 S - hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
: ?: Y/ V3 V2 l2 J8 [5 o - if (HAL_RTC_Init(&hrtc) != HAL_OK)" n9 ^ k% P2 W. Y
- {
8 ~/ K4 c% k7 B7 R* D; M - Error_Handler();; T( d" b' i$ V5 D$ ~
- }7 D$ G/ z/ H8 z7 u' ?) T* U5 @
- ; Q- z% i. N; t, } J+ V' C0 \
- /* USER CODE BEGIN Check_RTC_BKUP */
) s/ D3 r) Z- n O. N0 X" B - // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
5 T3 F+ ?2 h" B+ o m - // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)
( V7 c/ C q; B; K3 ^$ @ - // {3 b* Z/ i6 g- h
- // //已经初始化过了,直接跳出初始化函
$ w; J$ {% e( d; j/ d9 n+ e/ L - // return;
- m6 a$ N* {2 ?4 U S% i; L - // } Q: s1 ]2 I3 U4 e' t
- // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿! S! p& ~5 d- J" O; D
- // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
& i! i8 A" `. [' O; f0 C - /* USER CODE END Check_RTC_BKUP */6 D& s, l% Q# N( L3 G& T7 E* U- @$ Q
' I! |( q1 z" j' {' O# E- /** Initialize RTC and set the Time and Date1 b5 [; c- k l5 _
- */
0 R( g0 l6 u6 C* j) k - sTime.Hours = 14;
& g8 Z9 [( d$ F9 i* N) ^) { - sTime.Minutes = 50;
e3 [7 t- j9 H - sTime.Seconds = 0;
; c3 O8 o+ ?* k# H- a - sTime.SubSeconds = 0;
$ l! D% w9 z( C+ p - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;7 U8 u1 E: m1 T
- sTime.StoreOperation = RTC_STOREOPERATION_RESET;
* G8 I( u( a4 f+ Q" S8 I - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
J" N, m$ i! S; { C, C! W - {6 D! c& }- j0 f( N7 A( b n- U) ]
- Error_Handler();
9 B$ Q, z/ {; ?% ^* t# r4 B1 n) X2 ~ - }5 c& Z2 y o" X4 ^% ?. H/ i) G4 A
- sDate.WeekDay = RTC_WEEKDAY_THURSDAY;1 h5 U \5 i& p. n& ~ |- ^# a" D: e
- sDate.Month = RTC_MONTH_JANUARY;
' M9 {: {% G1 `( b: [ - sDate.Date = 28;
- I7 R) P1 @* o# x* `& @' o - sDate.Year = 21;0 |# \. T$ O5 S0 o( f$ X/ \% _
0 s g3 q( z$ `0 {2 y$ D- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)6 O2 X9 C/ ?6 t# `( b; A
- {# c3 e' V# K p0 l6 n
- Error_Handler();3 U3 k* j% ?# f5 ^5 h
- }
# p i' e, C4 t3 B% s - /** Enable the Alarm A
9 ~- E# [1 F2 R# C. P4 n1 ~' _ - */6 t' k, Q0 w- O1 ~, ~; ^/ k0 X
- sAlarm.AlarmTime.Hours = 14;
& v" E4 b8 R( c7 g7 v/ s- S - sAlarm.AlarmTime.Minutes = 50;' h" N- Y9 s) R1 _$ \) E
- sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断. i$ |4 d% R7 G; c. r8 x( [2 S( n
- sAlarm.AlarmTime.SubSeconds = 0;' j4 \# B' h& A2 i: @
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
) Y3 c$ D8 D0 p7 @" k- @4 r8 ^ - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;4 ^, ]- q1 L% B
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;! P3 o6 B, T$ c9 ?- W
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
1 I# u5 z, G3 l - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;+ J2 w/ u& k3 v$ d
- sAlarm.AlarmDateWeekDay = 28;
, W- C8 X1 B6 z. W7 z: | - sAlarm.Alarm = RTC_ALARM_A;3 f2 E/ T" e4 a" s2 g$ |9 M# r
- if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)! u. J: C7 N4 Z! k! u9 P
- {
; P6 O$ q: `! t4 ?7 s5 C - Error_Handler();
% G' O. S, T8 I% u - }( _* o0 y$ N/ d, T* G. Q2 {
- /* USER CODE BEGIN RTC_Init 2 */* X' d5 m+ i: c
; ^7 E* P7 _1 [1 b/ {- /* USER CODE END RTC_Init 2 */& s' T* P, H6 q) c. e0 C% U
- * U* D, L3 Y7 h# P' M2 D: j* W4 W R
- }
复制代码
: p4 m9 k) r3 g2 S此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生." _, R2 ^2 j8 ^+ M# i; t
3 ]( g! I# g( p: }7 Z+ c; v9 O
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
8 c1 n7 n0 v# h' L- /* 设置闹钟下次产生的时间 */
% p N/ J5 l/ Y6 Y2 y/ |8 O9 U% G8 N( h - void setalarm(int hours, int minutes, int seconds)1 W* m4 U* ^. q0 j- T" W0 L3 e2 E
- {
! R5 o1 h Q/ U% `9 O - RTC_AlarmTypeDef sAlarm = {0};% X' C- O3 | f. {& s* ~
- RTC_DateTypeDef sdate = {0};
1 y. ?8 n4 }8 E5 K" ^, i- Y( ]9 Q - RTC_TimeTypeDef stime = {0};
0 Z/ k \$ C1 s1 A& L# L
: r/ B8 [# O2 a- T! ^- Y& M- //读取当前时间 % I+ J. C* K' _% X* H9 E/ z U, w( `7 m
- HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); * x$ E+ B. m) l9 w- d
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);0 [6 f [, W0 J- R* r! @ l
- //获取设置中断时的时间
( Z6 Y x' M9 y6 P$ b5 r; ] - sAlarm.Alarm = RTC_ALARM_A;
: Z# ?* V1 ]$ g9 F# g& D3 T - sAlarm.AlarmTime.Hours = hours + stime.Hours;" f3 b( f' z' x& Y6 ^1 ]1 p
- sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
8 d }1 f2 z+ P# j/ R( B3 x7 f - sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;' c, g+ C2 ~; ~8 `
- if(sAlarm.AlarmTime.Seconds >= 60)
7 I [( v# A8 d' u - {
% z1 C" D5 k, F1 x, D& E - sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;8 D9 ?5 r+ ~4 X# {
- sAlarm.AlarmTime.Minutes += 1;; a1 I8 v1 {/ w1 |* u
- if(sAlarm.AlarmTime.Minutes >= 60)) ?; w$ W8 y& e1 U
- {8 [% N+ a" [+ Q0 L: j" r) P0 G
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;( k) C1 p# T; |, U0 J. ^
- sAlarm.AlarmTime.Hours += 1;
' O% {0 q6 M/ ~4 V. b. w: w/ h' U - if(sAlarm.AlarmTime.Hours >= 24)* t0 w9 L2 O% L( K# D
- {% Y$ g; ~! p/ Q, a0 A- F0 W
- sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
1 R5 c7 F1 E5 Q3 i/ ~# S; _( [ - sdate.Date += 1;
; [1 Y, I% H/ Q M* W' s - }1 R) a Y" a8 K/ L2 m& I
- }
/ u" F0 p- E: f! Q0 b# X - }9 x4 w- W* ^8 H* ?! s7 V
- sAlarm.AlarmTime.SubSeconds = 0;+ O6 s* z/ z2 F. T, F( ^" D
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;$ C/ h3 p1 U) W9 u
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;: f$ n9 W3 Z Z; F( y+ G3 e
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
3 Q0 q* |- g4 s! s9 I+ h" v, L - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;9 L6 m2 b) \0 d
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
3 _* q7 p( M" ~ S! W+ d5 C - sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意 J) S1 _; Z+ j6 M7 k1 } {# L4 j
* e i; e" h& {/ J. Q7 f- 4 l1 J" D4 s$ e5 @7 x6 K8 u: P
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
$ i2 h) a- v. Q; _% ] [ - {
7 ?1 A3 Y) {: A* d% c - Error_Handler();
3 M9 Q7 v# D& U: C5 \ - }
' K d% S. `( c; m# a - }
; b3 |" ~- P5 ~5 ` - $ W/ {, t, r- R- V4 E# N! R
- /**
8 z- o& c3 S2 {; v - * @brief Alarm callback 闹钟中断回调函数' m2 v$ V4 @0 y5 F* \7 t" Z" x; P; o; v
- * @param hrtc : RTC handle
1 f7 U( W/ k7 Y2 Q$ P& g - * @retval None
( x& ]2 O0 U6 M3 l7 w4 i - */
$ ], A, f& s z! q* }$ d - void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)) G* W3 L }0 N8 x8 p" o9 ^: v
- {8 E* z9 [7 `$ L$ o
- static uint16_t sEnterCnt = 0;
/ p/ S/ K1 w1 ^7 |/ ^0 {# T( ]
7 A% c! q [! \+ X- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断; b) a9 r6 M# T3 a" @1 x
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);2 m0 b* r r C1 a" E' A# r, @
- }
复制代码
6 G* X' L9 b: h3 G$ W0 Ymain 函数$ g* t* \5 d' x" U$ k# u
- /**. L4 J! J3 v) M. b
- * @brief The application entry point.
: q0 R j5 Y% p5 p) T! F# \* D - * @retval int9 e* I# Z4 h% H3 @0 d
- */ ?+ ~! l0 V# \3 A! x: A: ?9 Q
- int main(void)
/ D. @! ^& D2 O) ?* y - {3 k. L3 }2 A- g: b+ X; g
- /* USER CODE BEGIN 1 */
& N. l+ X/ c: D, Y7 _1 y) [. g - ; {# f% f. `; g, o2 C
- /* USER CODE END 1 */# ^% D; _' m* j/ O
u( y9 K0 b ]" \; V, }! i' o- /* MCU Configuration--------------------------------------------------------*/
6 k3 }% E0 w; Q* d. u, E - 5 e' B0 g. \( B
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
5 k0 v4 t. a. ?! a - HAL_Init(); u, K3 ~0 N0 H
- : U1 J, W4 b) U( b& d/ ~9 l' E/ }( K+ F
- /* USER CODE BEGIN Init */ d' h* O2 D+ R# d& ]5 m R/ M
- ; K9 J7 U6 i3 z& e4 v/ i
- /* USER CODE END Init */3 h: U. }; Y4 G! r5 @. R+ Q
4 Z4 ^1 |9 Z+ ^- /* Configure the system clock */
1 N3 @9 d7 F& i3 h0 ?( } - SystemClock_Config();, h; z- o. ^1 \$ `& ~
: }3 w& k+ N) K. y- j% P, I- /* USER CODE BEGIN SysInit */
' f7 Y* _! X2 I- a# ?* T4 U8 P - 1 P! W, @# n7 o8 D" T
- /* USER CODE END SysInit */- } t7 g) k3 J( E3 E
9 w `% ?, P5 \: F+ O8 A& Y- /* Initialize all configured peripherals */" G& t' h5 @ k, }' f1 T" s
- MX_GPIO_Init();% L: H) `- B1 S
- MX_RTC_Init();
! `, V5 M2 e: u; R - MX_USART1_UART_Init();- n$ X% q5 m$ ^2 C9 a2 a
- /* USER CODE BEGIN 2 */
: E# W* u" _$ H5 p" n - printf("stm32g030f6 rtc & alarm demo start......\n");, ?1 |4 a) A) S$ [, W j
- RTCStatus = 0x01;* y1 v+ u! ]' B" G) T2 n C
- /* USER CODE END 2 */
# x% `+ ^" m! z
1 B' e% f4 `' S1 O* ?1 m- /* Infinite loop */
- a& Q" O9 s- a0 I# n( f4 K \% T - /* USER CODE BEGIN WHILE */# }& E, ?+ N% w" x- A, l
- while(1)7 e- E2 A5 a8 ~% f/ C0 m
- {6 g6 Z1 M& m7 o4 F6 @/ k' V
- HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
1 _# C, m7 B) H; z$ e B3 Z - HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);: Q. Z1 h0 b8 F/ n% i" Z2 C- \& B
- printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
) H0 E" G3 F5 i |& \: f - HAL_Delay(1000);
( H( O) x5 R9 Z - /* USER CODE END WHILE */
& _% N; Q% b* }' t& ?- r- a) a6 x& c
9 @* F, G* h- L b( ^- {( N- /* USER CODE BEGIN 3 */
9 {6 ]$ v9 N; D, E) H - }
6 z+ g4 ~* \1 e% ?7 D - /* USER CODE END 3 */
1 E) U3 ^. Q @" F) j g - }
复制代码
" V) @3 T# a! M( h主函数中每隔 1s 读取一次实时日期和时间,并打印出来./ M: z, e# n+ c# e1 ?
& k: x" R: L2 u6 A, V1 C% C, p9 ]
3. 编译并下载测试
2 V$ X! W8 O C* P/ O4 f+ l将程序下载到开发板中,连接串口助手并打开;
8 z+ E* C5 O. Q4 g- p8 H/ q实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.- O4 S! m7 X- K/ b! t
2 m* d9 M+ e, j+ ~
7 b8 n/ k' B* B U$ l! y9 i+ H( r+ d$ ~" y- w+ d
|