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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
+ g7 P# I5 h5 m8 ?; o打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.& U) Y; \) e. s& v# ]- f7 h5 V( l# {

: e! a+ z( R% ?6 a& l6 l* U* O- n9 T' d先配置一下串口,用来打印相关信息
6 l9 q/ C2 b3 H! @/ u0 }& Z
, _. g0 S0 S7 S2 T' P! \# _
20210128091458888.png
5 o1 p3 r. a& @/ u, d! T& l" P) \
4 e6 ?3 x7 G0 V3 v" W7 |2 D. B5 ^
再来配置 RTC* K5 @* E. T, `' \

& \& k0 K5 `( @
20210128170709886.png
& d  H3 T# f/ M, f  c; ]3 W' [) ~
. m7 M5 u5 q8 s( r7 J
20210128170837705.png
, ]4 Z6 I- Y) c3 O' l. N: r

) D6 T/ o/ k) C4 r( u3 d' i$ z配置时钟' B3 x* a; ?( y: ?  S
& d- c; T6 B5 C- _8 m0 }/ [
20210128171003870.png
4 j3 G7 @9 f' Y" l+ n/ S' [7 @

  e6 k7 q' G( O$ H5 K: vps:本实验使用内部低速时钟测试,未使用外部晶振.- Y8 v8 E+ I: |" E8 I% w, R$ V

% U5 E1 Y, P$ A  q配置工程相关选项5 P  w6 t' `# h8 U
3 Z* y8 [  L& |. n" f
20210128171144837.png
. _0 T0 r) [9 i" Q8 J

  s6 U: l( t# T/ a% C# i* s4 k配置完成后点击右上角 GENERATE CODE完成工程的创建% O/ l" f& R7 C9 o+ u+ R) k+ r
2 ?" Y' I) ^' \
2. 编程, R0 G$ a1 k0 X! J, R. `
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
; R' F( J, E% x9 X; M5 _
  1. /*设置系统时间*/  X' ~" g( Q8 w# H) z+ I
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    7 J7 P! g, S. Z/ P! E& E8 A
  3. /*读取系统时间*/
    2 ]/ y. h& b4 t0 a3 a' e% y7 M
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)0 \  W$ l( e! c: U
  5. /*设置系统日期*/- w" [8 y3 C/ T: {4 i6 t
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)0 g; {  v! ~8 D. c0 u( x
  7. /*读取系统日期*/! L% ^0 S- C9 z, R# U3 }" J
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    6 M% b6 O1 ], q: G6 H# }2 Q
  9. /*启动报警功能*/8 B9 r' K/ I( ~: @3 o
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)% |: i- S! e; c) Q4 ], f
  11. /*设置报警中断*/
    / {& A8 D, n. y4 W% ~
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)2 M  k6 X, q) P  d0 W2 M
  13. /*报警时间回调函数*/! `% R8 I: j, N5 ^0 l; A
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    3 X% E# ?  J- n' m4 ]
  15. /*写入后备储存器*/, T) i8 t7 a/ t4 H; R. ~3 x" s
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)1 G0 F6 b5 `, p* A6 Z
  17. /*读取后备储存器*/
      ]% c' M* P5 n/ K$ ?4 e; E6 y7 ?: {+ A
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
! p. C+ d9 d6 b3 I+ k; K
2.2 串口相关的代码: X; c& y4 m8 a& A! ]- A: f
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数9 y5 `9 t* r) \
  1. /* Includes ------------------------------------------------------------------*/" n0 }! u4 o2 x2 C8 G5 w% [2 v" b
  2. #include "main.h"
    4 |6 t3 |# c! r3 s4 N$ P

  3. . n# B" @5 g& m. K4 w
  4. /* Private includes ----------------------------------------------------------*/
    ' r1 [' Z' J+ q2 W" H5 G) V3 t; a
  5. /* USER CODE BEGIN Includes */
    1 x" E1 I$ a" F$ T, o
  6. #include "stdio.h": D& d! [4 f& @' S5 ~0 H
  7. /* USER CODE END Includes */
    * r$ ~  s: U. n! k* h

  8. 2 ]6 }3 C# n. y! v* ]1 Y
  9. /* Private typedef -----------------------------------------------------------*/
    5 K2 U% \% N/ I5 e$ R
  10. /* USER CODE BEGIN PTD */
    ; v! ~. g% _) E" m' \" P
  11. ; P0 u. N: e2 a% R/ X6 }
  12. /* USER CODE END PTD */
    + T" d: V. b, ~: d" V

  13. + ?' T$ U3 [$ c5 ~
  14. /* Private define ------------------------------------------------------------*/& N5 \" `- Y, |$ h# j# d- V- K5 ^! U
  15. /* USER CODE BEGIN PD */
    4 x% u  t( d; V  q2 F: G  y
  16. /* USER CODE END PD */
    % f$ e( W/ `4 k/ B$ r
  17.   c4 ]# M* s$ o/ O. D
  18. /* Private macro -------------------------------------------------------------*/, I2 `7 {9 u( p7 Q! z' i
  19. /* USER CODE BEGIN PM */
    # A4 c. k9 J9 h4 L
  20. 2 H1 h% E5 z1 g( J+ P* Q' t; N
  21. /* USER CODE END PM */
    9 Y2 w: B* @6 K/ v; Z2 O: H2 D

  22. + o  ?+ a$ x6 c# B
  23. /* Private variables ---------------------------------------------------------*/
    / W4 ^2 W8 |+ K
  24. RTC_HandleTypeDef hrtc;
    - ~3 V" Q" i% [8 s

  25. / V# O- g: M: s' X( Z5 h
  26. UART_HandleTypeDef huart1;# ]6 P' J) l7 B6 ~

  27. ; H9 ?2 G' A. c
  28. /* USER CODE BEGIN PV */
    " m; z8 o. ^+ g
  29. RTC_DateTypeDef date;        //读取日期& @# y0 _+ }  A8 T' j
  30. RTC_TimeTypeDef time;        //读取时间6 A5 @2 A: v: w/ \$ |# f
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    ! p5 R) w3 r. X/ h* S1 J8 J2 v8 o1 n

  32. 8 S8 G! C# L, M4 Z' p' M$ I
  33. /* USER CODE END PV */0 w' \( h( E8 r) V2 M$ I
  34. 4 j* x2 a9 @& w9 A; M2 b; S0 ~
  35. /* Private function prototypes -----------------------------------------------*/1 B. w) ^) Q, ]4 b3 n; S6 D% A
  36. void SystemClock_Config(void);0 K, m6 e" e2 o7 i
  37. static void MX_GPIO_Init(void);$ S, r7 o2 E( T. |2 q
  38. static void MX_RTC_Init(void);& f# R5 X3 I  k6 Y6 n4 G! |
  39. static void MX_USART1_UART_Init(void);; T8 c: z* {2 [- X, @  i* R9 ]
  40. /* USER CODE BEGIN PFP */
    ) Z- x% z" A+ p5 s, K: u  [
  41. // fputc 函数重映射
    " S! P& W9 t& n! G
  42. #ifdef __GNUC_
      J: x- c  C& V$ q5 ?! J# M. i
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)) ~9 l* J! i2 m* T0 I7 u6 a+ J
  44. #else% \5 e2 _' A: c. Y- d5 U
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)- U" o6 J$ }8 i
  46. #endif
      e0 E  V0 b( j% v. K7 k( o4 ~7 F
  47. PUTCHAR_PROTOTYPE) ?! |" w2 Y" a1 i  R
  48. {
    ' D: U% ~" w4 w% ?- ^# |* ^
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);# Y- W8 H$ Y+ y% L$ Y- I" K

  50. 5 e6 F, ]( ]- n1 ~4 |
  51.     return ch;
    - x5 O( \4 b, t1 s
  52. }" W5 y( ~: h/ |! d4 }1 w: P
  53. /* USER CODE END PFP */
复制代码
2 R; z  J# Y  V
$ [8 N+ B3 n( u, b- S
RTC 初始化  S, s& V- X" G% m/ R0 I5 i( D6 k
  1. static void MX_RTC_Init(void)
    5 M# G* l) y, Z( V
  2. {
      ]4 r: L0 R1 h2 i4 y
  3. 5 O' |1 N9 C0 k3 Z" ?+ p/ ]
  4.   /* USER CODE BEGIN RTC_Init 0 */
    ) p# q; \9 y+ u% |3 A  A

  5. & `% [* N7 n/ M) @- _
  6.   /* USER CODE END RTC_Init 0 */
    ! y- b" {6 \! `" P3 }1 e
  7. 0 i3 z% V' e# F  e/ e
  8.   RTC_TimeTypeDef sTime = {0};# t( Q' a. U# P  S
  9.   RTC_DateTypeDef sDate = {0};
    ( o) D) m  c. t6 Z
  10.   RTC_AlarmTypeDef sAlarm = {0};8 B, X( S; P, x, W1 G# O& f' Y& ~

  11. & ]7 D0 X0 t0 F5 O. n/ H
  12.   /* USER CODE BEGIN RTC_Init 1 */
    & {+ i$ F% {* |7 T# C, p

  13. # H6 h, E! ^; j5 T
  14.   /* USER CODE END RTC_Init 1 */1 Z- Q+ l: c0 I$ _2 y& E
  15.   /** Initialize RTC Only8 F/ u/ M$ Q$ q& v, z  Y- M2 v9 A
  16.   */# Y7 z0 U1 |, q" \' j
  17.   hrtc.Instance = RTC;9 r* R; b$ c$ d6 f$ c' G2 A; ^
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    * C* w3 [+ v3 q% |; L% O0 J
  19.   hrtc.Init.AsynchPrediv = 127;0 h- v# D( x' B& u
  20.   hrtc.Init.SynchPrediv = 255;
    ; w0 n* W1 T, M! s/ v3 n. f* @( [
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    ( T: p/ T0 g2 g" W' c5 J0 _$ z
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    / ]0 N4 J" P+ k, A# `' o* b4 h
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;/ t3 z$ }1 c7 Q% u9 K
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;4 V; w# o( O: ?' V; r/ z
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    " S# U& @9 d- T8 I$ P3 ^
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)3 a/ ^: y* c. t) R/ h! d) |
  27.   {
    5 @0 x) X, ~( F0 Y; ^/ h' \
  28.     Error_Handler();
    / L1 f" ~3 z" J% G1 B' {
  29.   }
    " a0 m8 T* y: y3 Y
  30. " M2 b5 @  _5 j) S, Z
  31.   /* USER CODE BEGIN Check_RTC_BKUP */
    ' X3 R6 a' W) e' J# q  p' T
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿2 c5 g, Z& w! u( Z( J$ s
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)7 p/ K0 T" ^+ q; l* X( E1 i  R6 A
  34. //    {  R. l  A8 ~5 a0 F1 v5 J1 y! |$ {! g
  35. //        //已经初始化过了,直接跳出初始化函
    " z" _' ^6 v9 b' `0 s
  36. //        return;
    ! Y! d3 G' x1 V0 o5 g; l
  37. //    }
    : }& Q% Z: G2 @. t+ A
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿
    ( Y5 }8 N- }1 f
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    0 m( s3 l& U6 l$ Q2 d5 T' v* S
  40.   /* USER CODE END Check_RTC_BKUP */( O4 F4 Y& F+ Y$ n# ^2 u" t
  41. % P% n* v9 @: D
  42.   /** Initialize RTC and set the Time and Date
    1 H% @8 H* x; I
  43.   */* d0 e( L, i* L$ U$ J+ b) V: j) O
  44.   sTime.Hours = 14;, o1 u( a$ y: I3 }% ^
  45.   sTime.Minutes = 50;
    6 S4 S5 z6 g( c9 H+ Y
  46.   sTime.Seconds = 0;  j0 w! m2 A4 N" g4 m& ~' y
  47.   sTime.SubSeconds = 0;
    * U0 i6 G  R- S
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    / s& s8 Q7 M# x6 {7 c% g# V( c
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;- S. Q( T% n# B5 r& C, ^
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
    : w5 o1 l8 ], P/ z
  51.   {+ L% a& N( v: {" B  ~
  52.     Error_Handler();( `: Y* q3 ^5 x. J2 x: ]
  53.   }
    5 m' Z2 z/ y* q
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    # g5 ?, T$ x2 U
  55.   sDate.Month = RTC_MONTH_JANUARY;0 S* G  h! s& I; z8 p7 _
  56.   sDate.Date = 28;1 B: q  z( V4 D4 y/ D9 w* g3 D
  57.   sDate.Year = 21;
    + A0 o' y2 o/ ~# ]6 n2 Q# x
  58. 5 P8 l& {, G3 k0 `' j1 r
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    - m1 `  p) H4 S) e
  60.   {
    5 P8 f, q& p, ^) _
  61.     Error_Handler();9 r  A; m! t1 q$ Y+ J0 B% \
  62.   }
    , g1 N, u: e) m3 v. {8 W7 R# T
  63.   /** Enable the Alarm A
    8 n) X  e; n' A# j+ a' }
  64.   */
    - G' ^" U9 D8 |) A  [# l+ D; ~
  65.   sAlarm.AlarmTime.Hours = 14;4 x6 p, ?$ v8 K- {8 H" [
  66.   sAlarm.AlarmTime.Minutes = 50;
    1 j6 H% Z4 k( G. @& `, C: L7 }7 [8 T
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断% ?1 l2 v6 t5 ?* Q2 Z: Y- A/ v
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    # |" J4 s+ X* T6 J# w% _
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;. e& E. O1 ]7 `/ \/ |+ Q# c
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;! B2 ?6 Z  e# H7 {8 A7 a& c
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    0 ?# \! K4 D* ^& c3 o0 [9 m
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;4 {/ l; J5 \$ k6 B, u, {, b
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    . d- O3 G  ^0 \2 V) t- D
  74.   sAlarm.AlarmDateWeekDay = 28;
    % Q' s" Y0 D6 i7 \6 U* o8 g) }
  75.   sAlarm.Alarm = RTC_ALARM_A;
    / P; J3 N: `3 ]# ]: w8 ^' U; j
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)2 z( `, e( x6 s; \
  77.   {
    * a. @* b; M0 D0 ?
  78.     Error_Handler();( {  b* U9 f! M
  79.   }
    2 y, k( o+ y+ V
  80.   /* USER CODE BEGIN RTC_Init 2 */
    % _" ^, e1 a2 s% N+ {6 K7 r& y

  81. . H6 z0 T! A6 b, I! |
  82.   /* USER CODE END RTC_Init 2 */
    3 }) k5 C. e: k& Z8 k; C: \* _0 \
  83. 3 d: M: {0 e0 U
  84. }
复制代码
4 x  N& O" |) p' O" C. K# m
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
3 e+ S7 l& l9 ~8 r# [3 d3 |9 ~1 P/ a8 W( ^: w: a& a
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数& D7 J+ B' J. k& z! U. Y
  1. /* 设置闹钟下次产生的时间 */
    , |# k  l+ y; Q1 R
  2. void setalarm(int hours, int minutes, int seconds). j$ M; Z! F& p% {. h
  3. {
      v( N: W- _, M6 l- }+ m6 S3 K
  4.     RTC_AlarmTypeDef sAlarm = {0};0 J. d$ v0 u* \7 O# a7 J9 v
  5.     RTC_DateTypeDef sdate = {0};   
    ) B/ L$ ~$ @, H
  6.     RTC_TimeTypeDef stime = {0};
    ( I) Q5 W" v6 p5 v

  7. 5 Q3 C- E# g* _) ~9 _  l/ ~
  8.     //读取当前时间
    , V- ~; M4 k8 m2 v& w* ~
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
      W: v! d6 ]0 B
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);, Q. |9 q) ]: S' b7 K
  11.     //获取设置中断时的时间
    7 z% h0 B3 U; v7 V7 O; J3 g* I9 D
  12.     sAlarm.Alarm = RTC_ALARM_A;$ |, z  d, j7 ]# a9 O! L
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    ; P+ t2 ?  S* P: I' q0 a# ]3 `- y8 q
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;: r# C& _# F: G( h/ @4 Y$ T+ z
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
    # m, V; W' X: m+ [1 j7 W! n4 l1 B
  16.     if(sAlarm.AlarmTime.Seconds >= 60)6 P; k7 |1 ?3 l) y; l
  17.     {
    + M2 j$ W2 v0 ~
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;2 \1 c/ X' V  F) _9 \
  19.         sAlarm.AlarmTime.Minutes += 1;" E" o9 m+ d: Z4 e% N% F/ t
  20.         if(sAlarm.AlarmTime.Minutes >= 60)2 q: v3 t0 ]. G
  21.         {$ B# S* ^- p+ @/ P4 r
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    6 R7 w2 {9 o9 G
  23.             sAlarm.AlarmTime.Hours += 1;
    0 p& J; i5 @/ S" W+ c( w
  24.             if(sAlarm.AlarmTime.Hours >= 24)
    . y* h- p& e! K  r  x# n! G
  25.             {
    4 U9 r' ~1 J! T$ B& I: P% l
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    & p+ @& B0 c- r; i) h+ j
  27.                 sdate.Date += 1;% P1 k# W7 K3 ^4 u% L0 j
  28.             }
    7 R+ I  e6 p- w+ Z3 E0 n( I
  29.         }& E0 s$ {# q* d9 j% q5 e  {9 v& L
  30.     }0 Q" J. w) D! g! ^7 h2 b. r4 s  M) @
  31.     sAlarm.AlarmTime.SubSeconds = 0;
    $ @* T- Y& f. o0 `% W
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;& B) d! B( G, j  w- r2 h, R5 |2 d
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    * X" R% z" v: l& A
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    4 G, h& r# \6 g% c& b' V4 r
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    ( P( @! f) {, _7 B3 N. M2 g
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    8 f" j! A0 A( V2 K8 h3 Q5 ]
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    + {4 R: _5 B% d2 K; w
  38. 9 y+ D+ q0 z, ^5 o: ~0 m
  39. ( W, M# f, I; {0 O9 d
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    - ^: _8 q% d$ U' H
  41.     {
    8 I8 p0 m3 }' C) O
  42.         Error_Handler();
      z, d* Q! n: q
  43.     }
    2 l( v9 ], G% L  B  J3 h
  44. }- p7 M% j. i1 k
  45. % `0 t9 _8 @7 z0 q; F
  46. /**
    $ {: p7 d  z- Q+ J- L* l& P! @
  47.   * @brief  Alarm callback 闹钟中断回调函数
    1 ~+ k- [$ j- Q+ p  s& T, J( {6 C
  48.   * @param  hrtc : RTC handle
    0 _; J( y/ M/ l/ Z' V
  49.   * @retval None6 U1 K4 Z3 D7 M7 @1 P, Z& ]/ h
  50.   */
    ) h8 f1 ]9 b, u4 S
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)5 @& K0 G: C7 H
  52. {) y0 l9 T2 ~$ H: \9 M
  53.     static uint16_t sEnterCnt = 0;
    7 g1 L" B4 x% y+ R3 D

  54. * V2 k6 x2 P4 D  a' y9 i
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断9 @" ?- B* }: i3 [+ O; I
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);( F: B$ e8 \1 L: F$ \9 m
  57. }
复制代码
0 u& u* |- D" N  w; v0 Q) r$ R
main 函数+ ~0 X( h4 ]/ Z: B
  1. /**. w% ~% R% E4 e2 y+ w
  2.   * @brief  The application entry point.5 t) v) ?8 K( j: J
  3.   * @retval int' F4 m) L7 X7 I" P1 x* D0 D1 o
  4.   */
    : z) @( W" U; Y- j6 J; a
  5. int main(void)
    9 p* K1 v6 z% I
  6. {
    2 j1 M2 u0 T* l* N2 g3 `% G' D/ ^
  7.   /* USER CODE BEGIN 1 */9 W. s, Z8 w! w( _% a

  8. 3 \4 N, v8 P7 t, K! c" z# {5 x
  9.   /* USER CODE END 1 */
    / U7 N8 X5 Y. u& K  \6 n
  10. # J' [. \1 _! [# u8 k/ X/ `0 u. n9 J
  11.   /* MCU Configuration--------------------------------------------------------*/( C/ N; k4 R4 |3 z2 }9 |3 M
  12. 8 C) Q0 j1 |5 d$ t( T) E* o
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */7 y! ~$ Q8 R# }& _* A+ Y  I
  14.   HAL_Init();8 c' f+ f% c7 d( n0 k+ g
  15. 0 G3 _2 T( Q1 g' D6 b
  16.   /* USER CODE BEGIN Init */0 l1 p1 n9 O) L* ~) }
  17. 0 v  N4 Q: a+ C# l
  18.   /* USER CODE END Init */2 [0 k/ x3 L: O* p
  19. # R# E7 k2 t+ j1 s( @) h
  20.   /* Configure the system clock */
    / P/ ?9 [1 }9 U( k- J  I
  21.   SystemClock_Config();
    3 S/ I8 {0 o* M3 v5 N/ n9 o

  22.   X4 u% ~, }. D/ R) C8 G
  23.   /* USER CODE BEGIN SysInit */9 K  C& R$ s6 b! n- W

  24. ) L: \  I- j" B, V9 ]: T, @. M/ u
  25.   /* USER CODE END SysInit */7 E4 p0 G' m+ i9 E/ a
  26. " r5 s! e6 M8 \. _! U
  27.   /* Initialize all configured peripherals */3 |( o4 _: q- |0 G+ ]
  28.   MX_GPIO_Init();& n" m# M: B; b2 v% {
  29.   MX_RTC_Init();8 N0 C; g, [" g2 E/ j
  30.   MX_USART1_UART_Init();
    ) n$ A. P) @5 `: M2 K
  31.   /* USER CODE BEGIN 2 */+ a/ p( e( C0 L9 `7 t
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");0 _3 x  u. K- m2 b" ?- R% R
  33.   RTCStatus = 0x01;9 E/ H" ~. O- r0 `* n% H
  34.   /* USER CODE END 2 */
    ; o& m" A5 R; w: d: g% l
  35. & x5 T) {! I0 `) A: O" ?' L- j
  36.   /* Infinite loop */
    + q$ U4 E3 ?  t4 |4 u& N$ B
  37.   /* USER CODE BEGIN WHILE */2 K$ {6 X" K7 j+ }
  38.     while(1)
      z/ a/ h8 G6 M5 {$ p/ x. A6 d
  39.     {/ G7 }- ?0 k- W7 H1 G/ w/ K! m" V& @
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);. a0 }( ~) R4 S$ Q6 N/ Y" k4 X
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    4 g) W/ F6 Z# f: b( u" T" U* D
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);' t+ J- q' H6 R
  43.         HAL_Delay(1000);
    + ~2 ^, Y$ ^5 K) t4 L+ Y& H- }
  44.     /* USER CODE END WHILE */
    2 [0 F7 _2 k! j( w4 i% {

  45.   ~2 F2 B& ^6 s5 ~, c1 D- @( v* o
  46.     /* USER CODE BEGIN 3 */: ^7 j, ?. N( K% D* L
  47.     }
    * m) p5 i; [2 {* {
  48.   /* USER CODE END 3 */
    - k5 y* Y2 U( V
  49. }
复制代码

/ Y/ ?# E6 u$ o. E主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
, B3 j6 m1 N# C; X
8 C" I% r2 U8 O& D; g3. 编译并下载测试
" w3 n0 Y$ `8 ?将程序下载到开发板中,连接串口助手并打开;  R6 m; [- u1 O+ C8 y+ p
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.' j2 B7 g# _# T
/ f$ i: K+ w8 [5 v
20210128175241625.png

* t" F; f" X- ^4 [/ [& p; `: G% k$ q3 U6 n+ n) B8 D) p
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版