你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G030F6使用CubeMx配置RTC及闹钟实验

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
8 d$ X5 {0 T1 `* H, D3 N打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.! ~; C; R6 s" Y7 y

9 c+ ?1 Y# n) R# v+ t先配置一下串口,用来打印相关信息% d: w: A5 m  y. F% M1 R. m6 h
0 m. P/ h+ }$ I% @) K3 E
20210128091458888.png

% P+ b7 R# B- {
( f/ z: t+ u' |  v% J再来配置 RTC1 T  K' z/ l1 Z+ a5 E
+ N( m( k' W) R
20210128170709886.png
: Q* T0 V( q; `
1 ]+ l! y  a/ @
20210128170837705.png
0 Q9 H; F# J& O- a

% s6 `. p  E8 o; b( t( |3 D; A配置时钟
- P4 d$ S5 s' X# n4 n8 j0 Q3 R  B1 h8 _$ h7 X0 M  V
20210128171003870.png
' X  c1 p, r2 K" D6 R: o

% k  b# a2 v) Q0 N5 d8 r+ hps:本实验使用内部低速时钟测试,未使用外部晶振.
8 f9 u" I# V6 u6 O0 E- e
& v7 G5 U& r4 B; X) X2 Z) O配置工程相关选项. e* ^+ {( m3 P8 k
+ t  L+ D  `9 L) f+ k" v% ^
20210128171144837.png

- ~% c+ k# B% z9 ^* \0 Q4 ]3 v
6 n9 @) W" M) C( {配置完成后点击右上角 GENERATE CODE完成工程的创建
! ~- f0 c2 S, X9 P9 j: R
, @$ m) J( r& O0 R2. 编程
6 Y% n$ P& f: l2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
9 }; W2 o+ j/ F2 E
  1. /*设置系统时间*/0 p$ x9 n6 @0 p* d4 e
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    7 b  P; [% j1 Q5 G# Y& Q- I: t
  3. /*读取系统时间*/  O# o/ e9 H9 @; F! O0 v
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    ) V, u. M5 D8 E1 \0 ?6 W9 B
  5. /*设置系统日期*/
    + v' Q' E2 y, |2 Q3 t
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)3 y+ K( V+ _/ K/ Z& P
  7. /*读取系统日期*/( N9 ~* Y4 h- j" F
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    1 P3 P& n% N- F0 ~* N) @  x, F
  9. /*启动报警功能*/
    - {4 {9 F' Z0 C, _
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format): n# C- A8 }* V3 j* ~  U
  11. /*设置报警中断*/4 h1 t" ?6 d6 z* `4 a! Q2 ^% b8 I
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    % Q9 T1 ~5 W# C7 G# W" f& R
  13. /*报警时间回调函数*/+ V1 |8 ^) |) i: |: X
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    . X) p, H! T( D' e$ Z- U, a; n3 M
  15. /*写入后备储存器*/
    - a3 U% B9 O2 K# h" ~
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)$ J& k, T/ T0 ~1 y2 e
  17. /*读取后备储存器*/. ^) m1 F, G6 e$ I9 O8 m
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
0 a! C# l- F( {" L2 s. K+ N; s5 j
2.2 串口相关的代码
; o0 H, [% r2 r3 Q+ G. V/ U  C因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数3 d& R  j; L: ^' C2 Z5 i& a
  1. /* Includes ------------------------------------------------------------------*/
    1 G2 W0 Q0 P( E. k( Z0 J
  2. #include "main.h"0 m0 B, R' I& K1 ^2 y

  3. * _) N8 e' D9 B9 G3 P
  4. /* Private includes ----------------------------------------------------------*/: C( b4 K+ X" h5 R( b* E" w5 F
  5. /* USER CODE BEGIN Includes */
    2 X; f/ o& W7 O: K+ L: i3 M8 [0 }
  6. #include "stdio.h"
    - T! b# O- N1 _, U
  7. /* USER CODE END Includes */1 b9 c' x0 v3 m9 B9 j
  8. 2 K* i% E3 t; l9 i# l' _% e" F
  9. /* Private typedef -----------------------------------------------------------*/: j. U0 F" K: p- [! E0 M/ y- ^
  10. /* USER CODE BEGIN PTD */0 W4 J8 \8 R' K) ?* L9 Z

  11. # i: g0 X0 y9 I, c2 ~8 a$ Y% ~
  12. /* USER CODE END PTD */* t% b! f" ^7 z
  13.   q7 u3 _+ A4 U5 l- @) U  L. J0 T
  14. /* Private define ------------------------------------------------------------*/4 x; ?6 T( c; t: i) N/ R4 z; l
  15. /* USER CODE BEGIN PD */) r( F1 O' T1 i$ o- W5 Z; k
  16. /* USER CODE END PD */
    " B) T& h9 W& a  ^4 V$ y
  17. 1 D' E0 M; G1 j$ H, X  d" M1 l
  18. /* Private macro -------------------------------------------------------------*/( E9 b* N; G' ~' p( `8 D. i
  19. /* USER CODE BEGIN PM */# w' ^( _+ p5 c' U6 J
  20. ; e; v* S' D* c3 A' x
  21. /* USER CODE END PM */0 [) i) m4 s. l9 f! M) h" a1 v
  22. * u5 |7 Q9 k/ x) }
  23. /* Private variables ---------------------------------------------------------*/) K) U) W$ U( T9 y: L
  24. RTC_HandleTypeDef hrtc;7 |% ~. n* u2 |

  25. 1 Z' d; `0 h' D' u+ [3 f* c- Z
  26. UART_HandleTypeDef huart1;0 {* y" K& Z' t  y
  27. , E1 V" Q9 D' j+ b' c2 U
  28. /* USER CODE BEGIN PV */
    9 V' }( }; v( k/ d
  29. RTC_DateTypeDef date;        //读取日期
    7 Q/ ~, b# `& l* |
  30. RTC_TimeTypeDef time;        //读取时间8 {; Z% o' I3 F. ?
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    " h: X3 v6 T1 Q9 g" ^
  32. + q3 V: i5 M3 \! [1 z% `8 H: |
  33. /* USER CODE END PV */8 T% M# I1 e: `( {! z

  34. ( p; I. L. `" W
  35. /* Private function prototypes -----------------------------------------------*/
    7 n; d" p. D; x9 u
  36. void SystemClock_Config(void);
    + \) N0 f6 P9 K. @$ P/ z; ]' B
  37. static void MX_GPIO_Init(void);
    % ?, u& N+ {( }, e7 s' K# B
  38. static void MX_RTC_Init(void);
    $ v; f& U- P3 V9 Y
  39. static void MX_USART1_UART_Init(void);
    9 q0 K4 T+ _$ O
  40. /* USER CODE BEGIN PFP */
    ! P5 l. Y5 j: W7 y% K; `2 p
  41. // fputc 函数重映射" @5 ]4 x5 w" \4 G) B* p
  42. #ifdef __GNUC_! G$ L3 y9 H) ^/ p0 L6 S
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)9 O- s% k# K' A% Z( C
  44. #else
    : p, T8 i0 Y5 `7 V8 p! ~  G
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    7 ?4 \( C' z9 Q, T# x4 \# C  J9 P
  46. #endif' d9 m1 x/ j1 m% u: |; c+ t
  47. PUTCHAR_PROTOTYPE9 F) o7 _) q) N! [; T
  48. {" B9 C1 w5 Y  P7 j
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    6 {& z% @, P% S) {0 l3 C3 K

  50. 0 M; A3 h; J% ?4 ?: ]1 C
  51.     return ch;" W& x: b' |+ P5 u
  52. }
    " _4 w6 @, Q% ?8 }; u( q& A1 J& G$ V
  53. /* USER CODE END PFP */
复制代码
0 B( Y3 G) s9 D1 T, V3 r! [. Q
' m% H8 T% z7 X# N
RTC 初始化# h$ k0 v; t% g; ^" e
  1. static void MX_RTC_Init(void)+ Y+ d3 c1 p/ N6 ^; ^, E
  2. {7 X% y4 P: g, E6 {0 M
  3. # g4 `8 H' i0 ?( @8 K
  4.   /* USER CODE BEGIN RTC_Init 0 */1 d) }! ]. }6 c5 b' c

  5. + N9 _; U! q- e7 c
  6.   /* USER CODE END RTC_Init 0 */
    " X2 L# O% M* L2 z
  7. ' m7 ^# Q9 p0 Q8 N/ O
  8.   RTC_TimeTypeDef sTime = {0};
    / N7 N( D# A7 T; y
  9.   RTC_DateTypeDef sDate = {0};8 |4 c( B7 o; a* ?9 r+ F% q' e- e2 Q
  10.   RTC_AlarmTypeDef sAlarm = {0};! ^+ E5 H1 O. C* W

  11. 6 S0 I: T7 Y& J
  12.   /* USER CODE BEGIN RTC_Init 1 */  p4 `' b1 }6 L4 P  k0 w8 \

  13. / R! K1 g$ f9 |8 N
  14.   /* USER CODE END RTC_Init 1 */
    4 V# r  {6 d8 l  B4 J- [
  15.   /** Initialize RTC Only
    6 r. `+ {) r* I3 h& o; c
  16.   */2 K& u0 Q6 Q# P" Q* y: V
  17.   hrtc.Instance = RTC;' N) E4 P6 b% G1 q& ^6 c+ F
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    / R+ d  Z* \" @4 ^( m
  19.   hrtc.Init.AsynchPrediv = 127;
    ( y# {8 R* p% a( U; z  I
  20.   hrtc.Init.SynchPrediv = 255;
    7 c% f6 c$ p( `! |5 L; J
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;: D# ]; S" r1 s
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;% L" }* c$ D  @. ^# M2 R2 ~
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
      ?  P: f* x1 K9 L3 N
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;% {* F, \* L. S# L' j
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;# t, O$ E* `7 Z- N# _
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    7 Z7 {! Y* b0 o
  27.   {
    ) Y6 |3 F! \6 q" ]. p+ e
  28.     Error_Handler();9 U4 S  {; \8 I3 G/ |" \
  29.   }
    ) v4 U3 @! ^; [' Q9 E1 O+ G

  30. 5 Z+ l8 ]0 \. J! X2 `$ B- B/ y
  31.   /* USER CODE BEGIN Check_RTC_BKUP */6 ^9 s9 H0 K! I! v& [6 L  ]' X3 |, _
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿6 q& v: s2 W) R; L: V4 p1 t
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)
      @, X0 K- ?7 x% i  i# B' o# `
  34. //    {- L6 n% m9 w+ d5 `- y
  35. //        //已经初始化过了,直接跳出初始化函! l/ R- ~! }) }: A- F
  36. //        return;8 @+ u) p2 X4 X  Y3 K( m+ C
  37. //    }
    * ~: v$ a( ]5 C# k/ W0 k
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿0 a1 u$ f" `: D5 R1 ?$ b
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    8 B- F1 {3 p/ M9 g- @2 J' L
  40.   /* USER CODE END Check_RTC_BKUP *// U( K3 ~9 s2 c, c+ `2 r8 i/ ?

  41. : j2 E6 E& a; t4 p5 F  ~: @: }
  42.   /** Initialize RTC and set the Time and Date
    / x% y% J; Y( h! z. Y; j7 S* i+ b
  43.   */: C" s' c) q  B
  44.   sTime.Hours = 14;
    5 x% z/ J( E; ^, p9 m
  45.   sTime.Minutes = 50;- s; s0 w5 x) J" `. H
  46.   sTime.Seconds = 0;. z5 l2 b6 t" b( r" e2 _
  47.   sTime.SubSeconds = 0;
    2 J: i( E9 {* b( _, L# _
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    # z0 b, ~3 `2 z$ B7 U* |
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    7 |# k( Z5 q! Z8 f! x
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK): A/ X9 s0 E2 n  i
  51.   {
    9 j- F3 Z% `! f& S  n
  52.     Error_Handler();
    ( {2 y" X; H4 E1 m' e5 j: H
  53.   }) ~9 M* C' A# m( x3 z+ O8 j
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    * z* t: Q8 H! z) _% l$ ]0 f
  55.   sDate.Month = RTC_MONTH_JANUARY;9 W6 L( I' }7 P; U
  56.   sDate.Date = 28;/ N4 P1 w% N5 I8 t; Z) p
  57.   sDate.Year = 21;# c+ p/ @; H0 T; K4 z+ S

  58. ; A7 }0 Z4 I! E/ a' B+ r. f6 A
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)0 [# X/ L; ?0 M# R
  60.   {$ ~( D. A4 B, W3 J0 v9 _
  61.     Error_Handler();7 F$ M% Z8 T! i! Y7 ^" ]
  62.   }, @% M! G/ K0 c
  63.   /** Enable the Alarm A+ K$ ^$ j1 n2 R2 q! I. w  ?
  64.   */& w9 G0 N; k: Y8 p+ s1 i% d& ?
  65.   sAlarm.AlarmTime.Hours = 14;  t' s) s% i  T0 \! r1 R, \
  66.   sAlarm.AlarmTime.Minutes = 50;! v+ f, c) Z. n0 |
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断6 z7 B5 N8 T( U
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    7 ^; c: ~! s$ Q) t
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    7 u' J5 z' q9 k4 t( a
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;4 M0 v0 _1 R) }3 h9 l
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;$ d1 n  a- j8 \- e! F: p
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    " [4 B  j8 @. J% ^4 F
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;1 r' h+ ]  n: y1 Q
  74.   sAlarm.AlarmDateWeekDay = 28;
    6 c- U; [4 a3 M1 @
  75.   sAlarm.Alarm = RTC_ALARM_A;
    ) ]( Z8 `* v$ W2 T
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)# {+ P  e% g, e0 ?% o0 y& x: Z
  77.   {0 q$ X' I  g) e- ?1 F  n+ _4 W* I
  78.     Error_Handler();
    : K- C& U5 B+ P3 n4 O
  79.   }
    1 N& n# E' ?3 y* V1 S5 ]6 `5 `% O7 g
  80.   /* USER CODE BEGIN RTC_Init 2 */
    8 ~7 _. q0 {' G/ N! g9 }
  81. ) m5 F( P0 M' P3 @: ]- L. u
  82.   /* USER CODE END RTC_Init 2 */9 q4 V* K1 P! ^. l5 ]/ O
  83. # P, N3 {6 c1 ^2 ], ~5 d( f+ L5 ~
  84. }
复制代码
; v0 k8 x$ K' T
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
% x/ R7 _5 A3 O2 z4 K8 S/ J
# ^" P8 [" t1 C0 y8 ~1 _; f4 @# Z配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数5 E  [2 ]8 n2 W, w/ p9 D
  1. /* 设置闹钟下次产生的时间 */
    $ P2 o. J- d4 b: Y$ i4 A5 k% ]4 @
  2. void setalarm(int hours, int minutes, int seconds)
    * m2 y8 [: v- K7 S% p. W
  3. {) g" [  o8 T+ P
  4.     RTC_AlarmTypeDef sAlarm = {0};
    7 h( z! d! r. l
  5.     RTC_DateTypeDef sdate = {0};      R8 v! N* o) f; B
  6.     RTC_TimeTypeDef stime = {0};0 u) o0 E6 @; l$ x' `$ u" C* Y
  7. & x6 C& i; G0 b2 w0 e
  8.     //读取当前时间
    6 S1 M5 ?& P. a' e8 j0 Q1 f
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
    3 ?8 D  i  H4 _
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
    9 L# O% ^: i* W
  11.     //获取设置中断时的时间5 X5 _* z1 [: ], S* i) D
  12.     sAlarm.Alarm = RTC_ALARM_A;+ H' y) l7 o! [5 b  n3 L/ x: @
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    / N/ n+ g5 r" y* _( Q# Z
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
    1 [' J3 {- ^% u2 `$ n$ Z/ \6 W. B0 m
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;0 N/ l# d4 A! d8 n* @  k
  16.     if(sAlarm.AlarmTime.Seconds >= 60)9 @2 `$ U$ Q  W
  17.     {
    ) T" S4 n) Z/ F/ u
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;4 k; Z. W" t0 e4 d
  19.         sAlarm.AlarmTime.Minutes += 1;; T4 W  d0 h5 N9 {) [
  20.         if(sAlarm.AlarmTime.Minutes >= 60)
    # J; L" }3 F) e' E% U
  21.         {7 w$ \5 d3 R$ ?( q/ P$ c
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    $ e5 J& h$ S* m: D  J7 @8 z  J
  23.             sAlarm.AlarmTime.Hours += 1;
    ; H2 n2 `8 B& b
  24.             if(sAlarm.AlarmTime.Hours >= 24)- a8 z8 m2 K% x8 i+ ^
  25.             {
    5 {" N- o, _, a3 V. H# c) W( r
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    % ]5 P4 Z* ?0 `6 }4 N( s) g/ @
  27.                 sdate.Date += 1;' @- I: h5 F9 ]' K! _1 U
  28.             }- D* O! d, s& Z! e
  29.         }
    ! n+ Z* G4 V0 M3 ?
  30.     }# r: E7 L) S: j) U  K
  31.     sAlarm.AlarmTime.SubSeconds = 0;
      A9 U4 J8 C# z0 u- U0 q6 \
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    , V2 G, D# w5 A0 z8 _& D
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;+ L2 j+ Y6 z9 \0 {/ K
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;4 `# l6 U: a% U& L
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    $ f2 @" v( P0 t0 j7 ^
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;" }# ^. A8 ]) C2 y3 X) j; h  q
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    , U7 d+ U. ?1 U$ [- v+ s$ M
  38. + f; |7 p$ {0 G; s5 c  Z0 P) B9 P

  39. ' s6 B1 b2 X; @: E+ e: I6 K
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    $ F. V' v& c3 h' t9 ~2 `
  41.     {
      t2 H$ _' e( h: R8 x, A
  42.         Error_Handler();7 U' g7 G0 M! {) k5 t
  43.     }, O# P4 s: k- d( x, h+ o, }
  44. }& n6 H" @0 E; v

  45. % r0 F% I1 l6 l% k. E4 d
  46. /**
    , H1 }# U3 U- _4 u
  47.   * @brief  Alarm callback 闹钟中断回调函数
    * n# [3 a1 `6 M# Z
  48.   * @param  hrtc : RTC handle4 a0 S" {& S' |/ y0 S/ {& F$ I5 I
  49.   * @retval None) M8 S. D1 [2 |4 J1 x2 S
  50.   */" q( W  B" }2 s% Z) A. K
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
      _; F, @1 C& ]( l3 I( l
  52. {7 ]5 C& @/ m4 {- y/ W; O4 x+ B, s
  53.     static uint16_t sEnterCnt = 0;
    ( X) \  E/ |$ h, u

  54. . f% q  H/ H1 s- j$ {
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断* i. F% T- J& v7 Y
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);& r( k* @5 _" l2 |+ G) W0 V" a* ^
  57. }
复制代码

0 G  A3 ]& T  ]% f& W' u6 l$ Fmain 函数/ @! {7 W4 P4 H6 ]
  1. /**
    6 X: I( o4 j0 O! X4 L* g
  2.   * @brief  The application entry point.
    6 `9 W1 ]$ f3 e! s; |0 B* l
  3.   * @retval int
    , z" N7 p, z- H3 k
  4.   */
    ( J+ T3 ?  Z! r1 ?6 W
  5. int main(void)4 W. p' [1 `$ }( H4 Z2 u$ J# u# @
  6. {
    0 o6 `, q4 J' g
  7.   /* USER CODE BEGIN 1 */' X% L7 e3 M+ @" T& ?8 \7 {& s
  8. 7 T- s# [- Q: K+ E, l4 U
  9.   /* USER CODE END 1 */6 f5 J5 x' c) L" i8 [' F. N9 @: ]
  10. ) E: N/ M' U8 Q8 E& V7 N3 I
  11.   /* MCU Configuration--------------------------------------------------------*/
    & G. c; j9 ^8 Y' t9 D

  12. 6 q1 S2 J4 F- P8 E3 F3 k
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    2 I) i( H, B3 E( i9 U
  14.   HAL_Init();
    ) P! D" d( E0 L9 Q8 S; c0 _' ]
  15. 5 w+ n; ], |, b
  16.   /* USER CODE BEGIN Init */& ?& \7 N1 e6 V0 p
  17. & C. `6 G) ?" |: a
  18.   /* USER CODE END Init */
    - A; Q2 l- D9 K+ d* o" q! I  {

  19. 8 n6 n% j' j+ d7 n( |$ q4 X
  20.   /* Configure the system clock */" j3 J$ U) w/ V% s! M( `4 f3 ^
  21.   SystemClock_Config();( ]3 t3 s1 H, b

  22. . r  t. O7 c6 K
  23.   /* USER CODE BEGIN SysInit */8 M* K; d) d& B3 T- e0 A, i# R

  24. $ @) r* v) v3 m% y( o, T
  25.   /* USER CODE END SysInit */+ k. L5 l% |; }$ g. }2 Y
  26. + @2 V' p, i2 j1 ?
  27.   /* Initialize all configured peripherals */0 r: P) h& Y, c: S7 J/ X( I+ R0 @  V+ y
  28.   MX_GPIO_Init();
    : |: e" ?2 V! ?4 S: j$ I, M
  29.   MX_RTC_Init();
    1 L/ v" C! x9 T+ S5 f
  30.   MX_USART1_UART_Init();. g: `& L1 F: n: ~, U2 G
  31.   /* USER CODE BEGIN 2 */
    1 U8 N9 f& D1 ?  {1 D4 ^4 m. X
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");5 ^# D% s& b7 G( Q
  33.   RTCStatus = 0x01;; m; e7 x+ p2 |5 v- U+ M
  34.   /* USER CODE END 2 */  ]" J3 R+ U* e' M
  35. 6 b" [) s' E7 V/ _
  36.   /* Infinite loop */& r/ c0 L+ O: Z# K  _8 S3 X
  37.   /* USER CODE BEGIN WHILE */  t5 _! |5 ]" x6 j7 x' X+ i1 J
  38.     while(1)% q/ R8 M1 ~+ E# D
  39.     {
    . {' Q  Y" b) m5 w  |$ U, W# O
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    * q1 U% [5 U" w4 r
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    * \! u, h; G- c
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);& ?, g6 c, n/ Y
  43.         HAL_Delay(1000);3 n7 K- g9 I$ l) L9 |% m& W
  44.     /* USER CODE END WHILE */
    0 Q/ k/ _; ^5 K3 o  u( K
  45.   r: Q/ E) p  p& W
  46.     /* USER CODE BEGIN 3 *// d& k' S9 P2 I
  47.     }
    + c3 Z. ~* z4 G3 c. [9 R/ p. |
  48.   /* USER CODE END 3 */- [& V' c+ y$ J: }; R* b( t
  49. }
复制代码
3 G& F6 {9 B9 R
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
! S' }0 {, C. B4 D. ]1 `( l9 \3 B
1 p% W% S8 \! [, D" @3. 编译并下载测试
2 i/ v. i6 q# i: ?' o: G) U' l+ t将程序下载到开发板中,连接串口助手并打开;! k# h5 A' w, d  L% \, F/ m- X1 K
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
: b+ e' @4 H) ?+ u) }6 H
. G6 ?. G4 A: u, n# W+ @
20210128175241625.png

: N4 V- d" N# v( `6 Z! c2 \% Q* s3 V& R3 u4 s5 z% _; J% z, t
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版