1. 使用 CubeMx 创建 RTC 工程3 W2 t0 g4 c7 @1 e
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.# S& {, C; H4 Q9 \; {0 H
6 ^5 v1 z- S; a' e4 x
先配置一下串口,用来打印相关信息$ V6 y1 O( _! w* I1 O' }% c
) T. c: z: b% l) D N7 M, ~
5 }( u5 D, i0 n0 T8 w( \
+ H; f6 A2 M1 z T+ Q
再来配置 RTC5 Q: Z# G; C5 v$ W" p) ~
* A* P! A) [0 I9 {
* r% l3 u7 ~! `
% M. `2 w% {( s$ V* ]1 @( v
3 y/ q% Y) S* |+ d6 k; B; e. a
9 n7 q% Z7 T( S8 j1 ?# T5 Y配置时钟% Z' i6 [. b# U* a/ H w! T
+ S% N; o' `- S3 m9 F' H
3 F! v# \. g* t" O) S
7 _# e) K. x4 {/ h; A; Hps:本实验使用内部低速时钟测试,未使用外部晶振.
( }$ J( C" ^, S$ U! B6 Y
, k( n2 J' y' G- `/ {$ p9 ]配置工程相关选项
, Z; I4 i; _, ?3 {0 d; _
+ {8 O8 d0 V$ O5 F2 y
- ]; F9 A6 ^$ o8 s3 q( Z) |. }9 [) \/ V
配置完成后点击右上角 GENERATE CODE完成工程的创建- {5 o7 Q0 P# w; O- b: G
9 Y# S2 f( J" G4 s$ x0 n
2. 编程+ `1 |3 h5 z/ l# A
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口- |2 |: `2 ]* Q; F; K4 L$ q" m- H+ a
- /*设置系统时间*/
- `* m3 [* M9 d: z$ E$ w - HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
: m ]$ K( x8 p4 J - /*读取系统时间*/ e, }5 `* N7 b* R* z6 t! {
- HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)" t! M7 n$ F+ Q# k2 Q% B
- /*设置系统日期*/5 Q0 N" q% n6 l; }# i+ L: `) P
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 {/ q- S8 Z& u1 I+ Y3 r2 P4 W- L6 s) y
- /*读取系统日期*/
% r4 J/ g! ]2 W) m - HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/ ?8 H- Q# N3 _( J' u6 H) ] - /*启动报警功能*/! r) r4 G# ^/ _% h7 k; L. w, s- r
- HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)& ~$ S& D5 G6 K$ R1 Z
- /*设置报警中断*/9 I. A) d; f b5 ^
- HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
6 M5 w$ j4 h3 n - /*报警时间回调函数*// f7 B( a( V8 V; {- X
- __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)/ p4 H! C( _' |( \' K0 h
- /*写入后备储存器*/
5 U( v2 u$ ]- x3 T - void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
7 `7 u/ `! Y7 r r% Y7 I5 n0 t - /*读取后备储存器*/! N6 T0 O+ ^, [8 ]) x
- uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
8 `% J. w' `! ?% Q/ ~2 i: B, U2.2 串口相关的代码# B) T4 W [2 h1 Z/ F* d; L2 }
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
, y6 l( e! Y }8 g0 n- /* Includes ------------------------------------------------------------------*/
, o* b7 t% Y7 W: M - #include "main.h"
- y9 D* S8 {& Y( T1 R% V% O: _2 T - # s0 _2 y. @3 y' X+ {
- /* Private includes ----------------------------------------------------------*/
# h# P& u+ z, K' ?" g - /* USER CODE BEGIN Includes */( g$ h# Y' j; h4 c! n# L* g, }
- #include "stdio.h"
& N3 G& x/ b7 d - /* USER CODE END Includes */& I( ]/ K: M% v7 e5 b
- ) h1 v8 u# ~& l: m3 E3 f. ?
- /* Private typedef -----------------------------------------------------------*/
! u3 K: J. t5 x4 Q9 ~ - /* USER CODE BEGIN PTD */
3 r2 t, J: O2 e% F5 @+ u
0 p- X' m' y# }) X t- /* USER CODE END PTD */5 H7 ?6 w; b C# N
- + o4 j0 p6 p7 _4 G
- /* Private define ------------------------------------------------------------*/
2 u* `. ~9 w$ i4 o; E - /* USER CODE BEGIN PD */
7 B4 ?% a% \! G, y3 Z# h - /* USER CODE END PD */
8 Z" m: X* R$ U1 @) ` - ' a" f: B$ z; F3 f, b. l) @1 [
- /* Private macro -------------------------------------------------------------*/1 E% T. P4 l' f# g
- /* USER CODE BEGIN PM */ h( w3 i% ^) u' P
- " l! Y6 X1 X/ }* _) D, l
- /* USER CODE END PM */6 @4 n) Q" H/ R1 a) i
- ) n5 P5 j+ y8 x$ \, F1 u: m
- /* Private variables ---------------------------------------------------------*/
! p/ s3 i. c+ Z6 G$ j - RTC_HandleTypeDef hrtc;5 c3 u+ G2 G q
- 3 b0 c4 V: z3 _9 B$ D- u0 }
- UART_HandleTypeDef huart1;
" _; r6 U1 x5 g0 } - 0 v+ T& K* A2 @! @
- /* USER CODE BEGIN PV */
% J5 j( V7 ^9 L. a1 d - RTC_DateTypeDef date; //读取日期
. w/ ^; c5 Y; V" e/ M - RTC_TimeTypeDef time; //读取时间
( R* t2 }$ ]) \ - uint8_t RTCStatus = 0; //指示RTC状态
1 R3 Q4 x$ \% j5 a" b$ I
9 U; g6 j3 ]/ N( O- /* USER CODE END PV */
& z# Z' M1 a8 p
% [5 o# I; h- X- /* Private function prototypes -----------------------------------------------*/
; e; R; J) \% k1 e. P O5 | - void SystemClock_Config(void);
* w& R& n# O: C6 _) O - static void MX_GPIO_Init(void);
0 _8 d6 s+ T$ k+ T6 P - static void MX_RTC_Init(void);) d c* |) {" X. x& ?. [
- static void MX_USART1_UART_Init(void);
% l) I; z1 w9 f1 d - /* USER CODE BEGIN PFP */
: z5 f5 `* x- x. p - // fputc 函数重映射% v/ F) X# ~) _1 g8 Z% f) U
- #ifdef __GNUC_$ x3 ^9 e5 G4 `$ k3 C! Z
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)9 i! | q% v8 c1 i ?6 g
- #else
0 b6 _9 ?) _6 N/ o - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
2 `$ m( f" H% D f$ d" B# Z - #endif4 y! s& p& M1 d
- PUTCHAR_PROTOTYPE4 P4 K; m5 ^4 G. o3 p7 U
- {% v$ f* Z, {; |1 X9 ^
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
6 y H' _4 |$ ?* A4 T - 1 v% x% k% U" B0 }' c
- return ch;( R. N' V- S" [/ b& ~
- }
/ r- i) A6 r- O0 Y - /* USER CODE END PFP */
复制代码 * ~* `% z5 g! O9 M* u" @. J# v
8 S3 D d4 |+ F$ @- R
RTC 初始化
- h0 T+ g- H3 ?9 m$ p1 Q2 K- static void MX_RTC_Init(void)& D+ F4 @6 q: G" G, K
- {
2 ~6 A" b1 [; A1 a8 D - % o+ T8 w4 o2 m# A4 L) Q
- /* USER CODE BEGIN RTC_Init 0 */
) Y, t; u5 _' v" I) L! ^ - , g/ Y3 j& y4 M; u9 Y- {. Q, `* l6 f
- /* USER CODE END RTC_Init 0 */' P; `0 A7 Z5 W% ^8 ~' T) P
- 6 t- @* H- h. D4 d S/ D2 u
- RTC_TimeTypeDef sTime = {0};
% Z4 i6 [3 w5 g - RTC_DateTypeDef sDate = {0};- o! g' g$ P8 L# T- ^4 e1 E
- RTC_AlarmTypeDef sAlarm = {0};8 H$ v. ]" C5 K" D# c. g
- {# p* D# N6 l/ ], Z. ~0 g, t, b
- /* USER CODE BEGIN RTC_Init 1 */; l; E. ~ T4 U$ [) s
- 3 B* Z8 P$ u4 X, s' @8 U3 T# u; O2 n
- /* USER CODE END RTC_Init 1 */9 e, e x/ X* q( W
- /** Initialize RTC Only% G4 z1 @: H0 p+ X% d
- */
4 z0 c0 o4 x9 y( }$ |8 V - hrtc.Instance = RTC;
. s) d0 G* x5 g& |' P - hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
8 e: |/ ]: l ^- T, L7 o% C - hrtc.Init.AsynchPrediv = 127;: v- z% p [3 E7 f1 P
- hrtc.Init.SynchPrediv = 255;
3 o* ^5 ]8 U& ?' { - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
* Y/ X# a! p: C. ^# G6 k: T - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;6 _1 M5 x I: \5 i# I
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
; \) a, J+ v; R# p) O2 R+ d m - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
' N7 n* f' U+ e/ _4 O9 z/ M m7 _ - hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
+ v4 l" ^ |, v - if (HAL_RTC_Init(&hrtc) != HAL_OK)! @' p! l7 b* H% P
- { f! U% ` i0 n* f
- Error_Handler();
q: g2 u/ X% C' i - }
5 ^! T+ K! e t, Z) H* Q y - : I6 E0 N0 G# S3 g9 d
- /* USER CODE BEGIN Check_RTC_BKUP */
7 e* G: t& K& `0 E: h8 |* p6 x - // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
' K2 ^* L& k6 @" A+ y/ q( ~ - // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)# ]+ M1 v* n6 s5 {" N4 n! F" C
- // {! @9 F4 V$ }$ ?# r) y7 d I) [* B
- // //已经初始化过了,直接跳出初始化函
( t. s3 y4 y8 G. N6 B" k# I, l - // return;0 d. R' m E7 I ^: q
- // }
! w# k: k/ C( r: W5 k - // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿0 u( L( }" p; d9 }5 H+ n. z
- // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
; v- k, c3 r+ u+ Q - /* USER CODE END Check_RTC_BKUP */
9 |9 e$ w3 ~- {3 e4 B' \
% |: O, Y' K$ ?1 k6 B* Z$ D- /** Initialize RTC and set the Time and Date! W& q9 b0 R8 p& {- X; f
- */! P8 z/ X: Q* G5 y3 C c$ F
- sTime.Hours = 14;8 @9 q( ]4 G( \: U7 W# g% l
- sTime.Minutes = 50;) v! J' J; f4 a( z( w# D- e
- sTime.Seconds = 0;
$ p- s! W% \' X9 A1 j5 R - sTime.SubSeconds = 0;
. L7 D$ A V5 N: c8 P - sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
' H) [& ^' M3 K - sTime.StoreOperation = RTC_STOREOPERATION_RESET;
- z7 P; K' q+ T) @$ E - if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)3 l' r: h4 K+ }5 F" O
- {
0 u8 C9 q& X' R' J/ R* M - Error_Handler();1 m/ B8 N; N5 E e$ v) j- l* g
- }( ], N l7 L' v) i" c
- sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
' j1 Y8 S* W8 A) v0 G - sDate.Month = RTC_MONTH_JANUARY;: j/ \. J8 ?$ J$ Y3 g
- sDate.Date = 28;
6 U- s) L2 ~ D - sDate.Year = 21;+ C% Y( J7 Q! j! Q: h
( [* u; I# x7 S2 ^- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)8 M7 j x2 T0 u+ j% @
- {! q/ b' Z8 J/ C& E8 f
- Error_Handler();$ H# `/ I1 E8 ]
- }
9 K6 U4 G" F9 D9 i/ D* m$ ]% ]. ` - /** Enable the Alarm A
: g) `- a& `4 U) w% v I' } - */
g" ~) U* @! b$ P$ ] - sAlarm.AlarmTime.Hours = 14;
0 T( H8 Z& s( a: @ - sAlarm.AlarmTime.Minutes = 50;
6 o# l5 b- v% E. _$ i: S9 F$ K - sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断
! Z" v% m6 T! ~+ k: Z - sAlarm.AlarmTime.SubSeconds = 0;
0 A4 j2 P4 }8 l8 V2 f2 X6 s7 K - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
" l5 w8 X: t( g% v5 v5 Q& a - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
0 |; {, A0 d: q6 v/ V2 C - sAlarm.AlarmMask = RTC_ALARMMASK_NONE;6 l6 y. F8 ]. C5 x
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
5 d) Q8 s' r1 C3 E0 z# t' | - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
" j6 H a3 R- _3 u - sAlarm.AlarmDateWeekDay = 28;
0 Y7 a: e8 r6 W1 q - sAlarm.Alarm = RTC_ALARM_A;, w2 C* n/ M1 d2 ~
- if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)0 Y! q& Z0 Y' v* a
- {8 k7 e7 F$ H3 K+ \7 n
- Error_Handler();) r/ A4 S: Z0 ?5 }5 W9 ~
- }
) a* A4 g! U: \8 U( Z9 H - /* USER CODE BEGIN RTC_Init 2 */
B4 a4 c3 s4 W. o% x - : U9 O2 A9 c0 f' K
- /* USER CODE END RTC_Init 2 */# L9 k! n7 C _
- , U, t$ w/ _+ c: S( P
- }
复制代码 ) m. \- F$ C8 Q$ u. k
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生./ W5 J8 s+ p' w" O$ ^
% \: O+ [( t& y5 Q* }# i2 D* V
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
m3 Y% f) s6 O1 M# S0 G" ~1 ^- /* 设置闹钟下次产生的时间 */1 W" O2 B" k- ]5 L- ]+ P
- void setalarm(int hours, int minutes, int seconds)' X7 `8 e: ^' A" V9 ~3 }$ K9 f
- {
: E5 J- S4 q7 V! v, W# F3 N2 J9 b0 i - RTC_AlarmTypeDef sAlarm = {0};
( \- e7 [: \6 ]. ~ A - RTC_DateTypeDef sdate = {0};
r6 V" U' _+ d% A2 t( N: K2 q - RTC_TimeTypeDef stime = {0};
z" a7 J. v' H+ P& l" s! ` - ( b, |* r! p# t. G/ o
- //读取当前时间 1 M- c0 Y! x: K7 [& @
- HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); 4 V0 z4 N; y! K
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
; \' Y; d$ S8 d6 z7 o( } - //获取设置中断时的时间4 D1 r/ U( g# d4 }! f) W* k
- sAlarm.Alarm = RTC_ALARM_A;3 ]! N6 M/ B) P W$ P
- sAlarm.AlarmTime.Hours = hours + stime.Hours;4 b8 [) I7 b! n6 r( l; N0 N
- sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;* s6 i$ J z1 O5 T! e! n
- sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;' Z6 a: a( ~" R" Q- W* k! d
- if(sAlarm.AlarmTime.Seconds >= 60)
2 K, i8 a+ u/ U" _# z0 Q - {
1 X4 m% ?8 h+ z& ^, H$ K5 S6 ^3 j - sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;1 r0 V! x+ M8 j7 d" Y& H! |3 l
- sAlarm.AlarmTime.Minutes += 1;
2 y" e6 s" k6 |/ r, x# D - if(sAlarm.AlarmTime.Minutes >= 60)
4 Y4 J8 V6 p/ a - {4 F$ B, J8 z5 h$ m2 Q! D
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
+ c9 x& O% T( b" j! h - sAlarm.AlarmTime.Hours += 1;: ]; f0 D& S, s
- if(sAlarm.AlarmTime.Hours >= 24)
9 ~2 g3 L V8 ~( m0 A - {" \) [) y1 [0 _+ B& b
- sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;( ~& i- u& |2 Z! x/ Q3 @! }
- sdate.Date += 1;
$ c/ i+ D/ i% C6 i$ t9 n0 {/ q - }
+ Q* N% Y7 y6 p - }
( W) ]) S! g. { - }
6 j2 L' P, L- `& ~# \ - sAlarm.AlarmTime.SubSeconds = 0;3 P4 [, i. Q! j+ R: q& j& q" P
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
. a9 `+ [! v, j! i, c# V - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
& g7 G4 S! U- u6 d - sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
0 ^ ~" c5 f; N& |" K& { - sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;5 f- a u3 j- H* P
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;7 Q, G' q o( P2 G& |( d
- sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意: a. r+ {1 {8 P. Z y
- 3 r P3 N7 e. L( M# V
5 B" g! |* U! Y }* z$ Z- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)& i3 N- s2 n% ~; V; }# x. P' a$ ?- H" I
- {) T( Q$ a' C3 ] G! Z' a
- Error_Handler();
& N- Y3 o# T! b0 K. B - }
4 [: T7 e$ V8 r! B - }
; @. ^: b; l3 L4 M, J$ | - . w I u- I+ {6 Z/ Q
- /**% K7 z; ^; w1 _9 i% L
- * @brief Alarm callback 闹钟中断回调函数3 @* n/ Y8 g2 Q, o% G
- * @param hrtc : RTC handle
' p" H! y3 V& E* x/ L6 `# b - * @retval None, ?5 a2 x# h8 x. k
- */* O6 o, D, D% i( B5 C& w: b4 e3 S( v
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
# M+ V! r4 E( @1 @/ ~6 @" r7 H - { F9 l* m6 T. V; f
- static uint16_t sEnterCnt = 0;/ h$ z6 M7 N2 ~3 S7 [4 U
- j8 ]8 H, Y! U% v2 G
- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断5 M& ~ h' x+ P. E5 r l
- printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
+ l; u& O! G: H - }
复制代码
" r( U/ O( S2 E! dmain 函数
+ l( D1 _7 x# y/ a6 E9 \. g$ p. Q- /**
# G% t9 P) v+ ` - * @brief The application entry point.
+ }# L" o- ^( I& w. z9 h! r - * @retval int
, R$ Z# z1 b" _: C! q5 H/ B# O - */
9 D" z. x& ^7 [" Y2 Q. J& U8 R - int main(void)
5 \8 \* i- O) e1 H" J1 T4 D; m - {
9 D' [+ R4 @. j4 F - /* USER CODE BEGIN 1 */
# L( R9 A5 G* U" ^4 A/ S9 r$ V - - a; B, a, D7 |" Y$ V
- /* USER CODE END 1 */
! E8 K2 y+ Y0 ?$ o9 R - " l; W, H1 O: g$ E2 z
- /* MCU Configuration--------------------------------------------------------*/ r9 r. J8 |, `5 w% B+ p; Q1 x
$ P3 l) J9 Y! d* h+ E% D" k8 H% p% w7 {- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
/ {0 }5 }: x9 V/ a4 `2 G* k - HAL_Init();
+ v* h, F+ d) Y, g - # G- x3 Q: Q/ Q+ ~" ^; p3 l
- /* USER CODE BEGIN Init */
% C7 c# y6 P$ V) }, G& F
4 U' I. |& S' x- S1 t3 N. V s! M- /* USER CODE END Init */0 A! t7 o- X$ L$ W
2 \6 S5 {* M" |" K- /* Configure the system clock */2 Y! ~# @& z; [% S3 w7 `8 J: R
- SystemClock_Config();
" i; x, |* v9 z. y6 ]
! n/ p J3 l2 F9 ]& J- /* USER CODE BEGIN SysInit */
2 Q: l4 _4 s# V
3 Q& R/ D+ E4 ?2 d# V! g- /* USER CODE END SysInit */
. |, b- x$ p" k3 w1 w
/ \+ U1 c0 C, Y6 l; U- /* Initialize all configured peripherals */
5 W. `" a0 D; [) g2 b - MX_GPIO_Init();; T6 Q; R6 j& Z8 ~* G
- MX_RTC_Init();" \# U6 P4 C/ E: p" u; e
- MX_USART1_UART_Init();
7 e8 i0 X% N1 p" g9 g6 F3 A h - /* USER CODE BEGIN 2 */
( l/ @7 G; C: r! i9 F7 x - printf("stm32g030f6 rtc & alarm demo start......\n");% R" x% }2 H" a
- RTCStatus = 0x01;! a! N0 X2 Y3 k- d! e" P# d
- /* USER CODE END 2 */- ~0 z* C8 z" m7 P
- 0 F2 j$ ?3 \1 U/ n5 G; a
- /* Infinite loop */
5 y, s: v3 o+ u$ z - /* USER CODE BEGIN WHILE */
9 F6 d& ?* p: f - while(1)2 `3 n! u7 S0 Y" h7 ]& z) |. Y
- {0 | L1 [ n0 T( }0 W3 f) l: u
- HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
4 Q% J) R2 q7 @+ o - HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);0 t( I* O" U: N( u
- printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);3 {, }" N7 M) y: c I
- HAL_Delay(1000);3 p4 i- v2 n' m/ o
- /* USER CODE END WHILE */
+ d! l/ p# l* }/ I/ O1 O) e& C - & X+ `9 Q s, F- }3 t, }4 b
- /* USER CODE BEGIN 3 */
2 Q' I: \$ p; q4 |6 Y/ a - }
' W- ?* q& o- T' P - /* USER CODE END 3 */
1 M. S/ _% [% K; f( X - }
复制代码
& p! r2 j3 P" b* V3 t. P主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
4 S" {. B) s- x8 M5 [$ n k( z' s( `3 a9 W# O1 n
3. 编译并下载测试, E4 h/ ?2 c" Y( E7 C
将程序下载到开发板中,连接串口助手并打开;. T+ c( }+ s( B
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.' E" |* V- C3 E5 J/ I
5 ]/ @& I) Y5 C
# ~. J$ ^$ O; B i3 ]# ]2 Y* \, b
; i* S S! H5 y7 Y7 P0 @ |