1. 使用 CubeMx 创建 RTC 工程# t9 \* F& ~, p% m% N( n% m* A5 d: i0 u
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
5 I7 m8 s+ K% B, O$ u2 n
' h4 P0 f, v! } Z先配置一下串口,用来打印相关信息
; F$ P5 c8 j# t6 h- b% F# [" H) R- \ ~
) _- `: o' v9 Y4 L0 r
5 B2 t! V2 i/ v# k再来配置 RTC
3 [8 ` w) K0 T! I' t P: L4 ^
( Y- q. k9 c& c- M" f5 ~. C- Q" m; U( r" c1 p# J S) L
* a5 n: m6 l7 R& u d7 Z8 `
( P! T: ]$ Y( x$ r7 P' D1 @# I! i6 H' v" n, k
配置时钟: O8 O- u4 s7 L w; Y# p) M
2 c7 {; T8 K) v r& ~
* Z. Z: H3 o2 M1 g* l/ k
: ?. x$ @6 `+ R( x) E8 I1 kps:本实验使用内部低速时钟测试,未使用外部晶振.0 E/ y' b' z+ }! m
+ q" t- i- j- I配置工程相关选项8 _+ |) J7 `) A4 A o; _: U
! {6 e. S C4 N0 x$ C: g
# P# i. ^. c% i$ A, d% j
& H9 p0 O# z7 B; {配置完成后点击右上角 GENERATE CODE完成工程的创建
* c9 o+ e4 d8 Z1 t
9 V: N, V/ Q6 f2. 编程% R3 g$ T# M& ^4 i) @5 A
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
5 K6 W- ~/ T0 X" H- /*设置系统时间*/9 I5 k. a9 g t# ?4 D9 V
- HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) $ [1 O8 H4 s( c y9 |7 d2 f
- /*读取系统时间*/
9 b- Q0 B: B! s% Z5 ~ - HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
5 ?6 ]" ~; ^6 W - /*设置系统日期*/. {7 o' d! b. Y
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/ S1 Y* ^8 }$ P' k8 l1 ? - /*读取系统日期*/
* V" ~9 n3 l; M# b$ v - HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 ?; N7 u/ k' w
- /*启动报警功能*/
+ ^& z, k+ Z: X - HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/ D8 K7 u& _$ K0 P4 k' u - /*设置报警中断*/4 s a Z3 c" p! W" n! p, b
- HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/ I/ Y' _6 C6 ~9 i- }& ^$ c/ [ - /*报警时间回调函数*/
' [8 h5 E R1 x: D. E1 ]3 J - __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)( X1 P3 ]: q$ \& w- m
- /*写入后备储存器*/6 p1 c+ x/ `% \* Y' F. q, H, r6 T
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
. q) @! v2 j @- Z% ^" f7 H - /*读取后备储存器*/4 ]( p. f5 C7 ?9 x
- uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
5 W- H) o& l/ B2.2 串口相关的代码6 k& Z4 ~; p+ @1 c. z
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
" @+ W4 E" ^& {/ z) `1 `- /* Includes ------------------------------------------------------------------*/
6 }& n7 r8 i1 `7 Q6 o2 |; Y - #include "main.h"9 e" i, U9 \+ b: c# G0 P) N+ N
, i& J+ x% X2 O* |* _- /* Private includes ----------------------------------------------------------*/
; \: m% \- ~$ x' F2 L* \8 V - /* USER CODE BEGIN Includes */
0 j6 p7 w3 ?3 u( L. C - #include "stdio.h"0 W0 y( q- v7 Q1 Z$ ^0 t
- /* USER CODE END Includes */8 L& d* O5 L$ X- ]
- h. C! a6 B- J# D- /* Private typedef -----------------------------------------------------------*/8 I2 T! ?& g+ s) V$ U
- /* USER CODE BEGIN PTD */
+ |/ v- |1 r, W
$ b" { d4 S$ v, d0 m& v" e$ ~& d- /* USER CODE END PTD */
( t% x+ _- X% C8 H
1 p$ x% c5 E/ g+ _; e' N+ Z- /* Private define ------------------------------------------------------------*/% H3 D o c% R& C0 W7 T
- /* USER CODE BEGIN PD */
+ M9 I, X p( O% ~ - /* USER CODE END PD */. {3 o% u$ u. n
# s. X+ W2 \4 W- R) v- /* Private macro -------------------------------------------------------------*/
$ S; _! c2 d+ j4 |& E5 n - /* USER CODE BEGIN PM */
3 t+ `6 n5 P$ G' a! ?
% W! Z8 e7 E$ I9 Y" `2 S- /* USER CODE END PM */
+ H/ |! J) m' J' |2 m* J+ x: O
9 l1 ~: q' ^6 q+ D! |2 I- /* Private variables ---------------------------------------------------------*/
; _, F! M4 x$ X8 \3 x. s2 y8 a - RTC_HandleTypeDef hrtc;; q9 g; Q' i2 X! v
( i9 n6 A; j* W- UART_HandleTypeDef huart1;6 ]2 |2 y; [+ N' A! m, b
- 4 m* v: q# p& f: K. y: X" y/ W
- /* USER CODE BEGIN PV */+ W: t- K* j' ~8 \3 O; j8 t3 N
- RTC_DateTypeDef date; //读取日期, r0 T+ z* E# Z0 W" p' ~
- RTC_TimeTypeDef time; //读取时间
! M# I) k1 v( R5 t; O$ y4 W - uint8_t RTCStatus = 0; //指示RTC状态
* E3 o3 N' r* q3 K) S - ( u: |. n2 v% d, @- E% X. z
- /* USER CODE END PV */
- A8 b! ^8 P1 m, s - / ]" j4 c) |) y0 s, s
- /* Private function prototypes -----------------------------------------------*/$ b6 D; D# d! @: h
- void SystemClock_Config(void);. w5 d9 U2 ?) Q4 J
- static void MX_GPIO_Init(void);
0 R! q3 } r0 |2 _# A: q- v7 J - static void MX_RTC_Init(void);
, R$ ^" F) W: \4 W, O - static void MX_USART1_UART_Init(void);. N2 s9 @; j8 S1 h
- /* USER CODE BEGIN PFP */2 \6 Y7 g' I/ e" v
- // fputc 函数重映射
3 H t6 ^) l& G v- U - #ifdef __GNUC_
+ U8 O3 J5 H5 e2 z7 R; u& w - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)6 G( n7 ~. c; r: V
- #else
5 ^! p$ w0 \8 j( n! v0 h - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
) W- j5 M& X* x# J, F - #endif8 n9 o. a/ h+ X3 r# [, X
- PUTCHAR_PROTOTYPE, x1 F' \# P1 h4 m6 U; v, x
- {
; C1 y: B |& E" d - HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
* I) c9 f: x: I; @1 N! h) M; z
' q1 Z. j N5 Y- return ch;; b; b5 \9 N- I \, n+ F# ~" h
- }( a0 @' Q5 r- O& z/ u
- /* USER CODE END PFP */
复制代码 1 J2 v J/ t8 x9 R" Q8 U" U5 G% [. k
0 `/ h# P; v# @) URTC 初始化( B, `, I w% V! B+ _
- static void MX_RTC_Init(void)
0 s/ T$ k- y+ \( `- v1 I9 o - {
G' u7 X* m9 c- O# F+ h - ; {6 _7 j8 e ]7 F
- /* USER CODE BEGIN RTC_Init 0 */2 p! I4 @% P& Y7 s1 m& D. ?5 l
- - R/ S( \4 p8 Q& X- R. B0 R# e
- /* USER CODE END RTC_Init 0 */
* `9 A/ b c, `# d: A4 n - $ z! _: b( U! o8 v, z
- RTC_TimeTypeDef sTime = {0};6 h, y: T8 ^0 @' o0 L8 P
- RTC_DateTypeDef sDate = {0};
9 X- z! m) s% y. j- m- {8 @ - RTC_AlarmTypeDef sAlarm = {0};
5 E4 ~% \" z9 e& h) s - # c: y9 ], H2 }( j0 b2 @9 B
- /* USER CODE BEGIN RTC_Init 1 */1 I6 D- e6 G, M' G3 v/ c
: U; L! l0 G% e- /* USER CODE END RTC_Init 1 */. _% y# l! ]$ a/ z( o/ Z- i
- /** Initialize RTC Only( d; z3 [+ L8 L! d) K7 d9 Q8 ]4 m o
- */! N! o3 j) _1 ^# r/ y# k
- hrtc.Instance = RTC;
% T" z' R# D. `) h - hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
; s1 \, `/ ?7 ?$ e0 n - hrtc.Init.AsynchPrediv = 127;+ K3 y$ a6 L8 Y( B( J- m9 a" Q
- hrtc.Init.SynchPrediv = 255;
. c* N' \9 d' K/ g0 L7 @2 z' z - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
: M. x) O* I6 T1 }0 { H$ n - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
% I$ c7 Q+ S; A+ N - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;" a" x! z; ^) K1 N; ?" Y
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;7 M! c6 S' _: W/ w5 j6 A4 C
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;1 c" v/ I3 D% z# ]0 b
- if (HAL_RTC_Init(&hrtc) != HAL_OK)/ o- L! n& x& i! d/ @0 O
- {0 ]- ~; d3 Y. X1 p3 ~
- Error_Handler();) K, w/ y6 `0 m% Y
- }* `, i- F+ c6 m( o( J
9 w6 a* y+ K* R- /* USER CODE BEGIN Check_RTC_BKUP */* X+ m: Z" m7 Z. k
- // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿; X+ A R7 ~# u8 e4 m
- // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA), D6 _# g6 D* [: F% k7 }* b2 P; U
- // {5 P% @8 i: U+ f7 }' A: n& X1 A
- // //已经初始化过了,直接跳出初始化函5 U* q4 d7 z, e0 ?: ^3 Y
- // return;& H8 e: }3 E1 m. V: I& [% P
- // }
! C' A: s- N1 K8 }, e. T6 r - // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿
9 R! t4 f8 y: D1 p u - // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);* i9 L# t" ~0 Z: a7 @
- /* USER CODE END Check_RTC_BKUP */
3 O: A- R% ~! l5 d - - M" K# E; l4 N0 C4 u
- /** Initialize RTC and set the Time and Date/ Y+ T. _7 G1 `6 }; }6 u: y. [
- */
% ^" I) e' O/ D5 y5 C0 e; k - sTime.Hours = 14;
' @9 w6 m: J7 V# S) p }; L - sTime.Minutes = 50;" S3 g6 Z/ W4 A9 [% a( {
- sTime.Seconds = 0;
- {" c" t$ ~0 \ Y - sTime.SubSeconds = 0;& x) W4 v) M4 X
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
3 e! n( s7 c. e7 n - sTime.StoreOperation = RTC_STOREOPERATION_RESET;
+ x0 F/ O# e0 j7 R* S" t0 v9 ~7 H - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)$ y' \, c8 ?4 a2 C- G/ t0 r w
- {
3 z, ^, S" L4 r6 r b8 t+ c - Error_Handler();% @8 a& Y+ ^1 |3 C/ I k
- }
/ r1 p' \; g( {! ~. x, k2 Q2 l - sDate.WeekDay = RTC_WEEKDAY_THURSDAY;1 q" H) w1 l7 z3 Q( d w* Q+ a
- sDate.Month = RTC_MONTH_JANUARY;, p& a9 @6 d$ Q& a) W( c
- sDate.Date = 28;
2 c+ ?* ], B5 C2 u! Q4 }: s1 @ - sDate.Year = 21;
; l0 h" y c" g8 I - ( e2 l- d9 y) j& m& {% o, p
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)2 K9 X, p6 v o/ S
- {9 m2 b/ b( K7 Q5 A5 l3 m$ N
- Error_Handler();
+ |! Y. w# G, W5 O4 W- D - }! r( h" O/ b$ R- ^% m
- /** Enable the Alarm A- B+ h3 Q2 W6 d1 {8 A) D
- */
2 _( s- r, D( _; B a5 \( P& n - sAlarm.AlarmTime.Hours = 14;
9 p9 N: ^1 ^# v$ g2 ^! T H - sAlarm.AlarmTime.Minutes = 50;- ]. a" E+ X: f) v; J+ N
- sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断3 h7 a4 W" v1 a
- sAlarm.AlarmTime.SubSeconds = 0;
) a; [- y% e5 m4 C& g% ~ - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;, p+ H& {3 ^) M: E- @& q: |5 i
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;# v+ g+ D& f& U7 v
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;5 y- {% r$ A9 f6 G7 J
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
) Q# s2 e; ]) ~ - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
% J7 a& d! K6 E2 I7 l8 b( [$ x - sAlarm.AlarmDateWeekDay = 28;
E5 F9 o) f1 w, o0 Y - sAlarm.Alarm = RTC_ALARM_A;
N1 ?# x2 ]# y1 d1 N - if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)( x3 ~5 j- p0 |1 R3 v; X" s: I" _
- {
; q) D8 L! b: M9 y2 x+ R - Error_Handler();4 R* Z2 `7 Q1 O! h7 h0 D1 L
- }
6 a6 q6 m F& o9 W2 @4 T$ m- h - /* USER CODE BEGIN RTC_Init 2 */
1 R, S1 l: q8 ]' M! y
4 B' W4 t9 R: @* z- /* USER CODE END RTC_Init 2 */
& L8 C; j2 C; q/ u" o! M( P - 1 f6 k+ k1 B5 V" g! T$ Q
- }
复制代码
) S/ N- ` c0 M+ _! x' k! M此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
3 p6 g. P: M; F
4 j7 m3 `" T1 N6 o% S u0 R配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数4 Q3 c4 p8 q3 h w. W4 v& {) H
- /* 设置闹钟下次产生的时间 */; i% @# z; b! g0 A0 a7 E
- void setalarm(int hours, int minutes, int seconds)
1 v7 G( Y- G/ T) T: @; C - {' n5 I e5 B' k$ L6 w/ ?; f' `
- RTC_AlarmTypeDef sAlarm = {0};
4 X+ P- G1 _: }: {: q1 [ - RTC_DateTypeDef sdate = {0}; 7 K9 n- F9 \! _) h) n7 t3 W
- RTC_TimeTypeDef stime = {0};
3 `: O: w+ s* A) W' [ - 9 F4 @+ M' s7 k I( i0 @3 I1 [
- //读取当前时间
$ d4 h" g a8 j, M* w - HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); $ u. z% J; _( X% W
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);' i- U: s, H2 A
- //获取设置中断时的时间
" v7 H# w, n1 I n9 { - sAlarm.Alarm = RTC_ALARM_A;
* t+ x9 _; J: \$ Z# W - sAlarm.AlarmTime.Hours = hours + stime.Hours;
5 T: U2 W9 z- v8 k7 D) p - sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
4 ]5 \4 q" D& ~; D5 C, w* | - sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;2 S) U* u1 G3 H& G1 ?9 ?5 f
- if(sAlarm.AlarmTime.Seconds >= 60)" F- ]) A- T9 }% \$ J3 d
- {$ Y8 \- k4 _9 W( c) Z
- sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;- m8 T5 y& g q! _. k6 n; h8 z( U
- sAlarm.AlarmTime.Minutes += 1;
3 K J# ^6 f2 ^( u! p1 S - if(sAlarm.AlarmTime.Minutes >= 60)( h5 a" ?5 F$ ?9 n( w
- { d; Z& w/ B7 j/ g3 B
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
% Z% z) N4 \3 S - sAlarm.AlarmTime.Hours += 1;
/ ?5 V6 ^+ z, f9 o( n+ s0 ? - if(sAlarm.AlarmTime.Hours >= 24)4 L' Y3 I% P9 d/ V3 X
- {+ B4 c4 _& u G6 x* f/ _% F. b
- sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
& C! h7 k/ C: a7 d - sdate.Date += 1;
" G5 k: \' p8 s. P) r - }
% n6 Q) b* Y8 B - }
! ]( o+ L8 _( D - }
+ e; M X- \' f. r6 w - sAlarm.AlarmTime.SubSeconds = 0;
, ~* {: B; V3 z1 m7 X) y; g - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
+ f% k# T( L$ [* J - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
. z' U' a: q0 B6 x5 D% ^ ~6 Z - sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
+ z7 r1 L: H. i; T8 l - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;6 K% Y. N: F" Z- ]( c
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;% B6 ^& r9 M& z
- sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意
3 C9 C+ F6 r _ L/ R# u1 \" B4 y( p+ A - 8 `' V& _. F) w0 E3 r5 q
- 1 v: D6 }8 G( M7 K
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)$ z" w! N, Q _
- {( j2 Q/ D2 W7 v+ E0 W# R5 S( R
- Error_Handler();
5 C# }: F2 _9 ^ Y - }
6 f8 H3 Q6 p9 c, E y! X - }0 h' k3 p) c5 {3 P, T8 p
- 7 b9 f" a- ^* D; T; q8 |' h
- /**
2 J" z5 I) X2 {! \; S - * @brief Alarm callback 闹钟中断回调函数
* W1 c# X P5 S! e! V0 N - * @param hrtc : RTC handle
z7 t8 h3 V1 g4 }1 ]# s' P - * @retval None% u" ]9 m* u. z3 `$ B
- */4 ^. n3 L I4 f* {5 n: r W' A
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)! T) c: N0 V. x* n6 y% u9 Q
- {- \) }+ Q3 v1 y% l- U
- static uint16_t sEnterCnt = 0;. ~1 D ` v, x% d
- ! ^3 Z8 \' n: F3 [4 y0 q
- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断1 R% q7 n2 c( W8 r, w w
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
6 U2 M$ Q( x* Y' E! U) E - }
复制代码 & z$ O8 B6 Z! @# a* ?% u/ h, j# @2 a! q
main 函数0 \& b3 j$ }# w% Q Y
- /**8 V2 u2 l0 y# J5 h; o% H
- * @brief The application entry point.
0 a: i; _# U ?! P - * @retval int* |( ?1 b$ a4 n) k5 I
- */. \0 W5 K' x5 ~! n B
- int main(void)
) m' U: M6 F D0 v: z, I - {
1 y1 s; |4 t" ^ G+ U* c - /* USER CODE BEGIN 1 */
4 m5 E9 `! L# o' x% |3 L# `
' h3 V, @. E3 D5 Z6 k5 v, J- /* USER CODE END 1 */
3 J p. ?) _% y! C* Y' E9 F
# s- B# I6 j0 u- /* MCU Configuration--------------------------------------------------------*/7 ]1 ]5 D* J1 O6 v
1 g5 z7 v" W' ~3 W5 [- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
. D; n4 n% G7 V9 ]0 E, p" r - HAL_Init();
3 C g& \5 ^6 A; y$ T2 J
5 Q) z7 c ~1 ^! O- /* USER CODE BEGIN Init */" A; R/ I/ H- k! u- g8 Q1 K
- ( Y" n8 G& i. Q. {+ B2 t4 d
- /* USER CODE END Init */
6 h' g; O1 T/ g9 c* k
: u% T/ D- x3 w$ Z$ s* E, G- /* Configure the system clock */$ m- J& p; C. C3 N& M2 g
- SystemClock_Config();
) a2 T6 s7 ~2 _; z6 P
+ o, d d0 Q' z- G+ ]/ j- /* USER CODE BEGIN SysInit */6 I Y1 E7 v9 Y- k5 Y
- ) f* b' v9 `( ?( E6 v+ l7 f) w% A
- /* USER CODE END SysInit */
( z p+ `0 O, M! j% k& y# F! H
9 S( n2 p- ]6 y# Y7 T- /* Initialize all configured peripherals */) M, r( G# R/ d& z
- MX_GPIO_Init();" E, Y# h) f$ R4 X: e
- MX_RTC_Init();" G9 s) N. M4 m
- MX_USART1_UART_Init();- r# w: I; i4 h* t0 q6 C
- /* USER CODE BEGIN 2 */
7 l' x% o& e/ x0 Y. f O: l; k# Y - printf("stm32g030f6 rtc & alarm demo start......\n");, _! F$ ~, y2 I/ a: K$ E
- RTCStatus = 0x01;0 e/ B e9 ^" Q/ l6 C
- /* USER CODE END 2 */
; P) l. U# [3 Q/ R' c' @2 K9 m
3 N" q' a: J& V- /* Infinite loop */
. x* G8 O# Z0 { - /* USER CODE BEGIN WHILE */9 u. P* v- Z7 N l9 c. s! Z1 r
- while(1)% N. i, r0 s0 k" I& s
- {
* P, Y5 V0 ~) ?7 R - HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
" _8 d: w- s- g5 z4 a4 L3 F: M/ v' l - HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
# V' Z) H4 \0 y: r: R) j! ]( O - printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds); u3 N1 r0 p6 P3 j& d+ J
- HAL_Delay(1000);/ |# \& i" q, W( f& g
- /* USER CODE END WHILE *// R3 ^6 L, D- y H
$ Q6 H R( Y! {" T- ^- /* USER CODE BEGIN 3 */. ^8 d% J7 C, X* d; H# O' v
- }5 h0 n& z3 n( z+ E3 M+ M
- /* USER CODE END 3 */. t. m6 d: P- J+ z
- }
复制代码 " i1 d. {4 f) `% W7 U, O
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
- j" {4 u9 L6 c* j0 f# r
/ U! H4 V/ c5 G" e5 N3. 编译并下载测试) N* M& U/ f3 I7 j- _
将程序下载到开发板中,连接串口助手并打开;& P; L2 r# u* H- P2 U& m
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
1 M0 w% ]+ F$ ^& b; f' n+ U' k1 f% v. B7 P* ^
/ Z) A" ]0 p0 I$ R4 k+ e
& h" B, H' y8 [" F: L7 L2 [
|