1. 使用 CubeMx 创建 RTC 工程
8 l5 W$ y" L7 c1 \! ]4 {打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject." ]9 c6 N1 g6 n! Z& T& b9 v; P
6 Z# z) e( u- o: M8 v3 R; a
先配置一下串口,用来打印相关信息; c: i% G s6 ]
0 i1 t1 R/ P# C* J* K, K
! |$ |: W4 C% I7 R6 q8 U
/ G {# C. |8 _ s3 l: }+ G8 A" l
再来配置 RTC3 M7 M4 k( x* v& Z8 y1 L" N3 h
" W6 ^, j. `' K! k
' [' M4 R4 K6 I( E; p
% U' d3 ~0 f! `" c% y6 J8 \7 A M3 h" r8 g
4 a( J% u ?$ D( ]4 G
配置时钟
& m2 Z- M/ _! G& o" _! e& X# @8 c1 C+ |: l3 w
% [& e S+ ~3 L+ _& x
0 f$ `( r v* M- a" e6 jps:本实验使用内部低速时钟测试,未使用外部晶振.
! q& d/ z& l7 a7 O: ?
* k+ N' D' ?& x1 j8 v; n: U配置工程相关选项 e9 w" M0 y4 z2 k: a: e
8 s, f6 ]. `. n( S
! z9 _$ {; [, H
% T0 y* f1 N& Z% y3 u* c5 m) K& D
配置完成后点击右上角 GENERATE CODE完成工程的创建3 |' S5 v. X4 D- K+ G
/ O1 P( v' ?2 X, f, U
2. 编程% N f9 }# v3 _1 D# `
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口' t, d7 X5 D% f/ H
- /*设置系统时间*/
# S6 o: x" F8 I! c7 ^4 d9 ] - HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
5 I. ]; b. g5 g7 H - /*读取系统时间*/8 r8 i2 v) x, M, T
- HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format): ^% E* ]& L5 P, P8 Q R
- /*设置系统日期*/7 [' z! O" S8 y4 W6 b2 ?% S
- HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
9 {, [" R. n0 N$ @& w+ R a - /*读取系统日期*/
A: X, S8 r5 f6 Y4 w7 P/ X - HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
# ~" S; Z6 y# I# e& {: p - /*启动报警功能*/
6 \9 t' o* u' s3 v - HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format), i& A! E7 r" e4 A0 T( i
- /*设置报警中断*/, u4 A" W9 A- @% \& v. x g
- HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
1 z7 x- V2 f, v1 u( j! N - /*报警时间回调函数*/
, s4 o4 z1 w4 \: \ - __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)- Q: F; \* J( ?
- /*写入后备储存器*/7 T% [; l' \) W/ a3 B
- void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)4 ]. K; L7 G1 Y' v+ [ ~: U7 Q: z6 }; W
- /*读取后备储存器*/7 G3 \% l- J* Q* v1 |; H$ Z! U
- uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码 1 D1 r! i0 l: k# U+ Z7 O" G2 E
2.2 串口相关的代码# ^3 k+ J3 g8 S" D5 {
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
3 b! \8 M. m6 @% [# X* j# u: P: b' F- /* Includes ------------------------------------------------------------------*/+ V3 v0 z- [# s6 B0 X- g% @
- #include "main.h"6 t n/ a! S& T; N( f; ^
3 y1 G% Z1 N4 W/ o9 y) F3 X- /* Private includes ----------------------------------------------------------*/
% Y7 k; a1 [( K( I; N! X - /* USER CODE BEGIN Includes */
) }5 M% `2 n& n- y- b7 N. u& v - #include "stdio.h"
, C" V4 u& l4 {+ A - /* USER CODE END Includes */
3 L; I( i$ J9 y% a - % m0 ?' q' d' A9 p8 G
- /* Private typedef -----------------------------------------------------------*/& M: q$ n/ E; e
- /* USER CODE BEGIN PTD */, F9 c3 M4 Q2 j$ \
/ R& N: V5 ]& M* U; \! [# o- /* USER CODE END PTD */
" J, T8 h6 h) P+ a% D$ f5 {
+ K/ V& n3 N# e3 i- /* Private define ------------------------------------------------------------*/. J; f7 ^$ r# L" S3 G
- /* USER CODE BEGIN PD */
+ B/ F! [) {. i+ f8 a5 c. ? - /* USER CODE END PD */
j) T8 U0 B. l) f' ]
1 b" j2 i4 T9 v% @7 H$ ]8 a: E, Y- /* Private macro -------------------------------------------------------------*/, s/ q7 _7 j7 G9 {( f- p( C8 m5 C0 \
- /* USER CODE BEGIN PM */: @0 o8 _% g/ q$ [; K7 t
$ s& ?( M! P4 Y' [( _9 Y: L& ~6 e- N- /* USER CODE END PM */
: i- z1 n! H( V- A9 `. B, P
5 M! m; U' R% b1 R- /* Private variables ---------------------------------------------------------*/5 A: P0 k( n1 d' m) T
- RTC_HandleTypeDef hrtc;& p) D) \8 A$ V* A: @# C+ g0 G( H
- 4 b. a, K0 A# ^2 d. K0 ~6 k
- UART_HandleTypeDef huart1;% G$ G3 m: K5 V
6 ^0 G# \ N" [0 o* U: Q$ y- s- /* USER CODE BEGIN PV */; K) o# X6 s+ U7 _$ D2 J
- RTC_DateTypeDef date; //读取日期
2 O* V; U x- y/ _5 a, Z2 K4 h - RTC_TimeTypeDef time; //读取时间
) j) s& g; u2 v - uint8_t RTCStatus = 0; //指示RTC状态
1 N2 c7 x$ S( q$ w6 [
8 }. g* U( z3 v S' O* r- /* USER CODE END PV */: Q$ d+ ]# g( x6 j- y( _' M
- $ A- Z3 w' J6 A0 u6 p. u
- /* Private function prototypes -----------------------------------------------*/) A( V' W: d# W! \ `
- void SystemClock_Config(void);' {1 _& D$ q# R3 y D
- static void MX_GPIO_Init(void);
% \4 m( {! a: ~4 d9 _/ g* r% A - static void MX_RTC_Init(void);
, A" X% p9 S5 Q2 _: Q+ C6 o - static void MX_USART1_UART_Init(void);! m2 `4 @0 T1 t C$ z9 Z
- /* USER CODE BEGIN PFP */( ^7 e' u0 h9 F4 d0 ^8 b
- // fputc 函数重映射
: C( H, d9 t& u- @ - #ifdef __GNUC_; ]4 o# E! \$ y# Z1 ?
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)! C! L) B. v% F/ @" Z3 F3 |
- #else
, @ I* Q& R7 C2 J - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
6 ?" Z2 {7 a! `# Z" U$ J - #endif6 U- B* Z" ]$ q7 B' A
- PUTCHAR_PROTOTYPE. K, ~& N H. Y! J* l. g% x- V2 X
- {2 s7 Y: } w+ u" Y' ^* R
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
$ F& s9 U. e- K5 v/ }8 w/ R - & z3 j: {' D( m T0 B1 r
- return ch;
: Y/ B G0 b& o6 p5 ^ - }
! J# f5 f! S4 D2 L, P - /* USER CODE END PFP */
复制代码 3 Y: b! b7 X/ w$ Y4 s4 j4 N8 p. ?
3 d+ r5 I$ h& U' m G8 Q% B6 ~3 WRTC 初始化; w' [( Q5 `$ x6 @: H
- static void MX_RTC_Init(void)
. w) |" H/ p: n+ X+ S - {
- E+ f, J6 ~3 |4 @1 _" E - . q. P( j2 Q: s1 [0 |8 G
- /* USER CODE BEGIN RTC_Init 0 */& K9 R- k( i& g l% [
- 4 Q' T7 i# I- @+ F' P& _) c0 C
- /* USER CODE END RTC_Init 0 */
1 F: i0 ?& c6 ~9 S2 [ - 7 w8 s" Y0 G* v6 M# {
- RTC_TimeTypeDef sTime = {0};: ]5 s' A8 N( k! u$ k
- RTC_DateTypeDef sDate = {0};
% Y' Z4 R/ [2 B - RTC_AlarmTypeDef sAlarm = {0};
4 O$ N4 z+ m* f/ F9 _
. r4 H) h' M" n1 q! M t- /* USER CODE BEGIN RTC_Init 1 */
! ^- P% c4 a8 X8 T/ E, n
$ t$ q: n' i: [5 t: z+ K. n+ o9 d- /* USER CODE END RTC_Init 1 */
$ `3 t1 ^6 i9 w& [ - /** Initialize RTC Only
) S$ z* M! l( e r8 N" c% c! L/ \/ ^ - */* p& x3 y; }. z& s5 L0 T' i/ T
- hrtc.Instance = RTC;% ^/ D8 K' C7 n4 z5 r
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;! a( ^* e1 f R
- hrtc.Init.AsynchPrediv = 127;
% R/ X2 {0 s' O - hrtc.Init.SynchPrediv = 255;7 Y( w/ q. K" D. w) e: J* ]
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
, Q' X* n. m' z! p" Z - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;1 Q$ g% a; I* u" v/ z% j1 H8 ?
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;, j7 A* H7 d0 x8 V
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;9 J7 Q. r" G. T( i6 b3 a# X" {
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
: k% Q* d! ^/ K3 x$ F6 ? - if (HAL_RTC_Init(&hrtc) != HAL_OK)
7 [; ]9 n4 p4 z9 s - {
3 V4 s$ j3 J, i* o# e - Error_Handler();& A: Y/ J4 g+ m1 A& v
- }
3 u0 \. T2 ~" m) { - $ M% u0 `/ A! k
- /* USER CODE BEGIN Check_RTC_BKUP */
1 V/ Z( b* C2 r' j: x& C" p( @- ~4 D - // //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿0 O5 |; ~+ J) T( |1 j
- // if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)3 H7 k8 A2 N1 ~* |
- // {8 W# U8 A. {9 O: L* Z. q( _
- // //已经初始化过了,直接跳出初始化函; @' z) t0 N) }6 F( ?. p* m
- // return;9 A9 y) O1 p5 d7 b
- // }, v# [# C# v: P# ]; j& @0 k V/ o( l
- // //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿 k# @9 v" J) S- t1 s) {
- // HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
3 R3 M8 E/ w9 T4 l6 g$ b - /* USER CODE END Check_RTC_BKUP */2 K: J# F, O" D5 ~9 y
o2 e/ Q9 |1 C. N, z; r- /** Initialize RTC and set the Time and Date
6 P/ f' k5 T" U& p - */# H9 f, B8 R# E+ y1 B
- sTime.Hours = 14;
- h1 Y- a7 d( k, ]5 ~3 W2 ?: w - sTime.Minutes = 50;
0 ~0 t$ f0 p3 ?# e# i4 K( K: \ - sTime.Seconds = 0;* @" N0 i" v6 f2 [! f5 l7 B
- sTime.SubSeconds = 0; T9 M I4 j" ^9 i
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
; O0 A7 w# f1 Q. J6 k - sTime.StoreOperation = RTC_STOREOPERATION_RESET;9 b- a5 \: h7 R, N; q
- if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)2 Z9 N0 k, G" _1 f% |! F+ z+ {7 V% o
- {, @* X6 U4 M; |# Q, a, ^% ]
- Error_Handler();- l% D. J" m, L7 T% N3 N, J
- }
" P# x+ p8 r$ z3 C3 g - sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
8 h" o% ?6 H2 |. d( a8 w- y% _ - sDate.Month = RTC_MONTH_JANUARY;; k8 P( T3 D: U% G) ^+ b' E% p
- sDate.Date = 28;
+ T: \, k$ {- w7 X; J - sDate.Year = 21;0 s9 ]3 o, ?8 b6 ~+ f0 F7 d& Q
1 C+ F( n. a4 P* P2 }/ `4 C+ ^- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
; j: K: ?# F9 x1 T5 A - {
T) t( j1 i' V4 v3 T; e3 C$ m - Error_Handler();7 D0 }3 S: _2 M4 C/ L# w p
- }7 h7 U0 i6 T7 S
- /** Enable the Alarm A1 D% r9 Q, T* Z) @3 a
- */
/ n2 [8 _9 P \2 f- q - sAlarm.AlarmTime.Hours = 14;
# {3 r. A9 @ g# o/ |1 d- w - sAlarm.AlarmTime.Minutes = 50;
& h" Q: u) c2 K# Z - sAlarm.AlarmTime.Seconds = 10; //设置 10s 后产生闹钟中断
1 ^/ B+ E D1 R; i" v `) r/ v - sAlarm.AlarmTime.SubSeconds = 0;
8 M; S5 g6 d* g K - sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;: E7 [+ H4 K+ ?& D) x, k
- sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;7 Y3 A/ y8 V- L- m B( |
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;( r2 r! P$ x9 h- U9 R' _
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
5 [1 a: P8 y$ ~! e/ M. P7 Z - sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;" x$ |# Z, a7 i9 } t' ~
- sAlarm.AlarmDateWeekDay = 28;
+ `+ `, [& Y/ Z0 F - sAlarm.Alarm = RTC_ALARM_A;+ a0 c" Q5 ^$ \
- if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)+ J, q: W3 K' p2 J, j
- {
- U$ d% d* J$ S* T6 u3 Q - Error_Handler();
$ Y/ q2 m; }& t9 E1 D3 R - }
# o7 L3 H& D- J0 e6 G - /* USER CODE BEGIN RTC_Init 2 */
; P$ p$ L9 n* V" ^% r7 g - ( d- E$ @' X7 d) r# j6 ?9 O- K& ?
- /* USER CODE END RTC_Init 2 */. ?0 g( c/ w; D8 Q( o
) m7 b( P5 O1 s! t' h4 B' G) }- }
复制代码 , Q; T& Z7 N' |) ]* o8 v
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
" J5 X2 m4 f. N3 n8 p
2 f4 Y) G) o# h6 G* K配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
9 D* A; u W6 g- /* 设置闹钟下次产生的时间 */
; e& ^- z- T2 G) w# @% y - void setalarm(int hours, int minutes, int seconds)
+ W/ g: {; q, U" x( X6 e3 ` - {
# d; {& ~5 [& N" U1 B# X7 X - RTC_AlarmTypeDef sAlarm = {0};
; I. b' o: w) [ - RTC_DateTypeDef sdate = {0}; - H" w7 Q2 _& F9 T( s1 r0 X* Z
- RTC_TimeTypeDef stime = {0};( N+ k: B: o! v4 z: Z+ r
- ' p C/ }2 R( F! t' E. R8 x) b/ R
- //读取当前时间
: i* z+ e* ?6 {2 Z. o& c# }$ X4 W - HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); P3 v0 I2 i0 s
- HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);* ^; M4 ^/ z" v+ `- i* o
- //获取设置中断时的时间
* e& e" ?' w1 F0 s - sAlarm.Alarm = RTC_ALARM_A;( W7 v5 {! W+ B! i& |3 x/ M- b
- sAlarm.AlarmTime.Hours = hours + stime.Hours;
: A/ f' R# S9 ]; P0 Z! k" K; V - sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;1 Y3 _: f( T. S1 B2 o" s8 y. @! v
- sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
" U5 U; }$ q' L/ c9 l9 G - if(sAlarm.AlarmTime.Seconds >= 60)' S6 o( o! \' S
- {
: _7 f: V' c H - sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
3 _7 y0 Q, ?0 q9 o% ? - sAlarm.AlarmTime.Minutes += 1;$ D" I% F& i* r9 r
- if(sAlarm.AlarmTime.Minutes >= 60)
% E! e5 ~1 |% Z4 e- F* w - {( y3 y% c F! L8 D8 t. Y6 F0 K
- sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;3 w6 p1 C4 n$ D: F. Q# m
- sAlarm.AlarmTime.Hours += 1;
7 o8 f! X4 w4 b# M - if(sAlarm.AlarmTime.Hours >= 24)
* e8 S6 H% [$ i. Y" h1 a6 X - {
S( U6 O- N" f3 G' z) u/ B. I - sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;0 G' o0 G$ O6 Y+ L1 s# r: D! \" A$ a
- sdate.Date += 1;' D9 \# Q {: Y# i8 l
- }
T, {# b4 p$ C$ i' P; A/ b E$ I - }
+ q; B5 |$ M O" }, b) n - }
0 i1 y ?/ A/ z) l* w! _: a - sAlarm.AlarmTime.SubSeconds = 0;" E1 K$ c: E$ z; P, }) q; U2 r
- sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
0 q, R3 W" l- D" T8 G+ e - sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;8 m$ Y2 d n: T
- sAlarm.AlarmMask = RTC_ALARMMASK_NONE;% a$ F! h6 |# _0 u, P; k
- sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;$ P1 I& R% V3 [; ]
- sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;! w7 }: C$ i0 z3 f
- sAlarm.AlarmDateWeekDay = sdate.Date; //跨天数定时,需要注意
5 M3 F/ ^8 O/ R7 Z1 a& X" C - ( W0 F! X, j4 ~6 \1 d; [
- 7 X+ V; D2 F: k& g- G
- if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)" Q" A" {3 `8 _/ f- Z1 ^* X9 N+ C
- {
9 {% v% v, E+ N/ N5 Q! A4 y1 U - Error_Handler();
2 R0 v8 K2 x7 b" ^4 R - }0 ?$ v. D4 q* H2 m$ f
- }
9 f; {: v: |9 m! ?# T5 x
% L; f: E9 T3 e- /**0 K0 d0 L( M( c+ K
- * @brief Alarm callback 闹钟中断回调函数
: h4 ?; ^/ G5 g5 C - * @param hrtc : RTC handle
7 m6 X% m( J( y' w7 m - * @retval None
( x: F/ y* P; _* Z) z - */6 x D: r$ S, D% l$ a/ f
- void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
) o+ O* C0 L3 _: [! B - {! U4 a1 I1 G. q- _ Z) \# a7 k' e( D
- static uint16_t sEnterCnt = 0;* t/ i( ^+ v1 @
* J" w4 M+ `& i! k' {7 V8 {7 o2 U- setalarm(0,0,5); //设置 5s 后再次产生闹钟中断
/ Y: x$ e) a0 V$ t - printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
" c, R* g6 P( V) U5 i0 x3 I0 ^ - }
复制代码
' i# s9 Y; y1 X* X5 mmain 函数
: K* f6 C. X% ] _- /**
0 q6 ]8 e, H$ V; _, ?) {9 i - * @brief The application entry point.) W( v6 p% ~0 ]# \/ W8 h
- * @retval int3 O! j0 ~" \6 [6 K k6 W" |0 @
- */! H/ b5 Y3 r( [" l6 `
- int main(void)# |/ ` y% F. ?* W1 S: y9 V0 a4 C
- {
* t3 p+ `% [+ T; ]0 t1 n8 ?9 k* F - /* USER CODE BEGIN 1 */
. c1 a" ~& A) x9 q- O2 x& T7 y - % h6 y7 N/ P# U* r' t3 i
- /* USER CODE END 1 */1 t# e/ ^$ C: Z# n* k
- x- e* \5 B) T# W" a' i' c
- /* MCU Configuration--------------------------------------------------------*/
" }7 k* d, } C9 `% R7 d; x; D - , E5 z5 s h1 f
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */6 m7 {. P2 z3 L9 w" a
- HAL_Init();
3 M* G& X) K# P! F" u' K o+ k - + M3 i& v% ^, j0 J
- /* USER CODE BEGIN Init */
$ u5 v6 T, w9 [2 L) H" U2 F
u: G1 b/ P, h- /* USER CODE END Init */
2 [4 A% @* z8 w8 }1 `" S - / L# A9 a1 K* v% G$ n
- /* Configure the system clock */. ?" l! l, |, T Y+ f3 p" ?
- SystemClock_Config();: V& Y6 F0 h# ?
9 t0 a0 z8 M; U$ s8 K- /* USER CODE BEGIN SysInit */7 b C7 j0 e$ p0 {7 ^
3 Z$ c( v4 |. @$ Z; j- /* USER CODE END SysInit */
3 t: F) w( k/ Y; }) w* b/ y% t - + R+ R k3 q8 c& D/ T/ Y
- /* Initialize all configured peripherals */
, v% n; d3 I8 y; f: b - MX_GPIO_Init();/ ~6 x: R6 v0 H! C
- MX_RTC_Init();
7 ]$ I# g7 g: {, Y$ V, g) U4 | - MX_USART1_UART_Init();
x" j; Q8 i; a0 I3 S - /* USER CODE BEGIN 2 */1 [0 q- b4 C& @" {' ?" O3 a
- printf("stm32g030f6 rtc & alarm demo start......\n");$ V7 v" L- P+ v, N* {8 W1 {* {$ O
- RTCStatus = 0x01;
. f7 X7 a& |- U1 n/ c- L' F' s - /* USER CODE END 2 */) N5 W+ \& w4 Q' `
- 8 L/ }: g" C$ e/ }; W; J& I# h
- /* Infinite loop */
6 ^, w Z A, e9 b% D% U$ w - /* USER CODE BEGIN WHILE */
* ~! E" m9 d$ b( o# U l - while(1)
! m4 q3 S# l. C h& S% z/ P - {
! o8 H/ T. w ~) B! G+ e- P - HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);) ?& d' q' S3 C# ^6 P
- HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
* v. U& M" z$ y; P+ W Y: ]* j - printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);+ q- U: g) [/ q6 S3 |
- HAL_Delay(1000);
7 m. e) j3 s p5 p1 U4 b8 n2 B - /* USER CODE END WHILE */
! r; {8 X1 I/ D - # F3 [ ~! P, Q2 q
- /* USER CODE BEGIN 3 */
# C! K; K. ~/ y8 c' y9 o - }
' P2 ` S3 ~! p$ o8 G; M - /* USER CODE END 3 */) T+ t- ]6 u9 d& G8 ^4 D: ^
- }
复制代码 4 x0 H/ u$ P9 Y) E, X
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
/ c. o) d, q# a3 Q t
, o/ X* ^+ x6 K1 ` e2 w3. 编译并下载测试. H7 ]& f- k! n3 N! S
将程序下载到开发板中,连接串口助手并打开;/ h2 O. o0 O8 \; R' K3 D
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
/ F. u$ o4 m2 n, @2 R7 m$ w J- l
* ^4 E# F- U. f! X* g9 d. F, I5 T) {7 u6 M$ T3 O2 }
* S9 s! \7 Y2 t$ A
|