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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
  a3 o$ b4 }* P& \& F) \打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject./ H& d+ y6 W# L! `+ v

2 J  L5 }3 Z. U先配置一下串口,用来打印相关信息
9 p5 w* G, K( A% S
' U* ?, d$ [( q& X- y1 v8 h
20210128091458888.png

& S  D' B2 }: \; w
4 ], V4 N2 e( c; I1 p/ O. h再来配置 RTC
! Q9 s# R  e; v* x2 y
& G( `4 G& X0 S/ i) P
20210128170709886.png

, n0 a5 s7 w3 Y5 G9 M# T6 }0 Q) ^+ Y
20210128170837705.png
! M2 }, F! o; \& ~
9 l0 ^) f1 U. D/ c# {2 c
配置时钟
2 k' ?7 d* M' P8 [. |' Y. w& o4 V
, f) x( P, G7 [5 @9 ^
20210128171003870.png

# i$ W" ]& a+ d& B, ^( V: H* D5 C9 f1 y% J, O
ps:本实验使用内部低速时钟测试,未使用外部晶振.
( {# o$ Q2 e( D2 ?. P) z
( u" `( l9 \) j. \8 i配置工程相关选项
' N, p: v( I' B' p
+ O0 S$ W7 w9 Y( g+ }
20210128171144837.png
' H2 E/ _2 ?$ @( a' X" a2 N- @- W7 h
: Q  }9 L, [0 y
配置完成后点击右上角 GENERATE CODE完成工程的创建
# U( b) V$ A; C! L8 c' c
" ~, q/ C4 C8 d/ i- z: T2. 编程
4 e4 i- _3 g' \2 @$ c0 \. E2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
; o- p; n( h" k# g! D+ p7 B" _6 V
  1. /*设置系统时间*/
    ) g. n  X1 C4 f7 d( |+ r$ x5 i2 ^' C
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) 9 O( p' [/ y$ ~* T% |  ~
  3. /*读取系统时间*/1 i4 Y8 m' W+ b, }+ W
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    6 q- C4 P% O/ C/ y/ r- I% g
  5. /*设置系统日期*/
    ' k8 z1 E( ]$ W$ t& x6 \  {
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    ; S. o" k) u$ @; t1 o
  7. /*读取系统日期*/6 D" D) l, {7 G1 x! x
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)' k4 Q" {6 t# c. ^
  9. /*启动报警功能*/
    & C: `# ]* v0 [+ a. C
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)3 z% ?& Q3 ~; R- i3 L
  11. /*设置报警中断*/
    , s. p8 H1 I9 R
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    4 v! i5 T& ?- u( [6 z3 e" w# t7 V
  13. /*报警时间回调函数*/
    / Z& F/ u; [0 o; X$ N! `
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)2 s3 |+ M6 l4 W
  15. /*写入后备储存器*/: V, r3 T& }0 ~9 T5 k7 `
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data): o8 T# T" H% @4 z: _. Q' q7 Z
  17. /*读取后备储存器*/
    ' K7 [5 f* g; o5 L( \! D! O# H
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码

" [+ r  {4 I: s) K8 a2.2 串口相关的代码' P' Q$ K4 K+ Q2 X' J( Z8 t4 r0 z* g
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数5 C) k7 {8 @& }0 ]/ `' x
  1. /* Includes ------------------------------------------------------------------*/" ~: M/ |- b0 L7 _$ R9 M' \
  2. #include "main.h"! j0 W) E& R6 v. [$ W, J; c: D

  3. % L/ S  S. Q$ h
  4. /* Private includes ----------------------------------------------------------*// X! K% R" V# j6 A. k' M- P. D5 W6 C
  5. /* USER CODE BEGIN Includes */
    2 u) U% g5 `( Y, [9 {7 D+ T1 e1 I
  6. #include "stdio.h"; N$ d. w. Q- a. d7 U2 L3 ]( l
  7. /* USER CODE END Includes */
    2 q4 f! o3 k7 q( r. C
  8. ! o6 j5 E$ D/ M5 C$ D9 Y* Z* H) |+ ?' o
  9. /* Private typedef -----------------------------------------------------------*/  Q7 B/ K0 n# [1 P3 j
  10. /* USER CODE BEGIN PTD */
    - Q! [, L! u2 G0 L6 _
  11. 9 ~8 y0 n- D2 L' [  |" F
  12. /* USER CODE END PTD */
    1 b7 @  t: X2 P; g& h
  13. ; i$ v/ y) C( ~. ?) B8 M' R
  14. /* Private define ------------------------------------------------------------*/
    5 f0 E; Q8 ?1 c; r
  15. /* USER CODE BEGIN PD *// I- E. P+ r3 ]. L. v7 m
  16. /* USER CODE END PD */
    6 N' `( [% N. W5 c: a' m
  17. 9 p5 y9 t( o) P7 a/ h
  18. /* Private macro -------------------------------------------------------------*/( H4 L# m  P. Y* b
  19. /* USER CODE BEGIN PM */- f/ j& t1 z& a1 C( h
  20. 2 x$ R! [; R0 ]" b  e
  21. /* USER CODE END PM */
    * K4 W0 I6 u' s4 T
  22. 8 [: Y; m# {$ A& Y, x0 Q! I* l# G
  23. /* Private variables ---------------------------------------------------------*/- ~( J$ I) y9 w
  24. RTC_HandleTypeDef hrtc;4 O- ~3 Z! x9 `. @3 Z) j
  25. 9 g) |, B$ N8 o8 b" O- w. n
  26. UART_HandleTypeDef huart1;
    6 a) D. q/ Q8 ^3 A$ P4 n

  27. 6 w4 D1 `& d* u$ C' @! g! r' e0 o
  28. /* USER CODE BEGIN PV */( ?8 M1 B( F: }( y
  29. RTC_DateTypeDef date;        //读取日期
    5 H1 U" \) f: v! u& B, P# c& U
  30. RTC_TimeTypeDef time;        //读取时间
    0 l) |2 s& I; n2 g1 V3 x; |; b
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    6 r# }% f0 a  T# h. y7 p- ~. m! |
  32. ! d% @* ~1 Y1 v! A1 p" J( h; F1 w
  33. /* USER CODE END PV */- }. b8 f( b& A* d  V

  34.   u0 a& S* W$ y  L
  35. /* Private function prototypes -----------------------------------------------*/
    9 U/ h4 X5 _9 s* e8 F! W) ?
  36. void SystemClock_Config(void);  {" S! E1 ~8 C. \5 r( ^
  37. static void MX_GPIO_Init(void);% A4 L4 l5 C1 u1 c6 V
  38. static void MX_RTC_Init(void);! w7 U1 h4 {) d/ c, C
  39. static void MX_USART1_UART_Init(void);
    ) o3 a- s- F% c$ U, c& h  B
  40. /* USER CODE BEGIN PFP */0 x+ d. X# H$ Y" Y* X/ f' y" S
  41. // fputc 函数重映射& G# D" e7 ]( }8 s3 p3 l) g( v
  42. #ifdef __GNUC_
    : a& b4 @( I5 B& v, Y' V
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    / }* j6 k) J; {7 P8 a! P
  44. #else
    / Z  N" u7 {& ?# C1 M8 n+ s
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    % s1 m, M) u* a$ y2 V
  46. #endif) {# z+ s" `) H5 V, N, S% Y! ~
  47. PUTCHAR_PROTOTYPE
    . y/ K% c% x! |. O& x
  48. {  _! H8 I2 _  o( S
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);9 [( L6 S9 x/ T* I; f( U
  50. * w% u' ^; _" S- [. _! l  ?
  51.     return ch;# v7 H% w+ j: w: B8 S! t/ p
  52. }1 M/ E* F/ V, t! B0 g  P2 w
  53. /* USER CODE END PFP */
复制代码

  U6 B" k* Q1 F: I# ~! o- a! ^" }7 @6 B% w6 H$ g! w8 I, E
RTC 初始化
9 e" y4 |3 `5 u) Z
  1. static void MX_RTC_Init(void)* H3 Q/ e" g! s
  2. {
    / w  ?! d' R/ o8 ]9 k& u# ^

  3. & ~8 ]- d( \2 `5 ~0 a0 l, L
  4.   /* USER CODE BEGIN RTC_Init 0 */- k+ a/ H* w2 ]3 F4 Y

  5. + e5 {. h/ @$ d# L+ g1 x+ }/ E/ E
  6.   /* USER CODE END RTC_Init 0 */
    % r* |' P* _- D

  7. ) w, g7 P) Z* y+ s0 u' S8 c
  8.   RTC_TimeTypeDef sTime = {0};
    " }* V+ y- c! T" g+ y5 _
  9.   RTC_DateTypeDef sDate = {0};
    6 Q4 r/ `4 N; B+ W8 v; E
  10.   RTC_AlarmTypeDef sAlarm = {0};
    ) `8 V( ]! w- @0 H

  11. 1 v3 {% V- ~1 R" m( J
  12.   /* USER CODE BEGIN RTC_Init 1 */% M9 y. t/ d0 c& P: w6 _# P
  13. 6 a9 V7 Q# R$ ?$ [7 ~3 U7 U
  14.   /* USER CODE END RTC_Init 1 */- Y8 s1 ]; |# r, H) y4 D
  15.   /** Initialize RTC Only
    . N$ c1 g7 I( u( P( v. |* n& q* r2 d& P
  16.   */
    * ^9 o: f; F$ h
  17.   hrtc.Instance = RTC;
    5 F' J  x& i6 o- i2 A
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;$ V9 K4 U2 z% Q6 \
  19.   hrtc.Init.AsynchPrediv = 127;" t" }0 `0 L7 b9 T4 H( g. B/ c1 A
  20.   hrtc.Init.SynchPrediv = 255;! w, H$ s- g  Y" j" Y6 n
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    $ Y. z% Y* I! O  I1 Z9 k" s
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    * ?8 t( }! _8 u% `3 X2 q! [& H
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
      S2 w# O/ p. k  z% ~6 m! k
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    8 q- W, p- a! ~, s2 m  T6 S
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    : ?: Y/ V3 V2 l2 J8 [5 o
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)" n9 ^  k% P2 W. Y
  27.   {
    8 ~/ K4 c% k7 B7 R* D; M
  28.     Error_Handler();; T( d" b' i$ V5 D$ ~
  29.   }7 D$ G/ z/ H8 z7 u' ?) T* U5 @
  30. ; Q- z% i. N; t, }  J+ V' C0 \
  31.   /* USER CODE BEGIN Check_RTC_BKUP */
    ) s/ D3 r) Z- n  O. N0 X" B
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
    5 T3 F+ ?2 h" B+ o  m
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)
    ( V7 c/ C  q; B; K3 ^$ @
  34. //    {3 b* Z/ i6 g- h
  35. //        //已经初始化过了,直接跳出初始化函
    $ w; J$ {% e( d; j/ d9 n+ e/ L
  36. //        return;
    - m6 a$ N* {2 ?4 U  S% i; L
  37. //    }  Q: s1 ]2 I3 U4 e' t
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿! S! p& ~5 d- J" O; D
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    & i! i8 A" `. [' O; f0 C
  40.   /* USER CODE END Check_RTC_BKUP */6 D& s, l% Q# N( L3 G& T7 E* U- @$ Q

  41. ' I! |( q1 z" j' {' O# E
  42.   /** Initialize RTC and set the Time and Date1 b5 [; c- k  l5 _
  43.   */
    0 R( g0 l6 u6 C* j) k
  44.   sTime.Hours = 14;
    & g8 Z9 [( d$ F9 i* N) ^) {
  45.   sTime.Minutes = 50;
      e3 [7 t- j9 H
  46.   sTime.Seconds = 0;
    ; c3 O8 o+ ?* k# H- a
  47.   sTime.SubSeconds = 0;
    $ l! D% w9 z( C+ p
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;7 U8 u1 E: m1 T
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    * G8 I( u( a4 f+ Q" S8 I
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
      J" N, m$ i! S; {  C, C! W
  51.   {6 D! c& }- j0 f( N7 A( b  n- U) ]
  52.     Error_Handler();
    9 B$ Q, z/ {; ?% ^* t# r4 B1 n) X2 ~
  53.   }5 c& Z2 y  o" X4 ^% ?. H/ i) G4 A
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;1 h5 U  \5 i& p. n& ~  |- ^# a" D: e
  55.   sDate.Month = RTC_MONTH_JANUARY;
    ' M9 {: {% G1 `( b: [
  56.   sDate.Date = 28;
    - I7 R) P1 @* o# x* `& @' o
  57.   sDate.Year = 21;0 |# \. T$ O5 S0 o( f$ X/ \% _

  58. 0 s  g3 q( z$ `0 {2 y$ D
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)6 O2 X9 C/ ?6 t# `( b; A
  60.   {# c3 e' V# K  p0 l6 n
  61.     Error_Handler();3 U3 k* j% ?# f5 ^5 h
  62.   }
    # p  i' e, C4 t3 B% s
  63.   /** Enable the Alarm A
    9 ~- E# [1 F2 R# C. P4 n1 ~' _
  64.   */6 t' k, Q0 w- O1 ~, ~; ^/ k0 X
  65.   sAlarm.AlarmTime.Hours = 14;
    & v" E4 b8 R( c7 g7 v/ s- S
  66.   sAlarm.AlarmTime.Minutes = 50;' h" N- Y9 s) R1 _$ \) E
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断. i$ |4 d% R7 G; c. r8 x( [2 S( n
  68.   sAlarm.AlarmTime.SubSeconds = 0;' j4 \# B' h& A2 i: @
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ) Y3 c$ D8 D0 p7 @" k- @4 r8 ^
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;4 ^, ]- q1 L% B
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;! P3 o6 B, T$ c9 ?- W
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    1 I# u5 z, G3 l
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;+ J2 w/ u& k3 v$ d
  74.   sAlarm.AlarmDateWeekDay = 28;
    , W- C8 X1 B6 z. W7 z: |
  75.   sAlarm.Alarm = RTC_ALARM_A;3 f2 E/ T" e4 a" s2 g$ |9 M# r
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)! u. J: C7 N4 Z! k! u9 P
  77.   {
    ; P6 O$ q: `! t4 ?7 s5 C
  78.     Error_Handler();
    % G' O. S, T8 I% u
  79.   }( _* o0 y$ N/ d, T* G. Q2 {
  80.   /* USER CODE BEGIN RTC_Init 2 */* X' d5 m+ i: c

  81. ; ^7 E* P7 _1 [1 b/ {
  82.   /* USER CODE END RTC_Init 2 */& s' T* P, H6 q) c. e0 C% U
  83. * U* D, L3 Y7 h# P' M2 D: j* W4 W  R
  84. }
复制代码

: p4 m9 k) r3 g2 S此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生." _, R2 ^2 j8 ^+ M# i; t
3 ]( g! I# g( p: }7 Z+ c; v9 O
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
8 c1 n7 n0 v# h' L
  1. /* 设置闹钟下次产生的时间 */
    % p  N/ J5 l/ Y6 Y2 y/ |8 O9 U% G8 N( h
  2. void setalarm(int hours, int minutes, int seconds)1 W* m4 U* ^. q0 j- T" W0 L3 e2 E
  3. {
    ! R5 o1 h  Q/ U% `9 O
  4.     RTC_AlarmTypeDef sAlarm = {0};% X' C- O3 |  f. {& s* ~
  5.     RTC_DateTypeDef sdate = {0};   
    1 y. ?8 n4 }8 E5 K" ^, i- Y( ]9 Q
  6.     RTC_TimeTypeDef stime = {0};
    0 Z/ k  \$ C1 s1 A& L# L

  7. : r/ B8 [# O2 a- T! ^- Y& M
  8.     //读取当前时间 % I+ J. C* K' _% X* H9 E/ z  U, w( `7 m
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); * x$ E+ B. m) l9 w- d
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);0 [6 f  [, W0 J- R* r! @  l
  11.     //获取设置中断时的时间
    ( Z6 Y  x' M9 y6 P$ b5 r; ]
  12.     sAlarm.Alarm = RTC_ALARM_A;
    : Z# ?* V1 ]$ g9 F# g& D3 T
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;" f3 b( f' z' x& Y6 ^1 ]1 p
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
    8 d  }1 f2 z+ P# j/ R( B3 x7 f
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;' c, g+ C2 ~; ~8 `
  16.     if(sAlarm.AlarmTime.Seconds >= 60)
    7 I  [( v# A8 d' u
  17.     {
    % z1 C" D5 k, F1 x, D& E
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;8 D9 ?5 r+ ~4 X# {
  19.         sAlarm.AlarmTime.Minutes += 1;; a1 I8 v1 {/ w1 |* u
  20.         if(sAlarm.AlarmTime.Minutes >= 60)) ?; w$ W8 y& e1 U
  21.         {8 [% N+ a" [+ Q0 L: j" r) P0 G
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;( k) C1 p# T; |, U0 J. ^
  23.             sAlarm.AlarmTime.Hours += 1;
    ' O% {0 q6 M/ ~4 V. b. w: w/ h' U
  24.             if(sAlarm.AlarmTime.Hours >= 24)* t0 w9 L2 O% L( K# D
  25.             {% Y$ g; ~! p/ Q, a0 A- F0 W
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    1 R5 c7 F1 E5 Q3 i/ ~# S; _( [
  27.                 sdate.Date += 1;
    ; [1 Y, I% H/ Q  M* W' s
  28.             }1 R) a  Y" a8 K/ L2 m& I
  29.         }
    / u" F0 p- E: f! Q0 b# X
  30.     }9 x4 w- W* ^8 H* ?! s7 V
  31.     sAlarm.AlarmTime.SubSeconds = 0;+ O6 s* z/ z2 F. T, F( ^" D
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;$ C/ h3 p1 U) W9 u
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;: f$ n9 W3 Z  Z; F( y+ G3 e
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    3 Q0 q* |- g4 s! s9 I+ h" v, L
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;9 L6 m2 b) \0 d
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    3 _* q7 p( M" ~  S! W+ d5 C
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意  J) S1 _; Z+ j6 M7 k1 }  {# L4 j

  38. * e  i; e" h& {/ J. Q7 f
  39. 4 l1 J" D4 s$ e5 @7 x6 K8 u: P
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    $ i2 h) a- v. Q; _% ]  [
  41.     {
    7 ?1 A3 Y) {: A* d% c
  42.         Error_Handler();
    3 M9 Q7 v# D& U: C5 \
  43.     }
    ' K  d% S. `( c; m# a
  44. }
    ; b3 |" ~- P5 ~5 `
  45. $ W/ {, t, r- R- V4 E# N! R
  46. /**
    8 z- o& c3 S2 {; v
  47.   * @brief  Alarm callback 闹钟中断回调函数' m2 v$ V4 @0 y5 F* \7 t" Z" x; P; o; v
  48.   * @param  hrtc : RTC handle
    1 f7 U( W/ k7 Y2 Q$ P& g
  49.   * @retval None
    ( x& ]2 O0 U6 M3 l7 w4 i
  50.   */
    $ ], A, f& s  z! q* }$ d
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)) G* W3 L  }0 N8 x8 p" o9 ^: v
  52. {8 E* z9 [7 `$ L$ o
  53.     static uint16_t sEnterCnt = 0;
    / p/ S/ K1 w1 ^7 |/ ^0 {# T( ]

  54. 7 A% c! q  [! \+ X
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断; b) a9 r6 M# T3 a" @1 x
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);2 m0 b* r  r  C1 a" E' A# r, @
  57. }
复制代码

6 G* X' L9 b: h3 G$ W0 Ymain 函数$ g* t* \5 d' x" U$ k# u
  1. /**. L4 J! J3 v) M. b
  2.   * @brief  The application entry point.
    : q0 R  j5 Y% p5 p) T! F# \* D
  3.   * @retval int9 e* I# Z4 h% H3 @0 d
  4.   */  ?+ ~! l0 V# \3 A! x: A: ?9 Q
  5. int main(void)
    / D. @! ^& D2 O) ?* y
  6. {3 k. L3 }2 A- g: b+ X; g
  7.   /* USER CODE BEGIN 1 */
    & N. l+ X/ c: D, Y7 _1 y) [. g
  8. ; {# f% f. `; g, o2 C
  9.   /* USER CODE END 1 */# ^% D; _' m* j/ O

  10.   u( y9 K0 b  ]" \; V, }! i' o
  11.   /* MCU Configuration--------------------------------------------------------*/
    6 k3 }% E0 w; Q* d. u, E
  12. 5 e' B0 g. \( B
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    5 k0 v4 t. a. ?! a
  14.   HAL_Init();  u, K3 ~0 N0 H
  15. : U1 J, W4 b) U( b& d/ ~9 l' E/ }( K+ F
  16.   /* USER CODE BEGIN Init */  d' h* O2 D+ R# d& ]5 m  R/ M
  17. ; K9 J7 U6 i3 z& e4 v/ i
  18.   /* USER CODE END Init */3 h: U. }; Y4 G! r5 @. R+ Q

  19. 4 Z4 ^1 |9 Z+ ^
  20.   /* Configure the system clock */
    1 N3 @9 d7 F& i3 h0 ?( }
  21.   SystemClock_Config();, h; z- o. ^1 \$ `& ~

  22. : }3 w& k+ N) K. y- j% P, I
  23.   /* USER CODE BEGIN SysInit */
    ' f7 Y* _! X2 I- a# ?* T4 U8 P
  24. 1 P! W, @# n7 o8 D" T
  25.   /* USER CODE END SysInit */- }  t7 g) k3 J( E3 E

  26. 9 w  `% ?, P5 \: F+ O8 A& Y
  27.   /* Initialize all configured peripherals */" G& t' h5 @  k, }' f1 T" s
  28.   MX_GPIO_Init();% L: H) `- B1 S
  29.   MX_RTC_Init();
    ! `, V5 M2 e: u; R
  30.   MX_USART1_UART_Init();- n$ X% q5 m$ ^2 C9 a2 a
  31.   /* USER CODE BEGIN 2 */
    : E# W* u" _$ H5 p" n
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");, ?1 |4 a) A) S$ [, W  j
  33.   RTCStatus = 0x01;* y1 v+ u! ]' B" G) T2 n  C
  34.   /* USER CODE END 2 */
    # x% `+ ^" m! z

  35. 1 B' e% f4 `' S1 O* ?1 m
  36.   /* Infinite loop */
    - a& Q" O9 s- a0 I# n( f4 K  \% T
  37.   /* USER CODE BEGIN WHILE */# }& E, ?+ N% w" x- A, l
  38.     while(1)7 e- E2 A5 a8 ~% f/ C0 m
  39.     {6 g6 Z1 M& m7 o4 F6 @/ k' V
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    1 _# C, m7 B) H; z$ e  B3 Z
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);: Q. Z1 h0 b8 F/ n% i" Z2 C- \& B
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
    ) H0 E" G3 F5 i  |& \: f
  43.         HAL_Delay(1000);
    ( H( O) x5 R9 Z
  44.     /* USER CODE END WHILE */
    & _% N; Q% b* }' t& ?- r- a) a6 x& c

  45. 9 @* F, G* h- L  b( ^- {( N
  46.     /* USER CODE BEGIN 3 */
    9 {6 ]$ v9 N; D, E) H
  47.     }
    6 z+ g4 ~* \1 e% ?7 D
  48.   /* USER CODE END 3 */
    1 E) U3 ^. Q  @" F) j  g
  49. }
复制代码

" V) @3 T# a! M( h主函数中每隔 1s 读取一次实时日期和时间,并打印出来./ M: z, e# n+ c# e1 ?
& k: x" R: L2 u6 A, V1 C% C, p9 ]
3. 编译并下载测试
2 V$ X! W8 O  C* P/ O4 f+ l将程序下载到开发板中,连接串口助手并打开;
8 z+ E* C5 O. Q4 g- p8 H/ q实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.- O4 S! m7 X- K/ b! t

2 m* d9 M+ e, j+ ~
20210128175241625.png

7 b8 n/ k' B* B  U$ l! y9 i+ H( r+ d$ ~" y- w+ d
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

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