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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
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- \  ~
20210128091458888.png

) _- `: 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
20210128170709886.png
; U( r" c1 p# J  S) L
* a5 n: m6 l7 R& u  d7 Z8 `
20210128170837705.png

( 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& ~
20210128171003870.png
* 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
20210128171144837.png

# 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
  1. /*设置系统时间*/9 I5 k. a9 g  t# ?4 D9 V
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) $ [1 O8 H4 s( c  y9 |7 d2 f
  3. /*读取系统时间*/
    9 b- Q0 B: B! s% Z5 ~
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    5 ?6 ]" ~; ^6 W
  5. /*设置系统日期*/. {7 o' d! b. Y
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    / S1 Y* ^8 }$ P' k8 l1 ?
  7. /*读取系统日期*/
    * V" ~9 n3 l; M# b$ v
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 ?; N7 u/ k' w
  9. /*启动报警功能*/
    + ^& z, k+ Z: X
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    / D8 K7 u& _$ K0 P4 k' u
  11. /*设置报警中断*/4 s  a  Z3 c" p! W" n! p, b
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    / I/ Y' _6 C6 ~9 i- }& ^$ c/ [
  13. /*报警时间回调函数*/
    ' [8 h5 E  R1 x: D. E1 ]3 J
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)( X1 P3 ]: q$ \& w- m
  15. /*写入后备储存器*/6 p1 c+ x/ `% \* Y' F. q, H, r6 T
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
    . q) @! v2 j  @- Z% ^" f7 H
  17. /*读取后备储存器*/4 ]( p. f5 C7 ?9 x
  18. 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 `
  1. /* Includes ------------------------------------------------------------------*/
    6 }& n7 r8 i1 `7 Q6 o2 |; Y
  2. #include "main.h"9 e" i, U9 \+ b: c# G0 P) N+ N

  3. , i& J+ x% X2 O* |* _
  4. /* Private includes ----------------------------------------------------------*/
    ; \: m% \- ~$ x' F2 L* \8 V
  5. /* USER CODE BEGIN Includes */
    0 j6 p7 w3 ?3 u( L. C
  6. #include "stdio.h"0 W0 y( q- v7 Q1 Z$ ^0 t
  7. /* USER CODE END Includes */8 L& d* O5 L$ X- ]

  8. - h. C! a6 B- J# D
  9. /* Private typedef -----------------------------------------------------------*/8 I2 T! ?& g+ s) V$ U
  10. /* USER CODE BEGIN PTD */
    + |/ v- |1 r, W

  11. $ b" {  d4 S$ v, d0 m& v" e$ ~& d
  12. /* USER CODE END PTD */
    ( t% x+ _- X% C8 H

  13. 1 p$ x% c5 E/ g+ _; e' N+ Z
  14. /* Private define ------------------------------------------------------------*/% H3 D  o  c% R& C0 W7 T
  15. /* USER CODE BEGIN PD */
    + M9 I, X  p( O% ~
  16. /* USER CODE END PD */. {3 o% u$ u. n

  17. # s. X+ W2 \4 W- R) v
  18. /* Private macro -------------------------------------------------------------*/
    $ S; _! c2 d+ j4 |& E5 n
  19. /* USER CODE BEGIN PM */
    3 t+ `6 n5 P$ G' a! ?

  20. % W! Z8 e7 E$ I9 Y" `2 S
  21. /* USER CODE END PM */
    + H/ |! J) m' J' |2 m* J+ x: O

  22. 9 l1 ~: q' ^6 q+ D! |2 I
  23. /* Private variables ---------------------------------------------------------*/
    ; _, F! M4 x$ X8 \3 x. s2 y8 a
  24. RTC_HandleTypeDef hrtc;; q9 g; Q' i2 X! v

  25. ( i9 n6 A; j* W
  26. UART_HandleTypeDef huart1;6 ]2 |2 y; [+ N' A! m, b
  27. 4 m* v: q# p& f: K. y: X" y/ W
  28. /* USER CODE BEGIN PV */+ W: t- K* j' ~8 \3 O; j8 t3 N
  29. RTC_DateTypeDef date;        //读取日期, r0 T+ z* E# Z0 W" p' ~
  30. RTC_TimeTypeDef time;        //读取时间
    ! M# I) k1 v( R5 t; O$ y4 W
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    * E3 o3 N' r* q3 K) S
  32. ( u: |. n2 v% d, @- E% X. z
  33. /* USER CODE END PV */
    - A8 b! ^8 P1 m, s
  34. / ]" j4 c) |) y0 s, s
  35. /* Private function prototypes -----------------------------------------------*/$ b6 D; D# d! @: h
  36. void SystemClock_Config(void);. w5 d9 U2 ?) Q4 J
  37. static void MX_GPIO_Init(void);
    0 R! q3 }  r0 |2 _# A: q- v7 J
  38. static void MX_RTC_Init(void);
    , R$ ^" F) W: \4 W, O
  39. static void MX_USART1_UART_Init(void);. N2 s9 @; j8 S1 h
  40. /* USER CODE BEGIN PFP */2 \6 Y7 g' I/ e" v
  41. // fputc 函数重映射
    3 H  t6 ^) l& G  v- U
  42. #ifdef __GNUC_
    + U8 O3 J5 H5 e2 z7 R; u& w
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)6 G( n7 ~. c; r: V
  44. #else
    5 ^! p$ w0 \8 j( n! v0 h
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    ) W- j5 M& X* x# J, F
  46. #endif8 n9 o. a/ h+ X3 r# [, X
  47. PUTCHAR_PROTOTYPE, x1 F' \# P1 h4 m6 U; v, x
  48. {
    ; C1 y: B  |& E" d
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    * I) c9 f: x: I; @1 N! h) M; z

  50. ' q1 Z. j  N5 Y
  51.     return ch;; b; b5 \9 N- I  \, n+ F# ~" h
  52. }( a0 @' Q5 r- O& z/ u
  53. /* 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+ _
  1. static void MX_RTC_Init(void)
    0 s/ T$ k- y+ \( `- v1 I9 o
  2. {
      G' u7 X* m9 c- O# F+ h
  3. ; {6 _7 j8 e  ]7 F
  4.   /* USER CODE BEGIN RTC_Init 0 */2 p! I4 @% P& Y7 s1 m& D. ?5 l
  5. - R/ S( \4 p8 Q& X- R. B0 R# e
  6.   /* USER CODE END RTC_Init 0 */
    * `9 A/ b  c, `# d: A4 n
  7. $ z! _: b( U! o8 v, z
  8.   RTC_TimeTypeDef sTime = {0};6 h, y: T8 ^0 @' o0 L8 P
  9.   RTC_DateTypeDef sDate = {0};
    9 X- z! m) s% y. j- m- {8 @
  10.   RTC_AlarmTypeDef sAlarm = {0};
    5 E4 ~% \" z9 e& h) s
  11. # c: y9 ], H2 }( j0 b2 @9 B
  12.   /* USER CODE BEGIN RTC_Init 1 */1 I6 D- e6 G, M' G3 v/ c

  13. : U; L! l0 G% e
  14.   /* USER CODE END RTC_Init 1 */. _% y# l! ]$ a/ z( o/ Z- i
  15.   /** Initialize RTC Only( d; z3 [+ L8 L! d) K7 d9 Q8 ]4 m  o
  16.   */! N! o3 j) _1 ^# r/ y# k
  17.   hrtc.Instance = RTC;
    % T" z' R# D. `) h
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    ; s1 \, `/ ?7 ?$ e0 n
  19.   hrtc.Init.AsynchPrediv = 127;+ K3 y$ a6 L8 Y( B( J- m9 a" Q
  20.   hrtc.Init.SynchPrediv = 255;
    . c* N' \9 d' K/ g0 L7 @2 z' z
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    : M. x) O* I6 T1 }0 {  H$ n
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    % I$ c7 Q+ S; A+ N
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;" a" x! z; ^) K1 N; ?" Y
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;7 M! c6 S' _: W/ w5 j6 A4 C
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;1 c" v/ I3 D% z# ]0 b
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)/ o- L! n& x& i! d/ @0 O
  27.   {0 ]- ~; d3 Y. X1 p3 ~
  28.     Error_Handler();) K, w/ y6 `0 m% Y
  29.   }* `, i- F+ c6 m( o( J

  30. 9 w6 a* y+ K* R
  31.   /* USER CODE BEGIN Check_RTC_BKUP */* X+ m: Z" m7 Z. k
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿; X+ A  R7 ~# u8 e4 m
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA), D6 _# g6 D* [: F% k7 }* b2 P; U
  34. //    {5 P% @8 i: U+ f7 }' A: n& X1 A
  35. //        //已经初始化过了,直接跳出初始化函5 U* q4 d7 z, e0 ?: ^3 Y
  36. //        return;& H8 e: }3 E1 m. V: I& [% P
  37. //    }
    ! C' A: s- N1 K8 }, e. T6 r
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿
    9 R! t4 f8 y: D1 p  u
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);* i9 L# t" ~0 Z: a7 @
  40.   /* USER CODE END Check_RTC_BKUP */
    3 O: A- R% ~! l5 d
  41. - M" K# E; l4 N0 C4 u
  42.   /** Initialize RTC and set the Time and Date/ Y+ T. _7 G1 `6 }; }6 u: y. [
  43.   */
    % ^" I) e' O/ D5 y5 C0 e; k
  44.   sTime.Hours = 14;
    ' @9 w6 m: J7 V# S) p  }; L
  45.   sTime.Minutes = 50;" S3 g6 Z/ W4 A9 [% a( {
  46.   sTime.Seconds = 0;
    - {" c" t$ ~0 \  Y
  47.   sTime.SubSeconds = 0;& x) W4 v) M4 X
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    3 e! n( s7 c. e7 n
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    + x0 F/ O# e0 j7 R* S" t0 v9 ~7 H
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)$ y' \, c8 ?4 a2 C- G/ t0 r  w
  51.   {
    3 z, ^, S" L4 r6 r  b8 t+ c
  52.     Error_Handler();% @8 a& Y+ ^1 |3 C/ I  k
  53.   }
    / r1 p' \; g( {! ~. x, k2 Q2 l
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;1 q" H) w1 l7 z3 Q( d  w* Q+ a
  55.   sDate.Month = RTC_MONTH_JANUARY;, p& a9 @6 d$ Q& a) W( c
  56.   sDate.Date = 28;
    2 c+ ?* ], B5 C2 u! Q4 }: s1 @
  57.   sDate.Year = 21;
    ; l0 h" y  c" g8 I
  58. ( e2 l- d9 y) j& m& {% o, p
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)2 K9 X, p6 v  o/ S
  60.   {9 m2 b/ b( K7 Q5 A5 l3 m$ N
  61.     Error_Handler();
    + |! Y. w# G, W5 O4 W- D
  62.   }! r( h" O/ b$ R- ^% m
  63.   /** Enable the Alarm A- B+ h3 Q2 W6 d1 {8 A) D
  64.   */
    2 _( s- r, D( _; B  a5 \( P& n
  65.   sAlarm.AlarmTime.Hours = 14;
    9 p9 N: ^1 ^# v$ g2 ^! T  H
  66.   sAlarm.AlarmTime.Minutes = 50;- ]. a" E+ X: f) v; J+ N
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断3 h7 a4 W" v1 a
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    ) a; [- y% e5 m4 C& g% ~
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;, p+ H& {3 ^) M: E- @& q: |5 i
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;# v+ g+ D& f& U7 v
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;5 y- {% r$ A9 f6 G7 J
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    ) Q# s2 e; ]) ~
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    % J7 a& d! K6 E2 I7 l8 b( [$ x
  74.   sAlarm.AlarmDateWeekDay = 28;
      E5 F9 o) f1 w, o0 Y
  75.   sAlarm.Alarm = RTC_ALARM_A;
      N1 ?# x2 ]# y1 d1 N
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)( x3 ~5 j- p0 |1 R3 v; X" s: I" _
  77.   {
    ; q) D8 L! b: M9 y2 x+ R
  78.     Error_Handler();4 R* Z2 `7 Q1 O! h7 h0 D1 L
  79.   }
    6 a6 q6 m  F& o9 W2 @4 T$ m- h
  80.   /* USER CODE BEGIN RTC_Init 2 */
    1 R, S1 l: q8 ]' M! y

  81. 4 B' W4 t9 R: @* z
  82.   /* USER CODE END RTC_Init 2 */
    & L8 C; j2 C; q/ u" o! M( P
  83. 1 f6 k+ k1 B5 V" g! T$ Q
  84. }
复制代码

) 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
  1. /* 设置闹钟下次产生的时间 */; i% @# z; b! g0 A0 a7 E
  2. void setalarm(int hours, int minutes, int seconds)
    1 v7 G( Y- G/ T) T: @; C
  3. {' n5 I  e5 B' k$ L6 w/ ?; f' `
  4.     RTC_AlarmTypeDef sAlarm = {0};
    4 X+ P- G1 _: }: {: q1 [
  5.     RTC_DateTypeDef sdate = {0};    7 K9 n- F9 \! _) h) n7 t3 W
  6.     RTC_TimeTypeDef stime = {0};
    3 `: O: w+ s* A) W' [
  7. 9 F4 @+ M' s7 k  I( i0 @3 I1 [
  8.     //读取当前时间
    $ d4 h" g  a8 j, M* w
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); $ u. z% J; _( X% W
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);' i- U: s, H2 A
  11.     //获取设置中断时的时间
    " v7 H# w, n1 I  n9 {
  12.     sAlarm.Alarm = RTC_ALARM_A;
    * t+ x9 _; J: \$ Z# W
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    5 T: U2 W9 z- v8 k7 D) p
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
    4 ]5 \4 q" D& ~; D5 C, w* |
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;2 S) U* u1 G3 H& G1 ?9 ?5 f
  16.     if(sAlarm.AlarmTime.Seconds >= 60)" F- ]) A- T9 }% \$ J3 d
  17.     {$ Y8 \- k4 _9 W( c) Z
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;- m8 T5 y& g  q! _. k6 n; h8 z( U
  19.         sAlarm.AlarmTime.Minutes += 1;
    3 K  J# ^6 f2 ^( u! p1 S
  20.         if(sAlarm.AlarmTime.Minutes >= 60)( h5 a" ?5 F$ ?9 n( w
  21.         {  d; Z& w/ B7 j/ g3 B
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    % Z% z) N4 \3 S
  23.             sAlarm.AlarmTime.Hours += 1;
    / ?5 V6 ^+ z, f9 o( n+ s0 ?
  24.             if(sAlarm.AlarmTime.Hours >= 24)4 L' Y3 I% P9 d/ V3 X
  25.             {+ B4 c4 _& u  G6 x* f/ _% F. b
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    & C! h7 k/ C: a7 d
  27.                 sdate.Date += 1;
    " G5 k: \' p8 s. P) r
  28.             }
    % n6 Q) b* Y8 B
  29.         }
    ! ]( o+ L8 _( D
  30.     }
    + e; M  X- \' f. r6 w
  31.     sAlarm.AlarmTime.SubSeconds = 0;
    , ~* {: B; V3 z1 m7 X) y; g
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    + f% k# T( L$ [* J
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    . z' U' a: q0 B6 x5 D% ^  ~6 Z
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    + z7 r1 L: H. i; T8 l
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;6 K% Y. N: F" Z- ]( c
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;% B6 ^& r9 M& z
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    3 C9 C+ F6 r  _  L/ R# u1 \" B4 y( p+ A
  38. 8 `' V& _. F) w0 E3 r5 q
  39. 1 v: D6 }8 G( M7 K
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)$ z" w! N, Q  _
  41.     {( j2 Q/ D2 W7 v+ E0 W# R5 S( R
  42.         Error_Handler();
    5 C# }: F2 _9 ^  Y
  43.     }
    6 f8 H3 Q6 p9 c, E  y! X
  44. }0 h' k3 p) c5 {3 P, T8 p
  45. 7 b9 f" a- ^* D; T; q8 |' h
  46. /**
    2 J" z5 I) X2 {! \; S
  47.   * @brief  Alarm callback 闹钟中断回调函数
    * W1 c# X  P5 S! e! V0 N
  48.   * @param  hrtc : RTC handle
      z7 t8 h3 V1 g4 }1 ]# s' P
  49.   * @retval None% u" ]9 m* u. z3 `$ B
  50.   */4 ^. n3 L  I4 f* {5 n: r  W' A
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)! T) c: N0 V. x* n6 y% u9 Q
  52. {- \) }+ Q3 v1 y% l- U
  53.     static uint16_t sEnterCnt = 0;. ~1 D  `  v, x% d
  54. ! ^3 Z8 \' n: F3 [4 y0 q
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断1 R% q7 n2 c( W8 r, w  w
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
    6 U2 M$ Q( x* Y' E! U) E
  57. }
复制代码
& z$ O8 B6 Z! @# a* ?% u/ h, j# @2 a! q
main 函数0 \& b3 j$ }# w% Q  Y
  1. /**8 V2 u2 l0 y# J5 h; o% H
  2.   * @brief  The application entry point.
    0 a: i; _# U  ?! P
  3.   * @retval int* |( ?1 b$ a4 n) k5 I
  4.   */. \0 W5 K' x5 ~! n  B
  5. int main(void)
    ) m' U: M6 F  D0 v: z, I
  6. {
    1 y1 s; |4 t" ^  G+ U* c
  7.   /* USER CODE BEGIN 1 */
    4 m5 E9 `! L# o' x% |3 L# `

  8. ' h3 V, @. E3 D5 Z6 k5 v, J
  9.   /* USER CODE END 1 */
    3 J  p. ?) _% y! C* Y' E9 F

  10. # s- B# I6 j0 u
  11.   /* MCU Configuration--------------------------------------------------------*/7 ]1 ]5 D* J1 O6 v

  12. 1 g5 z7 v" W' ~3 W5 [
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    . D; n4 n% G7 V9 ]0 E, p" r
  14.   HAL_Init();
    3 C  g& \5 ^6 A; y$ T2 J

  15. 5 Q) z7 c  ~1 ^! O
  16.   /* USER CODE BEGIN Init */" A; R/ I/ H- k! u- g8 Q1 K
  17. ( Y" n8 G& i. Q. {+ B2 t4 d
  18.   /* USER CODE END Init */
    6 h' g; O1 T/ g9 c* k

  19. : u% T/ D- x3 w$ Z$ s* E, G
  20.   /* Configure the system clock */$ m- J& p; C. C3 N& M2 g
  21.   SystemClock_Config();
    ) a2 T6 s7 ~2 _; z6 P

  22. + o, d  d0 Q' z- G+ ]/ j
  23.   /* USER CODE BEGIN SysInit */6 I  Y1 E7 v9 Y- k5 Y
  24. ) f* b' v9 `( ?( E6 v+ l7 f) w% A
  25.   /* USER CODE END SysInit */
    ( z  p+ `0 O, M! j% k& y# F! H

  26. 9 S( n2 p- ]6 y# Y7 T
  27.   /* Initialize all configured peripherals */) M, r( G# R/ d& z
  28.   MX_GPIO_Init();" E, Y# h) f$ R4 X: e
  29.   MX_RTC_Init();" G9 s) N. M4 m
  30.   MX_USART1_UART_Init();- r# w: I; i4 h* t0 q6 C
  31.   /* USER CODE BEGIN 2 */
    7 l' x% o& e/ x0 Y. f  O: l; k# Y
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");, _! F$ ~, y2 I/ a: K$ E
  33.   RTCStatus = 0x01;0 e/ B  e9 ^" Q/ l6 C
  34.   /* USER CODE END 2 */
    ; P) l. U# [3 Q/ R' c' @2 K9 m

  35. 3 N" q' a: J& V
  36.   /* Infinite loop */
    . x* G8 O# Z0 {
  37.   /* USER CODE BEGIN WHILE */9 u. P* v- Z7 N  l9 c. s! Z1 r
  38.     while(1)% N. i, r0 s0 k" I& s
  39.     {
    * P, Y5 V0 ~) ?7 R
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    " _8 d: w- s- g5 z4 a4 L3 F: M/ v' l
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    # V' Z) H4 \0 y: r: R) j! ]( O
  42.         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
  43.         HAL_Delay(1000);/ |# \& i" q, W( f& g
  44.     /* USER CODE END WHILE *// R3 ^6 L, D- y  H

  45. $ Q6 H  R( Y! {" T- ^
  46.     /* USER CODE BEGIN 3 */. ^8 d% J7 C, X* d; H# O' v
  47.     }5 h0 n& z3 n( z+ E3 M+ M
  48.   /* USER CODE END 3 */. t. m6 d: P- J+ z
  49. }
复制代码
" 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* ^
20210128175241625.png
/ Z) A" ]0 p0 I$ R4 k+ e
& h" B, H' y8 [" F: L7 L2 [
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版