1. 使用 CubeMx 创建 RTC 工程
% {: V2 l3 ?) A% u, z. m' r4 e打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
( N( y& d% h3 O7 N: S& v. v j# }7 S" I
先配置一下串口,用来打印相关信息$ _, H y' U; f! x
1 N- Q# t" @: F2 q, a2 K% Z7 v) M
, X: s' `1 P6 Q& w( I2 ?- F/ l! J% Z$ R" M1 q: [6 H+ P' W
再来配置 RTC
' y& S# [0 B1 k# t0 u% r$ ?
) m! p8 o7 B# m: ~0 K5 V* Q
( Z1 a7 K# `; r# _, `1 K
& C" T) a. P N' ?& s/ P( `: H2 g/ R% o* ]" j1 u8 X8 K' O( C
5 X5 [' O% D2 R! E; I7 ^: P( H6 @# {配置时钟0 c7 K7 s r; m, n
. h7 z2 W+ C: W, z4 b# r+ o/ o
: h v5 \, S' Q) q0 _) p5 l/ b8 A6 e) z0 ~4 c
ps:本实验使用内部低速时钟测试,未使用外部晶振.
0 c8 z' o5 A1 `8 V& k5 l
2 }3 C$ I* b; f# p( O, p# H配置工程相关选项2 H# d/ {$ @" Z2 b: ]; N
" o( e- j7 l& c+ Q! K
0 J. C3 \! f: w: g8 z3 x; U
% Z1 v2 x1 u2 s6 ?5 p4 b配置完成后点击右上角 GENERATE CODE完成工程的创建/ b: T! g: A* F$ n6 }: x8 c9 H( U
& B3 W& a" r) C, ]+ O
2. 编程
) A1 f, {0 v2 ~! O; U+ _! w9 k2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口" }0 z! q8 _9 {
- /*设置系统时间*/# \0 [2 O4 q( t5 E! K
- HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
+ o7 v6 K9 M* A8 c0 ?: E% S - /*读取系统时间*/
7 L! D; N8 a4 s! j - HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
3 i, E) ^! `) ?: @. Q - /*设置系统日期*/% i* H; ?& e$ K, _( @. v
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)2 v+ P$ ]8 a+ ~
- /*读取系统日期*/7 I1 m" m1 M# x8 I
- HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
6 J: d1 V7 ]$ g( P1 T( ~2 p - /*启动报警功能*/. E2 ]9 M3 I+ L
- HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)' w3 r9 H# z5 e0 K; {
- /*设置报警中断*/
1 {" u1 J, U/ e3 S1 e9 A8 h/ u" Z# @ - HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)% ?6 ` a. k0 q0 ]/ a
- /*报警时间回调函数*/
" O' s3 I# ]/ y/ N - __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
6 S8 x3 Q$ p* D4 @# S) J4 U - /*写入后备储存器*/2 s$ Q: O8 j' W7 Z
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)$ l3 O+ _0 p8 m! n0 L
- /*读取后备储存器*/# [# f' {8 _% C; T: m- x
- uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
: X D8 ~1 R* h; `7 p. ~. U9 i2.2 串口相关的代码3 ^$ z. z$ R2 f" {
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
7 `0 ^4 d+ x" c! M) m6 p8 U4 E6 O- /* Includes ------------------------------------------------------------------*/
4 B. r2 ]4 a7 w ?0 l - #include "main.h" V8 h- l9 z+ s( v7 |, }
! X* R; e8 S( f" x- /* Private includes ----------------------------------------------------------*/
1 {/ ]" Y! y |, g Q% h8 C - /* USER CODE BEGIN Includes */
5 J8 A _0 f. |7 G' f - #include "stdio.h"( I; ?8 u9 }" X h3 @3 X: F
- /* USER CODE END Includes */
* F5 u3 b4 B% Q$ ` - 1 E% j0 Y0 `$ }+ y( ]4 K
- /* Private typedef -----------------------------------------------------------*/* k; x( Z. O3 e5 u. {( a# z& r
- /* USER CODE BEGIN PTD */% T9 g% A/ r+ v1 [7 u- ~/ l
( k! `" l' @7 z2 I3 t- /* USER CODE END PTD */
, S; p$ j/ U9 Z4 p1 S$ K" u# y; p
1 ?* k) Z2 a! f- ^6 t- /* Private define ------------------------------------------------------------*/
+ D- H P. c% y& q, M9 z" l - /* USER CODE BEGIN PD */7 T' P" m, j+ |- n) u8 b: e0 m& p
- /* USER CODE END PD */* y2 I$ A0 @2 m
7 V1 N( n0 f7 k- /* Private macro -------------------------------------------------------------*/
+ w/ t& G" _; t* e5 ]! p - /* USER CODE BEGIN PM */
7 w% M0 F/ x8 H& X% u1 k7 g - $ q( D' F' G0 z( ^. F& H- ~3 ~
- /* USER CODE END PM */0 `, M; w3 D; Q/ _
* i# ~3 Q( [9 K, s- /* Private variables ---------------------------------------------------------*/
6 C3 w' s* a: f4 o( ` - RTC_HandleTypeDef hrtc;
, h' O/ P7 h; y& y( ?9 T# s5 v {2 I - ( c Y# a! b% R1 N1 O
- UART_HandleTypeDef huart1;6 _7 P: I. J' ^ v; n0 g+ d# H
& e, \: D* E0 I' {1 g4 M- /* USER CODE BEGIN PV */% z, j0 J3 S/ t0 M# ]3 i$ A
- RTC_DateTypeDef date; //读取日期
1 S/ e1 N& w; o- A4 l2 P - RTC_TimeTypeDef time; //读取时间
9 e! @7 R' D+ u* T6 s - uint8_t RTCStatus = 0; //指示RTC状态
; y! \4 f. J, s% e - 1 N8 g0 s7 ?% I) i( ]
- /* USER CODE END PV */! X& O+ N" h3 L! C
- 7 v- a' y& [% {6 M" t* b% d) R
- /* Private function prototypes -----------------------------------------------*/5 [, A2 Y" h) ]* ?: ]/ r# ^
- void SystemClock_Config(void);; P q0 j$ O( w6 b$ u2 j
- static void MX_GPIO_Init(void);
' n, U1 H6 D$ Y5 j- t - static void MX_RTC_Init(void);
! {& y, }' ~% s1 T - static void MX_USART1_UART_Init(void);& k/ }! W, a! M% x5 ]
- /* USER CODE BEGIN PFP */
0 p( b* i' C4 A! b, W" _ - // fputc 函数重映射7 f2 G# d# w' e) {, q3 g
- #ifdef __GNUC_5 c' A6 H2 Q/ ?$ K. Y5 f' F! X
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
$ {$ @4 }# {- P, N6 m1 E( o$ G - #else
~) {5 N/ D! P. ~; c* Z! c2 a - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)+ @+ N; J t: O, Z
- #endif2 F) U! E2 `3 e/ l
- PUTCHAR_PROTOTYPE
" M& K5 {( |4 _$ b2 k - {
5 [. `7 c- t6 x y3 ~ - HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
( [- p. [& w& C3 j- _1 r4 K - ) n6 {' L$ E8 l' q" Q
- return ch;+ V, P0 m4 j( H- J7 E- ^
- }* W# F" a8 A6 P* A' J
- /* USER CODE END PFP */
复制代码 5 F: t8 ^4 o4 V4 v3 q$ O$ ^8 F
( x; M( Z8 w$ |9 k# [: o sRTC 初始化. u: a. P+ R# D9 l! |0 h! s& n
- static void MX_RTC_Init(void)
% G s5 l, H$ m4 L - {1 v% X4 `) G7 @9 L
- & u' f' i7 w; e' f# G
- /* USER CODE BEGIN RTC_Init 0 */
3 ]- a r" h3 c8 l - # i0 @+ n |7 |; D% c
- /* USER CODE END RTC_Init 0 */
P. l* q$ q3 Q - 3 V3 H6 |* f% u b1 n2 w
- RTC_TimeTypeDef sTime = {0};
7 I7 S, h t& m0 Q - RTC_DateTypeDef sDate = {0};
7 z6 H" P$ s/ _: a1 w2 X - RTC_AlarmTypeDef sAlarm = {0};
+ b$ n, P" i# L7 l2 q7 R
$ Y C% ]- P: b6 L- /* USER CODE BEGIN RTC_Init 1 */
% j7 u" B/ s( s+ q1 X
5 K9 p& ]+ I% p- /* USER CODE END RTC_Init 1 */
" ]+ Q# U% f( n; P2 p7 z) r - /** Initialize RTC Only# p' ^' x) t7 ~& n$ ~- N3 }. x
- */
8 `7 {) J" s& }; Q& C0 D, U! t - hrtc.Instance = RTC;
( P2 V/ q* C/ l4 F - hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
% O9 \2 g a9 |$ K& N7 c - hrtc.Init.AsynchPrediv = 127;' s" o) N$ o! z6 w( W
- hrtc.Init.SynchPrediv = 255;3 c6 W u! q, V9 s. v8 u
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;. D" Y6 d5 u e
- hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
# i* r' _) F- n - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;! {& i: R1 q2 Q/ p1 {! y& O; \& P
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;* [: i1 V6 O3 t; {' y" Q4 f B
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
" W j4 c3 W' i+ B% E& R7 d% P - if (HAL_RTC_Init(&hrtc) != HAL_OK)8 b. c" |* H9 y
- {# a$ F8 h, b6 P
- Error_Handler();
3 |4 k# l: Q/ P+ t6 ?# h - }
; G) m+ d. ?6 b
# }7 u' C9 V/ J& V- /* USER CODE BEGIN Check_RTC_BKUP */
0 [; w, _+ F, o+ r! Y - // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
7 Y' V& ~5 X' O: m, Z4 b; \1 f - // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)8 X( z7 G' A! e, Y8 W+ m* ~4 D
- // {/ Z5 R6 g6 L! U; n" V. e
- // //已经初始化过了,直接跳出初始化函
0 Y9 b; b( ~6 G8 ?4 W- @. W - // return;( Y6 m: y- ]9 O- J
- // }
0 u8 t$ {2 P0 ?( T: m+ ^ - // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿5 h w( q c7 N" ?- ^( n4 s
- // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);, `4 h7 H4 d: r* q3 t6 _$ J
- /* USER CODE END Check_RTC_BKUP */# `) J+ Q# x0 k- c
- $ ]; N& E; W! q/ s; `
- /** Initialize RTC and set the Time and Date
& s/ S- P7 @2 E# f - */2 z3 }, B& { T! I4 V
- sTime.Hours = 14;
: _1 W7 G! Q' O7 w* M z# C* ` - sTime.Minutes = 50;
2 r: t% b0 ` i! p - sTime.Seconds = 0;
7 c) y# d9 v; \0 ` - sTime.SubSeconds = 0;5 |) D* G! N. V. c. r9 w! o
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;, p7 N( F% i" B' E$ m5 t' D
- sTime.StoreOperation = RTC_STOREOPERATION_RESET;
- ~# U2 x* u& A& s7 K+ o - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
( R! i* Y% z8 \* f2 e! e - {1 b! G7 _9 K B% l
- Error_Handler();
( m2 m1 z1 w. g U( M' u - }
3 b) {7 T1 O: ?$ b/ k - sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
( a. @/ ?+ A9 Q, X. H- I& N$ l - sDate.Month = RTC_MONTH_JANUARY;0 x0 l3 r" G2 K* S& f: m" m
- sDate.Date = 28;
% x8 m1 l' a! {- r. Y8 i4 Y1 l - sDate.Year = 21;5 i/ A. {% p4 \8 Z$ P6 e( o7 c
- $ [5 s6 ]- |0 G) R! \' I
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) q' U9 C R+ ^" T$ z
- {6 H' U$ l+ J5 n- ^
- Error_Handler();
8 ^0 Y4 I# Z( S4 P' _ - }
?0 F1 v* v( ^8 N" X4 H - /** Enable the Alarm A+ a# J' u! L6 T* d( v+ A
- */
: b: h3 S9 L* P ~6 s$ b/ R - sAlarm.AlarmTime.Hours = 14;
{4 a3 D' d+ w. v; w! w+ v - sAlarm.AlarmTime.Minutes = 50;9 |$ `$ ?$ X7 s8 w0 b
- sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断- c6 p: L* w) N. n4 W
- sAlarm.AlarmTime.SubSeconds = 0;$ f* F, Z1 |6 w1 ^6 b
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
$ {% M. a7 t: i: m& S - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;" S+ I6 A' |- `/ J, k% ]/ m6 V9 S
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE; F& U) n0 i9 }% U3 M+ u
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;5 O- c# z# v7 _6 V
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
9 g( ]( @$ v4 i9 V4 Y - sAlarm.AlarmDateWeekDay = 28;6 G; ^- y0 ]0 v
- sAlarm.Alarm = RTC_ALARM_A;
8 j- C% h9 }; h1 o$ F6 L+ ` - if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
0 o+ x3 e% |* m/ q9 W) i - {! ?3 M& `6 Q; E* z5 W5 m6 @
- Error_Handler();4 y6 x4 H/ X, l W- _ ~
- }' A3 L$ k* [) R) P6 k) s
- /* USER CODE BEGIN RTC_Init 2 */* ~4 P" D( s1 F" l( t Y
' K! e$ f9 f/ k$ q# t" j& }- /* USER CODE END RTC_Init 2 */
]; t0 w4 ^4 z$ f$ `/ q) u3 n5 Z - ' ^4 X2 u9 ]5 p; E# \9 P0 Z
- }
复制代码
+ ]4 N+ U: r& n9 |此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生." F" T$ H. N* O- g/ N2 E
1 g4 ~: F. s" b配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数: [7 j: P/ n1 m/ H; b% w
- /* 设置闹钟下次产生的时间 */
! d# B. a* s# p( d, @6 o6 D4 n. ~ - void setalarm(int hours, int minutes, int seconds)
7 x9 B$ a6 |4 h+ ^; s- J - { ]! m; P3 M4 N
- RTC_AlarmTypeDef sAlarm = {0};7 a6 ?9 k' I) N7 r- x' [' P# H
- RTC_DateTypeDef sdate = {0};
7 T2 \ o% j5 T - RTC_TimeTypeDef stime = {0};
/ f6 r) u. t- ?' e8 h& W/ g - $ J4 Q- w4 d8 f( r! b" C
- //读取当前时间
6 O3 Q) e* c2 g, I$ Q - HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); o6 U+ _6 {/ s0 O& N% ^
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
9 H5 Q# N3 J: [+ f8 n+ r0 g - //获取设置中断时的时间% T, H; c4 w6 K- g/ t$ F9 J
- sAlarm.Alarm = RTC_ALARM_A;
# ~( Y8 G7 y6 |9 A1 B/ H8 z - sAlarm.AlarmTime.Hours = hours + stime.Hours;
* |: r& J2 a0 ^4 o - sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
1 p3 d& p L7 Z; K8 \" h9 r3 U - sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
+ w4 H) X* p5 E( N4 u( B1 u1 f - if(sAlarm.AlarmTime.Seconds >= 60)) }+ x! H+ Q7 H. J; R* l3 x% a
- {
7 \! ]3 Y! O w; E - sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
. K7 v1 D2 @2 K' J' r - sAlarm.AlarmTime.Minutes += 1;6 ?& r# J9 `+ k. a' Z5 |% H8 w
- if(sAlarm.AlarmTime.Minutes >= 60)* C: Q5 z9 r) H" w- _; j
- {( e/ |% a# [: m- e! f! k% ?, o
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;7 {- m0 p# d+ }* v- g/ d, @
- sAlarm.AlarmTime.Hours += 1;1 i* F: I$ L! r1 ~
- if(sAlarm.AlarmTime.Hours >= 24)- b' @6 b: F. i6 a, C+ w: s$ o# Z
- {: K& f m/ |5 _# S
- sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
# Z V2 l, K! c6 n1 k z. t - sdate.Date += 1;
$ h' S+ N% z* U. t" H, i ` - }2 S$ q1 E! F U8 q- J3 ]' C, l* i
- }
) |0 m% ?9 d! a0 L8 g - }
9 m1 N3 S3 N; n4 r7 \: Q" b - sAlarm.AlarmTime.SubSeconds = 0;
2 F5 {5 b% y( n6 r; D5 x! P5 y - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
6 X& y) `9 c1 t - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
! f4 r' c, }* M& B - sAlarm.AlarmMask = RTC_ALARMMASK_NONE;; x* {! m/ X, E9 I' k
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
: h) q( [. j! S# m4 b - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;9 |$ G( A% ^) v2 u" p
- sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意+ R4 f) l5 ~- J6 t+ M
- 2 y' L5 {$ ^# C- r
- . w9 u5 J7 m: h( y S+ l# b4 T! d
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
1 G# T; Y' u* @/ C- h - {6 I$ Y7 D7 E0 U) r
- Error_Handler();8 o) G5 r2 T! h
- }6 t3 d2 @& I; N! x p/ G9 q9 q! r
- }" Y2 n; E7 J3 k- a6 _
- K& O5 m# g) q5 ~8 ?7 s- b% r
- /**
2 {& ^; x% f+ @& _! `3 S3 ]7 L2 M - * @brief Alarm callback 闹钟中断回调函数% H5 n- r4 |) j5 Z7 u
- * @param hrtc : RTC handle6 z7 O+ G! t$ z3 i4 x
- * @retval None
v' Z8 q# a/ x( x+ }0 S# y5 X: I. H4 Q/ { - */
4 M* y& _3 p- Y1 O - void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)6 W( e+ r+ T7 v! X
- {+ S+ L$ v7 E! O+ j2 Q/ p" d
- static uint16_t sEnterCnt = 0;9 d9 U# A9 R* G2 \- e
4 M; i9 p# ^8 o2 b( N- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断! [% p& v& i% U% |
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);" q& I* p" g( ~9 z2 o
- }
复制代码 $ m4 k+ I: G8 B& U" Z
main 函数
. O" E7 r' l4 k- i- /**
5 ~) K( W# D8 C1 f+ }* }' n& n' u4 \ - * @brief The application entry point.
3 k9 ^' ]7 A* J5 o# U - * @retval int' U1 Y+ |' J" y( p* h" ~; x$ H8 ~
- */8 {& t3 ~9 V5 p( V
- int main(void)( @, z4 [2 f' C$ ]
- {
0 e' g& E& D. K - /* USER CODE BEGIN 1 */
1 b# V1 H7 `5 W - : n0 I3 Q* x: }, n- o
- /* USER CODE END 1 */1 u! Z4 S- Q' N, `4 y I* G
- 2 g& O. p5 J/ H" v3 ^( y4 [8 X
- /* MCU Configuration--------------------------------------------------------*/: s& [9 i3 Q/ I- s6 G* z V( D
- # A$ y0 l; h) y6 `& ^, c
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
& w; u( e" {" q3 ~/ J) g/ ^, K - HAL_Init();8 E. V# `. c; K- f
- , s3 o4 ~4 \' U" ^
- /* USER CODE BEGIN Init */
j& O! V: K8 [" x; W9 E Y - " e* k& I; B' q
- /* USER CODE END Init */- ]9 u5 p# Z) d1 H
/ q5 s% U; I# c/ ?- /* Configure the system clock */
3 Y8 w9 O) w( f1 D$ T) l2 a$ ` - SystemClock_Config();
2 l- e2 {, s; Z" E - 7 ]+ }$ H6 F* s4 I! R" g
- /* USER CODE BEGIN SysInit */
7 q; p3 D3 E6 x" _, D - & z& G: D A, z! @( I# X
- /* USER CODE END SysInit */
9 a/ C+ d3 ?: z- F - ) o- [* q" w0 k4 q1 r
- /* Initialize all configured peripherals */
- V+ w4 A+ O7 v( _ - MX_GPIO_Init();/ B% Q2 f, _8 Q; F
- MX_RTC_Init();3 `( n9 W. x. e0 N: U+ K& L9 d
- MX_USART1_UART_Init();4 y7 t- Q* B8 Q
- /* USER CODE BEGIN 2 */! e. A- W1 S# x! j5 m" I- ^+ r- R
- printf("stm32g030f6 rtc & alarm demo start......\n");
# o( z* V' S6 a4 ^4 B- G1 b - RTCStatus = 0x01; A+ G4 j! I4 x
- /* USER CODE END 2 */
1 @3 B' _% |/ u G/ G; f. A - * p, h: |1 m! G, U6 |4 {
- /* Infinite loop */) J. r( i# J; b {8 W3 s" Y
- /* USER CODE BEGIN WHILE */5 B2 D! k! M( h8 r" ~
- while(1)- r2 F/ J; P5 {
- {
- U& q: W/ z' q2 p3 H - HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
1 J- h- N. x; V: M- ^ - HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
' _$ Y9 n R$ F% a( ]; A - printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
0 K! T0 Z" e0 j7 {7 R6 w0 { - HAL_Delay(1000);$ h0 ^' W' u! w% w; e: S/ w
- /* USER CODE END WHILE */
' y% E _( r2 c1 w - / O* N% H2 t# w) E& p7 y% B% w
- /* USER CODE BEGIN 3 */1 ^/ U+ P2 a6 E* Z
- }/ i! B8 d5 T f. Q
- /* USER CODE END 3 */1 `0 x8 G) m; a3 g3 C" {* y% V6 B
- }
复制代码 ' T6 c( C" n& b6 `- K8 d! G# W; N
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
3 u9 f' t3 G0 e& f; ?2 ~8 a g! f6 I6 |' Q% }
3. 编译并下载测试0 g( F5 z, M/ ?$ k/ C9 e/ |! L& z/ ~
将程序下载到开发板中,连接串口助手并打开;
/ M; h, S( E! P9 b1 z实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
+ [5 C5 d/ A1 O( A6 f" r& n* y& y$ _
# L/ z. T, P' b4 Q) f! q( o H% p, x! M; h1 ?) k& S! n/ d
% x5 g( m' T1 L: c' {/ S e
|