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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
$ l/ o0 F( x" {4 T打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
' M; b- D3 W5 L1 z' X( U7 n* D# @  b1 W
先配置一下串口,用来打印相关信息
# g3 B/ |8 q0 d0 K5 V) y
+ y# w- w/ Z; s, x  S% n1 c
20210128091458888.png
7 E7 h) f. r2 F6 |  o, f  ?7 D
+ L* C) d; X  W' O5 e8 J* C, p
再来配置 RTC
9 \4 V# a1 E' [! }0 Q
: E2 s! u  }# e% C1 U
20210128170709886.png
- W$ L/ s6 I' k9 C/ R
+ n2 _: D. T, `: A) m
20210128170837705.png
& o3 ~2 @6 z. C1 c  @) S

4 ^( o; [% B/ B3 S5 S配置时钟
7 S, y: f# h: ]; R# e/ k9 ]6 x
; S1 y, U. a" p- l4 t1 U) y! R, J
20210128171003870.png
  v* g: G6 a6 j5 [6 t) x8 p7 T$ a  E

4 y3 g, a: V8 x3 b3 w& ops:本实验使用内部低速时钟测试,未使用外部晶振.+ y5 H+ m7 @. S' \5 S% n
6 y+ \# f/ w$ V' E! s" d# I3 ]  e/ F
配置工程相关选项& ]2 }4 Z% \9 \5 I4 Y+ X9 R
6 o( T  w$ S, Y7 G
20210128171144837.png

+ M& X% m% L8 k) D9 d: f" Z1 g% a& y( a  p% u
配置完成后点击右上角 GENERATE CODE完成工程的创建$ u  B9 q% P+ ]: G7 X

$ E- S/ Y6 Z; N: m2. 编程
! p0 W7 l2 C1 x& V2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口: T4 v. O$ e' M6 E; w) u, I: h  b0 b
  1. /*设置系统时间*/3 V( ]$ B! |/ A- @' \9 w
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) 7 F. \- g* M5 ?0 t/ {% C
  3. /*读取系统时间*/
    4 E, a9 V! Q2 f+ D% ^- ~! O
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    2 Z6 b; ~3 _( E' u3 M8 E$ h
  5. /*设置系统日期*/4 V) T$ k) S9 V! W% I) d
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)9 p6 x7 M0 W3 @
  7. /*读取系统日期*/
    ) s6 r# v; ?- B$ \  y3 _
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 {; Q* R2 ?% l# R! H% f3 y: b
  9. /*启动报警功能*/
    2 O$ D/ _; x3 r( M
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)& a! j3 q! }  E' f3 I- [
  11. /*设置报警中断*/
    - ]' q- Q4 l* E* O, {
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)4 q3 w, p5 X$ I
  13. /*报警时间回调函数*/+ ^( _5 ?6 V& S
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    % }, s+ a# x; |& l0 O( n, g+ D4 F6 |
  15. /*写入后备储存器*/0 Z. x2 C1 D8 d- @
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
    - B; b2 L- d! _
  17. /*读取后备储存器*/
    1 u4 E, s5 C1 `" N8 ~
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
  X/ w. a+ ~" V( m  q8 r
2.2 串口相关的代码
1 X4 D8 ]$ v. W3 s/ K* l3 h因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
+ g& R' Y7 O* @+ [4 F, Q# U9 g+ h
  1. /* Includes ------------------------------------------------------------------*/
      u& ]8 t7 W4 ]7 S( R1 j+ y" X
  2. #include "main.h"
      C% w" q* N" ]

  3. ! q2 k: W; \- K' h4 f
  4. /* Private includes ----------------------------------------------------------*/
    1 W' M2 m; I- H5 ^/ e
  5. /* USER CODE BEGIN Includes */
    : `( g$ x. \. }, ]0 T
  6. #include "stdio.h": h; b! a; D1 o
  7. /* USER CODE END Includes */
    ' W$ o# U9 N1 [; q3 L3 i% ]. f1 m

  8. ; c4 r" O" K8 q* R, T
  9. /* Private typedef -----------------------------------------------------------*/
    : Y* n. j3 h* K, @8 r3 n) Y5 t
  10. /* USER CODE BEGIN PTD */) w5 N4 ~, j% v( f

  11. . W) U% C! |# a3 P, |; B- m
  12. /* USER CODE END PTD */# x5 M+ r. ?4 m$ n1 \  V+ w. E1 ^. ]2 J; s

  13. , q. I; m. ?0 o( ]
  14. /* Private define ------------------------------------------------------------*/6 w' s" D; Q7 o! S  V* l
  15. /* USER CODE BEGIN PD */, @- B; c6 p) `3 k- S
  16. /* USER CODE END PD */8 ~) y4 F1 t1 V* w9 p/ g, }' Z; G3 ]
  17. , Z8 O7 Q" M( I0 e  O
  18. /* Private macro -------------------------------------------------------------*/4 @% y) Q4 V3 e9 K6 \
  19. /* USER CODE BEGIN PM */
    + T0 R: _8 V, N6 r; W+ M

  20. 5 F0 Z, j9 P! b  p# q" f9 ^4 S
  21. /* USER CODE END PM */
    7 B$ h) j- p/ z) J! l* q6 i
  22. . ~( p! k* ~& W* m! k, {
  23. /* Private variables ---------------------------------------------------------*/7 A, j4 q+ k; Z: \- E
  24. RTC_HandleTypeDef hrtc;
    % e9 E. V5 n3 I7 z" I9 L" m

  25. ! Z6 z; V+ ~; S. n/ C, g1 L( l
  26. UART_HandleTypeDef huart1;9 W% V( }6 W: t% ]4 ~% o
  27. ( E4 v$ j) E! K( ^) g9 o
  28. /* USER CODE BEGIN PV */
    ! N9 ~6 C! K3 d' J
  29. RTC_DateTypeDef date;        //读取日期
    : h- }7 s4 l5 \% @
  30. RTC_TimeTypeDef time;        //读取时间
    " c$ @: x6 D7 J3 C1 h% M1 Z
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    3 O+ Q: X, v5 \8 O% b/ y

  32. 1 s# r5 L/ r! f
  33. /* USER CODE END PV */2 @; C6 \' y8 Z2 ~: C

  34. : u0 V4 V  L9 `6 ]3 C- D8 _
  35. /* Private function prototypes -----------------------------------------------*/6 B3 f6 o) A/ e9 H& S' ?+ d
  36. void SystemClock_Config(void);# T0 l0 U: G) H1 j0 R
  37. static void MX_GPIO_Init(void);
    ) w7 }$ l' [3 i5 M6 I7 e
  38. static void MX_RTC_Init(void);
    2 q6 q1 \$ A4 F/ p
  39. static void MX_USART1_UART_Init(void);3 z( K$ Z# l7 h. D
  40. /* USER CODE BEGIN PFP */$ `! I6 f- |9 ~3 e2 d0 K. L
  41. // fputc 函数重映射
    ; W: L* L2 Z$ {# Z( G' h1 x
  42. #ifdef __GNUC_% O, ]! A$ J/ d! H
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    ! b2 V, h9 b$ H! v
  44. #else9 {. ^! A0 R7 D( K5 u
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)1 U7 D! [# D8 z9 P3 `  L) p
  46. #endif
    0 s: p) u( K3 l
  47. PUTCHAR_PROTOTYPE1 {1 ~& d' b- _
  48. {: ~9 T6 J7 ]1 @2 x2 `# [4 |6 \4 u/ s: P
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    1 t4 |# f+ m( @. H  I" X" k

  50. 2 ~3 C5 ]7 B; j- _: B/ L  e1 ^
  51.     return ch;3 O# f4 {" L* O+ d4 E7 S( k: `, E
  52. }
    . G$ x( k3 @, S" Y) E" w  J% h
  53. /* USER CODE END PFP */
复制代码

6 }! m4 Z! I3 x9 C" U: @/ d5 u, @) B: p0 ~! \- \
RTC 初始化# c7 M" D. b8 ?. t
  1. static void MX_RTC_Init(void)3 R7 ?" K  m- T4 b5 I' A2 i! D# Y
  2. {* p) c% ^0 a1 X$ F. u

  3. ) f& M" f4 e- Y
  4.   /* USER CODE BEGIN RTC_Init 0 */3 `( m. e7 ^5 E$ G# E# y+ @; X1 Y: Q

  5. " h, S- h* l1 E0 n; C
  6.   /* USER CODE END RTC_Init 0 */
    ; T' \+ b) \$ U0 Q
  7. 7 \, t2 ]5 x0 K. z% p% P7 w) `
  8.   RTC_TimeTypeDef sTime = {0};
    3 D) w) w& R: Z: k- }
  9.   RTC_DateTypeDef sDate = {0};
    ; w, B, C  S  r) \6 B
  10.   RTC_AlarmTypeDef sAlarm = {0};
    + r3 z; z" J7 K6 T1 c6 i- k5 E5 V2 s0 S

  11. 7 Z; |* N! M2 b. k! ?
  12.   /* USER CODE BEGIN RTC_Init 1 */, I6 x$ ^/ x) k! I

  13. : ?2 F3 t  |+ g% l+ c( F. y/ i
  14.   /* USER CODE END RTC_Init 1 */
    # y) `7 {- u& w0 c
  15.   /** Initialize RTC Only; s5 ^6 _& L3 I0 x+ U$ y
  16.   */
    & I# S. O% i/ W2 R; R( m/ U7 l
  17.   hrtc.Instance = RTC;  T# z% d! Q6 S" P0 `( L$ J+ E' ~
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    8 V9 V2 T* ^1 B/ r2 \
  19.   hrtc.Init.AsynchPrediv = 127;- h* m, R) z: g7 `# i0 X; U
  20.   hrtc.Init.SynchPrediv = 255;" y7 ~1 f% ^, O1 _
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    $ T0 F8 I5 ~% j( T
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    - |2 I) _, u9 S2 `5 X) l. y) t' X
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;& |3 X8 k: o' r  m
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    : B% B$ i# x9 s. I: @2 w
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;, d9 V# y' b* F% I
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    1 k5 h; J. m# i0 ?2 V
  27.   {
    7 l' d$ _# \, r9 ^0 O5 x
  28.     Error_Handler();# n+ q$ h. T4 _  z4 [+ y# C
  29.   }6 u; r8 Y+ A. }: J7 e7 ~
  30.   q; x# J5 h0 N/ b% q
  31.   /* USER CODE BEGIN Check_RTC_BKUP */3 u/ e9 \. f. i3 n; `
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿# _7 _1 l. g, a; X% U3 Z
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)
    8 i1 l3 Q8 E* T: g5 ^6 H9 f9 m
  34. //    {
    # A0 G% @7 ~! N, Y6 F
  35. //        //已经初始化过了,直接跳出初始化函+ G8 j# g  q  c# H: h+ h9 p
  36. //        return;
    0 p, Z+ l1 W( ]; N, @+ V# q; C) {# j6 m
  37. //    }
    . b4 K; F( m. R  \: H
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿+ b2 B1 h+ l) a' W
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);# U  [$ O) W, p& t+ ^
  40.   /* USER CODE END Check_RTC_BKUP */) A, I! B! M) c& p3 r% m
  41. % L& x4 u  [" @7 W$ H+ A
  42.   /** Initialize RTC and set the Time and Date5 t; c' e. Y& u
  43.   */
    * ^* F& {4 [+ E' j0 b, Y" K* v' N6 C
  44.   sTime.Hours = 14;
    % z) e, H9 d2 Z; f4 G' l. R  V
  45.   sTime.Minutes = 50;
    2 |* u' z: _7 M: q2 m9 e8 w) w
  46.   sTime.Seconds = 0;
    9 ~7 p4 p) {, M( }( ]1 |
  47.   sTime.SubSeconds = 0;6 F8 H3 ^1 V; |/ s+ o
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;3 g7 G. I$ t0 s$ P' y
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    : x0 \' k) R8 p: [# Y: ^
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)" o5 N- Y& J$ z* q
  51.   {
    7 ^. m& z8 @: l+ n! n# X1 [
  52.     Error_Handler();# N9 d. D5 A! N% `; J5 }' Z
  53.   }! P7 s+ H, L) }$ I0 T
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;6 e: ]9 W: d8 ]' \2 F
  55.   sDate.Month = RTC_MONTH_JANUARY;
    % w9 m) P2 _: \% ~
  56.   sDate.Date = 28;1 z& L( ]/ f, L+ w
  57.   sDate.Year = 21;
    - K2 Z  W" {0 t7 L! \

  58. ; K% W2 B2 l3 G, Q3 ^
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    1 P. i* F4 }+ M/ K1 y5 A
  60.   {* J- n  r% Q9 l' x
  61.     Error_Handler();
    ( i/ N) Y# B+ b  y; F3 T2 I9 W
  62.   }
    * c" V8 \% |5 J9 Q, r- Q) c, j# D
  63.   /** Enable the Alarm A
    + |1 f1 e7 K! J' z- m0 N
  64.   */" s+ U% n3 Q2 n. D+ l- ~
  65.   sAlarm.AlarmTime.Hours = 14;
    0 ]8 k4 u2 e- Q8 ]0 ~8 d
  66.   sAlarm.AlarmTime.Minutes = 50;
      @" l# \* B1 b  q3 K. ?) ^& h! z$ S
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断
    $ U) O# k  y: w& N% y5 u3 B3 B- C
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    : j4 [6 {6 T+ ^5 z3 {+ J' c& a
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ! M" _- b5 M  X! |4 G
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;! V/ a. p& C( C5 m5 y" a5 W" R
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    - I0 E7 l! o6 w( e- N; f2 u
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;/ ^# b2 F3 |1 b2 i: A
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    ! R; C5 B: c4 `5 W, P
  74.   sAlarm.AlarmDateWeekDay = 28;0 P8 O0 k* a6 z* b0 D0 s( ?  U, N1 i
  75.   sAlarm.Alarm = RTC_ALARM_A;% ]; \0 T; A/ ?
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)% L# Y( U7 X" P* v8 C# [: h
  77.   {
    " Z- {+ c, e! Q8 D3 l- R) N
  78.     Error_Handler();* ~9 G1 |3 I0 D) R9 D) y; b) V
  79.   }* ]" f6 c' j# w+ A% U
  80.   /* USER CODE BEGIN RTC_Init 2 */* h  p' a7 ^* M
  81. ; q5 b; s: N/ \# B! v4 k, ^; v
  82.   /* USER CODE END RTC_Init 2 */1 A  y- o3 b5 f1 s' B9 j) G( i

  83. 7 x* n+ W9 {2 {! O4 l3 E
  84. }
复制代码
7 b, z. {& u+ c$ m- F  O! P
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
5 I! u2 d, S7 b9 }5 d2 p  ~# K5 M* N7 e7 ~# U2 U3 i" ^! j
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数7 f" }5 Z7 A7 C: i8 J  P
  1. /* 设置闹钟下次产生的时间 */# n/ Z4 [4 ~- X3 T8 Y3 Z- x6 I$ f
  2. void setalarm(int hours, int minutes, int seconds)
    6 x$ A) _' {2 W: e
  3. {
    9 [; Q# n! b  E4 l/ V) L& T2 a
  4.     RTC_AlarmTypeDef sAlarm = {0};
    ; K/ S8 k* C+ t" I' Z
  5.     RTC_DateTypeDef sdate = {0};    9 Y- w: g% [/ ]! Z' u2 z
  6.     RTC_TimeTypeDef stime = {0};, i+ H; c* G2 @$ I/ h

  7. 2 |  |. ^; v0 w
  8.     //读取当前时间 ; W. s$ H# E- k. u5 i- |1 F
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); ) i& l  T8 [) T+ i! J% W- l
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
    " y! {3 x5 j) s# y6 U1 C' B, b- ^
  11.     //获取设置中断时的时间
    ! R$ _: J: a" |0 M+ S7 X! o
  12.     sAlarm.Alarm = RTC_ALARM_A;( |, a# U- p1 C1 i6 s' ?
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    0 ^( i( c7 e2 a. e' E4 ?: i
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;; p  \) O) k5 @* ^& X5 X( ]6 j
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
    / Q( h# b+ ~. @. a# f! M
  16.     if(sAlarm.AlarmTime.Seconds >= 60)
    ' M4 E/ ~3 y' L0 \, p6 x9 |
  17.     {: o8 H* g! o0 d, Q" [7 i
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
    7 i8 ?& H6 W0 z6 ]
  19.         sAlarm.AlarmTime.Minutes += 1;
    $ H' x' O/ }4 c8 f& |1 e1 C# I! \
  20.         if(sAlarm.AlarmTime.Minutes >= 60)
    * e+ U3 T8 S' q$ }, G# I8 J; _) t
  21.         {6 Q" p6 B( t* t3 i' C7 [1 ?4 z# S
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    , d3 A3 n6 y' n* U( C3 E
  23.             sAlarm.AlarmTime.Hours += 1;
    4 t8 U" d3 F3 q# T. i
  24.             if(sAlarm.AlarmTime.Hours >= 24)  ^) ]* f* H5 n* c% B. d
  25.             {
    4 ?8 o0 Z' |- [: R) ~1 I% {
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;! Q. H4 v; i* l: R+ [, v+ K
  27.                 sdate.Date += 1;  K. Y, x- P* o/ \7 D+ _" K
  28.             }
    - J9 X* k- J5 d6 ^
  29.         }
    8 J1 `" Z7 ]( I
  30.     }
    0 d1 g. N- p% y  b
  31.     sAlarm.AlarmTime.SubSeconds = 0;# X, a5 ]8 F  t  \8 l/ s
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;5 S  p) k9 N5 t( V0 y
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;3 Q8 g# Y2 F- v' X) K1 @* C) U
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;& F$ T) o  T: w& |3 z: G1 D/ Y: S2 B9 Y
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    , V: I; _, n6 E# V) T5 V4 j
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;2 I8 ]9 G& m3 @; }( |
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意( R/ w$ T9 ~% i  |' f/ K

  38. - c4 t* A- H3 s$ A4 ~/ |

  39. 3 r6 z' b# f+ k' h9 j: U6 O/ c% I
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)+ D$ c$ e, {5 D# F$ {7 L; V6 R, I
  41.     {+ L% }$ Q$ P1 c2 ~/ u) B/ ]  w
  42.         Error_Handler();0 `. B+ H) F' O) t
  43.     }: [1 b7 M' T4 ~/ {* I5 A+ K
  44. }) i' j" y: ~! S/ S9 w

  45. $ d4 _" T2 ^8 B2 y+ J1 P6 [3 b$ p5 v
  46. /**
    6 p8 p# r; \7 ]( a+ ~
  47.   * @brief  Alarm callback 闹钟中断回调函数2 z0 C2 A) Y  e, E; s5 j
  48.   * @param  hrtc : RTC handle
    8 s5 G4 K% Z6 x7 F: Y3 S. g0 o6 @7 }
  49.   * @retval None) s9 Q& U- j  x& J' r
  50.   */: P( O5 O) A$ q! e+ t1 M! y
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    ( T: E3 M: L4 n$ }( K
  52. {
    & G/ R! }) b6 _, N4 s; A$ a
  53.     static uint16_t sEnterCnt = 0;
    7 G6 F- d* e; [$ x3 \) g: Y

  54. + g/ {* S/ {3 l+ _: {+ C2 X/ x/ B
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断( s7 T$ ^, p- Y5 H  g0 w
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);1 a! S' o& K9 x9 I3 {
  57. }
复制代码

  d% e, J% [: @5 _main 函数, M4 J/ L6 X+ B5 F/ a2 Y! X7 G
  1. /**$ Q+ _( b- Q7 r0 r( E/ {& w" |
  2.   * @brief  The application entry point.
    3 w$ d8 [( i6 r, v
  3.   * @retval int
    ! _, h5 H: i( |  s! A  x
  4.   */
    : @' L( J& }" r6 s- [  P$ o
  5. int main(void)
    ) ]6 C$ n' x2 B6 n: ~  C8 t
  6. {. a& b# H: N( r1 F7 T4 s9 m
  7.   /* USER CODE BEGIN 1 */5 l/ Y/ g+ j/ {2 l9 w+ @

  8. # V+ I  b9 N9 `! H# h+ z
  9.   /* USER CODE END 1 */, |* H; k0 J9 ^. d+ J: \8 D9 n% I

  10. ! x! V% T$ B. Z# P
  11.   /* MCU Configuration--------------------------------------------------------*/
    7 t! U0 `6 ]. m, T4 r: R! C$ W1 d! A

  12. $ U5 ?0 `- m) w" y, w3 T7 `
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    9 C" P# p! M4 ]3 l2 `% R+ g: E9 q
  14.   HAL_Init();9 g: A, `0 y& V! N

  15. " n. ~# Q) {; m' N" p% d. x
  16.   /* USER CODE BEGIN Init */. P4 c5 \1 G7 H

  17. 7 R: v. Y! c* \4 t4 d1 H
  18.   /* USER CODE END Init */
    9 k6 j  V% B2 T4 J
  19. . I1 H3 k8 ~" K6 o
  20.   /* Configure the system clock */! ?4 \- E9 z, z
  21.   SystemClock_Config();
    ; V8 B$ ?6 K4 c2 H5 S- E' y2 z
  22. ! m4 v7 B2 w! m0 r- q% D) x
  23.   /* USER CODE BEGIN SysInit */
    ) ]! y, j  B, F8 g% w0 \

  24. ' K+ W, M' x9 d- e, K) c
  25.   /* USER CODE END SysInit */0 ]1 t. X- ?" \7 J) B+ w/ P
  26. 6 ?) K6 {' m8 ]+ k! U% C, n
  27.   /* Initialize all configured peripherals */
    . x* f7 \0 @1 k0 ^
  28.   MX_GPIO_Init();; l% B" ?% ~9 h( u' |2 O; Z
  29.   MX_RTC_Init();
    0 q5 c: p* X; p8 ]
  30.   MX_USART1_UART_Init();1 D0 b  `0 T/ \6 X$ ^- D
  31.   /* USER CODE BEGIN 2 */
    ' q" q) R$ K7 _5 K$ G; Z
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");' m& j/ o( g& n% _/ \" H: l( N
  33.   RTCStatus = 0x01;( \& K' ^* r  ^
  34.   /* USER CODE END 2 */9 z; d3 P0 |' M+ D; Q

  35.   J* S, y1 A; c* p" v- z7 w# c5 s
  36.   /* Infinite loop */
    . u# o/ k+ Y7 L
  37.   /* USER CODE BEGIN WHILE */6 E1 p6 ]0 s5 g: F) g% a
  38.     while(1)
    8 j$ M8 S, _3 a% {' A# K3 j
  39.     {
    ( z2 m6 `7 U! N. a  ]
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);/ S7 Z$ ?1 E3 J$ ?
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);/ h4 |' f2 g4 }- g9 j) x1 @
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
    $ _. |9 C4 u2 Y# P# c/ t5 N
  43.         HAL_Delay(1000);6 v( |* b8 H7 i% c  Z. {* z! _6 w
  44.     /* USER CODE END WHILE */+ Z; Q8 r1 A( C0 \& h- B7 t
  45. 9 Q/ p! P6 ?  m
  46.     /* USER CODE BEGIN 3 */
    $ A7 w1 K# y7 r2 T  v
  47.     }/ l! J+ y& g2 g2 J
  48.   /* USER CODE END 3 */- j7 E0 F+ w$ C- X. h. m5 O
  49. }
复制代码

9 X: E; W2 B3 b: s/ {" E" k主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
1 p- H! K% A) s: x8 d( I+ X7 @0 G6 J; o; T
3. 编译并下载测试' W# O( \* Y7 m1 f% t9 t0 Z
将程序下载到开发板中,连接串口助手并打开;
9 n# `% z0 p& H6 E实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.6 h) I  P8 y9 t. @9 G4 M% L4 }7 A
! y! L. l9 S4 l
20210128175241625.png
2 L" ?, v/ @# ^8 Z% [1 E

$ P% [; G' l5 F1 e
赞 收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版