1. 使用 CubeMx 创建 RTC 工程
$ l/ o0 F( x" {4 T打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
' M; b- D3 W5 L1 z' X( U7 n* D# @ b1 W
先配置一下串口,用来打印相关信息
# g3 B/ |8 q0 d0 K5 V) y
+ y# w- w/ Z; s, x S% n1 c7 E7 h) f. r2 F6 | o, f ?7 D
+ L* C) d; X W' O5 e8 J* C, p
再来配置 RTC
9 \4 V# a1 E' [! }0 Q
: E2 s! u }# e% C1 U- W$ L/ s6 I' k9 C/ R
+ n2 _: D. T, `: A) m
& o3 ~2 @6 z. C1 c @) S
4 ^( o; [% B/ B3 S5 S配置时钟
7 S, y: f# h: ]; R# e/ k9 ]6 x
; S1 y, U. a" p- l4 t1 U) y! R, J v* g: G6 a6 j5 [6 t) x8 p7 T$ a E
4 y3 g, a: V8 x3 b3 w& ops:本实验使用内部低速时钟测试,未使用外部晶振.+ y5 H+ m7 @. S' \5 S% n
6 y+ \# f/ w$ V' E! s" d# I3 ] e/ F
配置工程相关选项& ]2 }4 Z% \9 \5 I4 Y+ X9 R
6 o( T w$ S, Y7 G
+ M& X% m% L8 k) D9 d: f" Z1 g% a& y( a p% u
配置完成后点击右上角 GENERATE CODE完成工程的创建$ u B9 q% P+ ]: G7 X
$ E- S/ Y6 Z; N: m2. 编程
! p0 W7 l2 C1 x& V2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口: T4 v. O$ e' M6 E; w) u, I: h b0 b
- /*设置系统时间*/3 V( ]$ B! |/ A- @' \9 w
- HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) 7 F. \- g* M5 ?0 t/ {% C
- /*读取系统时间*/
4 E, a9 V! Q2 f+ D% ^- ~! O - HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
2 Z6 b; ~3 _( E' u3 M8 E$ h - /*设置系统日期*/4 V) T$ k) S9 V! W% I) d
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)9 p6 x7 M0 W3 @
- /*读取系统日期*/
) s6 r# v; ?- B$ \ y3 _ - HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 {; Q* R2 ?% l# R! H% f3 y: b
- /*启动报警功能*/
2 O$ D/ _; x3 r( M - HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)& a! j3 q! } E' f3 I- [
- /*设置报警中断*/
- ]' q- Q4 l* E* O, { - HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)4 q3 w, p5 X$ I
- /*报警时间回调函数*/+ ^( _5 ?6 V& S
- __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
% }, s+ a# x; |& l0 O( n, g+ D4 F6 | - /*写入后备储存器*/0 Z. x2 C1 D8 d- @
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
- B; b2 L- d! _ - /*读取后备储存器*/
1 u4 E, s5 C1 `" N8 ~ - uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码 X/ w. a+ ~" V( m q8 r
2.2 串口相关的代码
1 X4 D8 ]$ v. W3 s/ K* l3 h因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
+ g& R' Y7 O* @+ [4 F, Q# U9 g+ h- /* Includes ------------------------------------------------------------------*/
u& ]8 t7 W4 ]7 S( R1 j+ y" X - #include "main.h"
C% w" q* N" ]
! q2 k: W; \- K' h4 f- /* Private includes ----------------------------------------------------------*/
1 W' M2 m; I- H5 ^/ e - /* USER CODE BEGIN Includes */
: `( g$ x. \. }, ]0 T - #include "stdio.h": h; b! a; D1 o
- /* USER CODE END Includes */
' W$ o# U9 N1 [; q3 L3 i% ]. f1 m
; c4 r" O" K8 q* R, T- /* Private typedef -----------------------------------------------------------*/
: Y* n. j3 h* K, @8 r3 n) Y5 t - /* USER CODE BEGIN PTD */) w5 N4 ~, j% v( f
. W) U% C! |# a3 P, |; B- m- /* USER CODE END PTD */# x5 M+ r. ?4 m$ n1 \ V+ w. E1 ^. ]2 J; s
, q. I; m. ?0 o( ]- /* Private define ------------------------------------------------------------*/6 w' s" D; Q7 o! S V* l
- /* USER CODE BEGIN PD */, @- B; c6 p) `3 k- S
- /* USER CODE END PD */8 ~) y4 F1 t1 V* w9 p/ g, }' Z; G3 ]
- , Z8 O7 Q" M( I0 e O
- /* Private macro -------------------------------------------------------------*/4 @% y) Q4 V3 e9 K6 \
- /* USER CODE BEGIN PM */
+ T0 R: _8 V, N6 r; W+ M
5 F0 Z, j9 P! b p# q" f9 ^4 S- /* USER CODE END PM */
7 B$ h) j- p/ z) J! l* q6 i - . ~( p! k* ~& W* m! k, {
- /* Private variables ---------------------------------------------------------*/7 A, j4 q+ k; Z: \- E
- RTC_HandleTypeDef hrtc;
% e9 E. V5 n3 I7 z" I9 L" m
! Z6 z; V+ ~; S. n/ C, g1 L( l- UART_HandleTypeDef huart1;9 W% V( }6 W: t% ]4 ~% o
- ( E4 v$ j) E! K( ^) g9 o
- /* USER CODE BEGIN PV */
! N9 ~6 C! K3 d' J - RTC_DateTypeDef date; //读取日期
: h- }7 s4 l5 \% @ - RTC_TimeTypeDef time; //读取时间
" c$ @: x6 D7 J3 C1 h% M1 Z - uint8_t RTCStatus = 0; //指示RTC状态
3 O+ Q: X, v5 \8 O% b/ y
1 s# r5 L/ r! f- /* USER CODE END PV */2 @; C6 \' y8 Z2 ~: C
: u0 V4 V L9 `6 ]3 C- D8 _- /* Private function prototypes -----------------------------------------------*/6 B3 f6 o) A/ e9 H& S' ?+ d
- void SystemClock_Config(void);# T0 l0 U: G) H1 j0 R
- static void MX_GPIO_Init(void);
) w7 }$ l' [3 i5 M6 I7 e - static void MX_RTC_Init(void);
2 q6 q1 \$ A4 F/ p - static void MX_USART1_UART_Init(void);3 z( K$ Z# l7 h. D
- /* USER CODE BEGIN PFP */$ `! I6 f- |9 ~3 e2 d0 K. L
- // fputc 函数重映射
; W: L* L2 Z$ {# Z( G' h1 x - #ifdef __GNUC_% O, ]! A$ J/ d! H
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
! b2 V, h9 b$ H! v - #else9 {. ^! A0 R7 D( K5 u
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)1 U7 D! [# D8 z9 P3 ` L) p
- #endif
0 s: p) u( K3 l - PUTCHAR_PROTOTYPE1 {1 ~& d' b- _
- {: ~9 T6 J7 ]1 @2 x2 `# [4 |6 \4 u/ s: P
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
1 t4 |# f+ m( @. H I" X" k
2 ~3 C5 ]7 B; j- _: B/ L e1 ^- return ch;3 O# f4 {" L* O+ d4 E7 S( k: `, E
- }
. G$ x( k3 @, S" Y) E" w J% h - /* USER CODE END PFP */
复制代码
6 }! m4 Z! I3 x9 C" U: @/ d5 u, @) B: p0 ~! \- \
RTC 初始化# c7 M" D. b8 ?. t
- static void MX_RTC_Init(void)3 R7 ?" K m- T4 b5 I' A2 i! D# Y
- {* p) c% ^0 a1 X$ F. u
) f& M" f4 e- Y- /* USER CODE BEGIN RTC_Init 0 */3 `( m. e7 ^5 E$ G# E# y+ @; X1 Y: Q
" h, S- h* l1 E0 n; C- /* USER CODE END RTC_Init 0 */
; T' \+ b) \$ U0 Q - 7 \, t2 ]5 x0 K. z% p% P7 w) `
- RTC_TimeTypeDef sTime = {0};
3 D) w) w& R: Z: k- } - RTC_DateTypeDef sDate = {0};
; w, B, C S r) \6 B - RTC_AlarmTypeDef sAlarm = {0};
+ r3 z; z" J7 K6 T1 c6 i- k5 E5 V2 s0 S
7 Z; |* N! M2 b. k! ?- /* USER CODE BEGIN RTC_Init 1 */, I6 x$ ^/ x) k! I
: ?2 F3 t |+ g% l+ c( F. y/ i- /* USER CODE END RTC_Init 1 */
# y) `7 {- u& w0 c - /** Initialize RTC Only; s5 ^6 _& L3 I0 x+ U$ y
- */
& I# S. O% i/ W2 R; R( m/ U7 l - hrtc.Instance = RTC; T# z% d! Q6 S" P0 `( L$ J+ E' ~
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
8 V9 V2 T* ^1 B/ r2 \ - hrtc.Init.AsynchPrediv = 127;- h* m, R) z: g7 `# i0 X; U
- hrtc.Init.SynchPrediv = 255;" y7 ~1 f% ^, O1 _
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
$ T0 F8 I5 ~% j( T - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
- |2 I) _, u9 S2 `5 X) l. y) t' X - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;& |3 X8 k: o' r m
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
: B% B$ i# x9 s. I: @2 w - hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;, d9 V# y' b* F% I
- if (HAL_RTC_Init(&hrtc) != HAL_OK)
1 k5 h; J. m# i0 ?2 V - {
7 l' d$ _# \, r9 ^0 O5 x - Error_Handler();# n+ q$ h. T4 _ z4 [+ y# C
- }6 u; r8 Y+ A. }: J7 e7 ~
- q; x# J5 h0 N/ b% q
- /* USER CODE BEGIN Check_RTC_BKUP */3 u/ e9 \. f. i3 n; `
- // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿# _7 _1 l. g, a; X% U3 Z
- // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)
8 i1 l3 Q8 E* T: g5 ^6 H9 f9 m - // {
# A0 G% @7 ~! N, Y6 F - // //已经初始化过了,直接跳出初始化函+ G8 j# g q c# H: h+ h9 p
- // return;
0 p, Z+ l1 W( ]; N, @+ V# q; C) {# j6 m - // }
. b4 K; F( m. R \: H - // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿+ b2 B1 h+ l) a' W
- // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);# U [$ O) W, p& t+ ^
- /* USER CODE END Check_RTC_BKUP */) A, I! B! M) c& p3 r% m
- % L& x4 u [" @7 W$ H+ A
- /** Initialize RTC and set the Time and Date5 t; c' e. Y& u
- */
* ^* F& {4 [+ E' j0 b, Y" K* v' N6 C - sTime.Hours = 14;
% z) e, H9 d2 Z; f4 G' l. R V - sTime.Minutes = 50;
2 |* u' z: _7 M: q2 m9 e8 w) w - sTime.Seconds = 0;
9 ~7 p4 p) {, M( }( ]1 | - sTime.SubSeconds = 0;6 F8 H3 ^1 V; |/ s+ o
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;3 g7 G. I$ t0 s$ P' y
- sTime.StoreOperation = RTC_STOREOPERATION_RESET;
: x0 \' k) R8 p: [# Y: ^ - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)" o5 N- Y& J$ z* q
- {
7 ^. m& z8 @: l+ n! n# X1 [ - Error_Handler();# N9 d. D5 A! N% `; J5 }' Z
- }! P7 s+ H, L) }$ I0 T
- sDate.WeekDay = RTC_WEEKDAY_THURSDAY;6 e: ]9 W: d8 ]' \2 F
- sDate.Month = RTC_MONTH_JANUARY;
% w9 m) P2 _: \% ~ - sDate.Date = 28;1 z& L( ]/ f, L+ w
- sDate.Year = 21;
- K2 Z W" {0 t7 L! \
; K% W2 B2 l3 G, Q3 ^- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
1 P. i* F4 }+ M/ K1 y5 A - {* J- n r% Q9 l' x
- Error_Handler();
( i/ N) Y# B+ b y; F3 T2 I9 W - }
* c" V8 \% |5 J9 Q, r- Q) c, j# D - /** Enable the Alarm A
+ |1 f1 e7 K! J' z- m0 N - */" s+ U% n3 Q2 n. D+ l- ~
- sAlarm.AlarmTime.Hours = 14;
0 ]8 k4 u2 e- Q8 ]0 ~8 d - sAlarm.AlarmTime.Minutes = 50;
@" l# \* B1 b q3 K. ?) ^& h! z$ S - sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断
$ U) O# k y: w& N% y5 u3 B3 B- C - sAlarm.AlarmTime.SubSeconds = 0;
: j4 [6 {6 T+ ^5 z3 {+ J' c& a - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
! M" _- b5 M X! |4 G - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;! V/ a. p& C( C5 m5 y" a5 W" R
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
- I0 E7 l! o6 w( e- N; f2 u - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;/ ^# b2 F3 |1 b2 i: A
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
! R; C5 B: c4 `5 W, P - sAlarm.AlarmDateWeekDay = 28;0 P8 O0 k* a6 z* b0 D0 s( ? U, N1 i
- sAlarm.Alarm = RTC_ALARM_A;% ]; \0 T; A/ ?
- if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)% L# Y( U7 X" P* v8 C# [: h
- {
" Z- {+ c, e! Q8 D3 l- R) N - Error_Handler();* ~9 G1 |3 I0 D) R9 D) y; b) V
- }* ]" f6 c' j# w+ A% U
- /* USER CODE BEGIN RTC_Init 2 */* h p' a7 ^* M
- ; q5 b; s: N/ \# B! v4 k, ^; v
- /* USER CODE END RTC_Init 2 */1 A y- o3 b5 f1 s' B9 j) G( i
7 x* n+ W9 {2 {! O4 l3 E- }
复制代码 7 b, z. {& u+ c$ m- F O! P
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
5 I! u2 d, S7 b9 }5 d2 p ~# K5 M* N7 e7 ~# U2 U3 i" ^! j
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数7 f" }5 Z7 A7 C: i8 J P
- /* 设置闹钟下次产生的时间 */# n/ Z4 [4 ~- X3 T8 Y3 Z- x6 I$ f
- void setalarm(int hours, int minutes, int seconds)
6 x$ A) _' {2 W: e - {
9 [; Q# n! b E4 l/ V) L& T2 a - RTC_AlarmTypeDef sAlarm = {0};
; K/ S8 k* C+ t" I' Z - RTC_DateTypeDef sdate = {0}; 9 Y- w: g% [/ ]! Z' u2 z
- RTC_TimeTypeDef stime = {0};, i+ H; c* G2 @$ I/ h
2 | |. ^; v0 w- //读取当前时间 ; W. s$ H# E- k. u5 i- |1 F
- HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); ) i& l T8 [) T+ i! J% W- l
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
" y! {3 x5 j) s# y6 U1 C' B, b- ^ - //获取设置中断时的时间
! R$ _: J: a" |0 M+ S7 X! o - sAlarm.Alarm = RTC_ALARM_A;( |, a# U- p1 C1 i6 s' ?
- sAlarm.AlarmTime.Hours = hours + stime.Hours;
0 ^( i( c7 e2 a. e' E4 ?: i - sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;; p \) O) k5 @* ^& X5 X( ]6 j
- sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
/ Q( h# b+ ~. @. a# f! M - if(sAlarm.AlarmTime.Seconds >= 60)
' M4 E/ ~3 y' L0 \, p6 x9 | - {: o8 H* g! o0 d, Q" [7 i
- sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
7 i8 ?& H6 W0 z6 ] - sAlarm.AlarmTime.Minutes += 1;
$ H' x' O/ }4 c8 f& |1 e1 C# I! \ - if(sAlarm.AlarmTime.Minutes >= 60)
* e+ U3 T8 S' q$ }, G# I8 J; _) t - {6 Q" p6 B( t* t3 i' C7 [1 ?4 z# S
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
, d3 A3 n6 y' n* U( C3 E - sAlarm.AlarmTime.Hours += 1;
4 t8 U" d3 F3 q# T. i - if(sAlarm.AlarmTime.Hours >= 24) ^) ]* f* H5 n* c% B. d
- {
4 ?8 o0 Z' |- [: R) ~1 I% { - sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;! Q. H4 v; i* l: R+ [, v+ K
- sdate.Date += 1; K. Y, x- P* o/ \7 D+ _" K
- }
- J9 X* k- J5 d6 ^ - }
8 J1 `" Z7 ]( I - }
0 d1 g. N- p% y b - sAlarm.AlarmTime.SubSeconds = 0;# X, a5 ]8 F t \8 l/ s
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;5 S p) k9 N5 t( V0 y
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;3 Q8 g# Y2 F- v' X) K1 @* C) U
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;& F$ T) o T: w& |3 z: G1 D/ Y: S2 B9 Y
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
, V: I; _, n6 E# V) T5 V4 j - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;2 I8 ]9 G& m3 @; }( |
- sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意( R/ w$ T9 ~% i |' f/ K
- c4 t* A- H3 s$ A4 ~/ |
3 r6 z' b# f+ k' h9 j: U6 O/ c% I- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)+ D$ c$ e, {5 D# F$ {7 L; V6 R, I
- {+ L% }$ Q$ P1 c2 ~/ u) B/ ] w
- Error_Handler();0 `. B+ H) F' O) t
- }: [1 b7 M' T4 ~/ {* I5 A+ K
- }) i' j" y: ~! S/ S9 w
$ d4 _" T2 ^8 B2 y+ J1 P6 [3 b$ p5 v- /**
6 p8 p# r; \7 ]( a+ ~ - * @brief Alarm callback 闹钟中断回调函数2 z0 C2 A) Y e, E; s5 j
- * @param hrtc : RTC handle
8 s5 G4 K% Z6 x7 F: Y3 S. g0 o6 @7 } - * @retval None) s9 Q& U- j x& J' r
- */: P( O5 O) A$ q! e+ t1 M! y
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
( T: E3 M: L4 n$ }( K - {
& G/ R! }) b6 _, N4 s; A$ a - static uint16_t sEnterCnt = 0;
7 G6 F- d* e; [$ x3 \) g: Y
+ g/ {* S/ {3 l+ _: {+ C2 X/ x/ B- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断( s7 T$ ^, p- Y5 H g0 w
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);1 a! S' o& K9 x9 I3 {
- }
复制代码
d% e, J% [: @5 _main 函数, M4 J/ L6 X+ B5 F/ a2 Y! X7 G
- /**$ Q+ _( b- Q7 r0 r( E/ {& w" |
- * @brief The application entry point.
3 w$ d8 [( i6 r, v - * @retval int
! _, h5 H: i( | s! A x - */
: @' L( J& }" r6 s- [ P$ o - int main(void)
) ]6 C$ n' x2 B6 n: ~ C8 t - {. a& b# H: N( r1 F7 T4 s9 m
- /* USER CODE BEGIN 1 */5 l/ Y/ g+ j/ {2 l9 w+ @
# V+ I b9 N9 `! H# h+ z- /* USER CODE END 1 */, |* H; k0 J9 ^. d+ J: \8 D9 n% I
! x! V% T$ B. Z# P- /* MCU Configuration--------------------------------------------------------*/
7 t! U0 `6 ]. m, T4 r: R! C$ W1 d! A
$ U5 ?0 `- m) w" y, w3 T7 `- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
9 C" P# p! M4 ]3 l2 `% R+ g: E9 q - HAL_Init();9 g: A, `0 y& V! N
" n. ~# Q) {; m' N" p% d. x- /* USER CODE BEGIN Init */. P4 c5 \1 G7 H
7 R: v. Y! c* \4 t4 d1 H- /* USER CODE END Init */
9 k6 j V% B2 T4 J - . I1 H3 k8 ~" K6 o
- /* Configure the system clock */! ?4 \- E9 z, z
- SystemClock_Config();
; V8 B$ ?6 K4 c2 H5 S- E' y2 z - ! m4 v7 B2 w! m0 r- q% D) x
- /* USER CODE BEGIN SysInit */
) ]! y, j B, F8 g% w0 \
' K+ W, M' x9 d- e, K) c- /* USER CODE END SysInit */0 ]1 t. X- ?" \7 J) B+ w/ P
- 6 ?) K6 {' m8 ]+ k! U% C, n
- /* Initialize all configured peripherals */
. x* f7 \0 @1 k0 ^ - MX_GPIO_Init();; l% B" ?% ~9 h( u' |2 O; Z
- MX_RTC_Init();
0 q5 c: p* X; p8 ] - MX_USART1_UART_Init();1 D0 b `0 T/ \6 X$ ^- D
- /* USER CODE BEGIN 2 */
' q" q) R$ K7 _5 K$ G; Z - printf("stm32g030f6 rtc & alarm demo start......\n");' m& j/ o( g& n% _/ \" H: l( N
- RTCStatus = 0x01;( \& K' ^* r ^
- /* USER CODE END 2 */9 z; d3 P0 |' M+ D; Q
J* S, y1 A; c* p" v- z7 w# c5 s- /* Infinite loop */
. u# o/ k+ Y7 L - /* USER CODE BEGIN WHILE */6 E1 p6 ]0 s5 g: F) g% a
- while(1)
8 j$ M8 S, _3 a% {' A# K3 j - {
( z2 m6 `7 U! N. a ] - HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);/ S7 Z$ ?1 E3 J$ ?
- HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);/ h4 |' f2 g4 }- g9 j) x1 @
- printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
$ _. |9 C4 u2 Y# P# c/ t5 N - HAL_Delay(1000);6 v( |* b8 H7 i% c Z. {* z! _6 w
- /* USER CODE END WHILE */+ Z; Q8 r1 A( C0 \& h- B7 t
- 9 Q/ p! P6 ? m
- /* USER CODE BEGIN 3 */
$ A7 w1 K# y7 r2 T v - }/ l! J+ y& g2 g2 J
- /* USER CODE END 3 */- j7 E0 F+ w$ C- X. h. m5 O
- }
复制代码
9 X: E; W2 B3 b: s/ {" E" k主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
1 p- H! K% A) s: x8 d( I+ X7 @0 G6 J; o; T
3. 编译并下载测试' W# O( \* Y7 m1 f% t9 t0 Z
将程序下载到开发板中,连接串口助手并打开;
9 n# `% z0 p& H6 E实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.6 h) I P8 y9 t. @9 G4 M% L4 }7 A
! y! L. l9 S4 l
2 L" ?, v/ @# ^8 Z% [1 E
$ P% [; G' l5 F1 e |