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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
% {: V2 l3 ?) A% u, z. m' r4 e打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
( N( y& d% h3 O7 N: S& v. v  j# }7 S" I
先配置一下串口,用来打印相关信息$ _, H  y' U; f! x
1 N- Q# t" @: F2 q, a2 K% Z7 v) M
20210128091458888.png

, X: s' `1 P6 Q& w( I2 ?- F/ l! J% Z$ R" M1 q: [6 H+ P' W
再来配置 RTC
' y& S# [0 B1 k# t0 u% r$ ?
) m! p8 o7 B# m: ~0 K5 V* Q
20210128170709886.png

( Z1 a7 K# `; r# _, `1 K
& C" T) a. P  N' ?& s/ P( `: H
20210128170837705.png
2 g/ R% o* ]" j1 u8 X8 K' O( C

5 X5 [' O% D2 R! E; I7 ^: P( H6 @# {配置时钟0 c7 K7 s  r; m, n
. h7 z2 W+ C: W, z4 b# r+ o/ o
20210128171003870.png

: h  v5 \, S' Q) q0 _) p5 l/ b8 A6 e) z0 ~4 c
ps:本实验使用内部低速时钟测试,未使用外部晶振.
0 c8 z' o5 A1 `8 V& k5 l
2 }3 C$ I* b; f# p( O, p# H配置工程相关选项2 H# d/ {$ @" Z2 b: ]; N
" o( e- j7 l& c+ Q! K
20210128171144837.png

0 J. C3 \! f: w: g8 z3 x; U
% Z1 v2 x1 u2 s6 ?5 p4 b配置完成后点击右上角 GENERATE CODE完成工程的创建/ b: T! g: A* F$ n6 }: x8 c9 H( U
& B3 W& a" r) C, ]+ O
2. 编程
) A1 f, {0 v2 ~! O; U+ _! w9 k2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口" }0 z! q8 _9 {
  1. /*设置系统时间*/# \0 [2 O4 q( t5 E! K
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    + o7 v6 K9 M* A8 c0 ?: E% S
  3. /*读取系统时间*/
    7 L! D; N8 a4 s! j
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    3 i, E) ^! `) ?: @. Q
  5. /*设置系统日期*/% i* H; ?& e$ K, _( @. v
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)2 v+ P$ ]8 a+ ~
  7. /*读取系统日期*/7 I1 m" m1 M# x8 I
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    6 J: d1 V7 ]$ g( P1 T( ~2 p
  9. /*启动报警功能*/. E2 ]9 M3 I+ L
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)' w3 r9 H# z5 e0 K; {
  11. /*设置报警中断*/
    1 {" u1 J, U/ e3 S1 e9 A8 h/ u" Z# @
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)% ?6 `  a. k0 q0 ]/ a
  13. /*报警时间回调函数*/
    " O' s3 I# ]/ y/ N
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    6 S8 x3 Q$ p* D4 @# S) J4 U
  15. /*写入后备储存器*/2 s$ Q: O8 j' W7 Z
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)$ l3 O+ _0 p8 m! n0 L
  17. /*读取后备储存器*/# [# f' {8 _% C; T: m- x
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码

: X  D8 ~1 R* h; `7 p. ~. U9 i2.2 串口相关的代码3 ^$ z. z$ R2 f" {
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
7 `0 ^4 d+ x" c! M) m6 p8 U4 E6 O
  1. /* Includes ------------------------------------------------------------------*/
    4 B. r2 ]4 a7 w  ?0 l
  2. #include "main.h"  V8 h- l9 z+ s( v7 |, }

  3. ! X* R; e8 S( f" x
  4. /* Private includes ----------------------------------------------------------*/
    1 {/ ]" Y! y  |, g  Q% h8 C
  5. /* USER CODE BEGIN Includes */
    5 J8 A  _0 f. |7 G' f
  6. #include "stdio.h"( I; ?8 u9 }" X  h3 @3 X: F
  7. /* USER CODE END Includes */
    * F5 u3 b4 B% Q$ `
  8. 1 E% j0 Y0 `$ }+ y( ]4 K
  9. /* Private typedef -----------------------------------------------------------*/* k; x( Z. O3 e5 u. {( a# z& r
  10. /* USER CODE BEGIN PTD */% T9 g% A/ r+ v1 [7 u- ~/ l

  11. ( k! `" l' @7 z2 I3 t
  12. /* USER CODE END PTD */
    , S; p$ j/ U9 Z4 p1 S$ K" u# y; p

  13. 1 ?* k) Z2 a! f- ^6 t
  14. /* Private define ------------------------------------------------------------*/
    + D- H  P. c% y& q, M9 z" l
  15. /* USER CODE BEGIN PD */7 T' P" m, j+ |- n) u8 b: e0 m& p
  16. /* USER CODE END PD */* y2 I$ A0 @2 m

  17. 7 V1 N( n0 f7 k
  18. /* Private macro -------------------------------------------------------------*/
    + w/ t& G" _; t* e5 ]! p
  19. /* USER CODE BEGIN PM */
    7 w% M0 F/ x8 H& X% u1 k7 g
  20. $ q( D' F' G0 z( ^. F& H- ~3 ~
  21. /* USER CODE END PM */0 `, M; w3 D; Q/ _

  22. * i# ~3 Q( [9 K, s
  23. /* Private variables ---------------------------------------------------------*/
    6 C3 w' s* a: f4 o( `
  24. RTC_HandleTypeDef hrtc;
    , h' O/ P7 h; y& y( ?9 T# s5 v  {2 I
  25. ( c  Y# a! b% R1 N1 O
  26. UART_HandleTypeDef huart1;6 _7 P: I. J' ^  v; n0 g+ d# H

  27. & e, \: D* E0 I' {1 g4 M
  28. /* USER CODE BEGIN PV */% z, j0 J3 S/ t0 M# ]3 i$ A
  29. RTC_DateTypeDef date;        //读取日期
    1 S/ e1 N& w; o- A4 l2 P
  30. RTC_TimeTypeDef time;        //读取时间
    9 e! @7 R' D+ u* T6 s
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    ; y! \4 f. J, s% e
  32. 1 N8 g0 s7 ?% I) i( ]
  33. /* USER CODE END PV */! X& O+ N" h3 L! C
  34. 7 v- a' y& [% {6 M" t* b% d) R
  35. /* Private function prototypes -----------------------------------------------*/5 [, A2 Y" h) ]* ?: ]/ r# ^
  36. void SystemClock_Config(void);; P  q0 j$ O( w6 b$ u2 j
  37. static void MX_GPIO_Init(void);
    ' n, U1 H6 D$ Y5 j- t
  38. static void MX_RTC_Init(void);
    ! {& y, }' ~% s1 T
  39. static void MX_USART1_UART_Init(void);& k/ }! W, a! M% x5 ]
  40. /* USER CODE BEGIN PFP */
    0 p( b* i' C4 A! b, W" _
  41. // fputc 函数重映射7 f2 G# d# w' e) {, q3 g
  42. #ifdef __GNUC_5 c' A6 H2 Q/ ?$ K. Y5 f' F! X
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    $ {$ @4 }# {- P, N6 m1 E( o$ G
  44. #else
      ~) {5 N/ D! P. ~; c* Z! c2 a
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)+ @+ N; J  t: O, Z
  46. #endif2 F) U! E2 `3 e/ l
  47. PUTCHAR_PROTOTYPE
    " M& K5 {( |4 _$ b2 k
  48. {
    5 [. `7 c- t6 x  y3 ~
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    ( [- p. [& w& C3 j- _1 r4 K
  50. ) n6 {' L$ E8 l' q" Q
  51.     return ch;+ V, P0 m4 j( H- J7 E- ^
  52. }* W# F" a8 A6 P* A' J
  53. /* USER CODE END PFP */
复制代码
5 F: t8 ^4 o4 V4 v3 q$ O$ ^8 F

( x; M( Z8 w$ |9 k# [: o  sRTC 初始化. u: a. P+ R# D9 l! |0 h! s& n
  1. static void MX_RTC_Init(void)
    % G  s5 l, H$ m4 L
  2. {1 v% X4 `) G7 @9 L
  3. & u' f' i7 w; e' f# G
  4.   /* USER CODE BEGIN RTC_Init 0 */
    3 ]- a  r" h3 c8 l
  5. # i0 @+ n  |7 |; D% c
  6.   /* USER CODE END RTC_Init 0 */
      P. l* q$ q3 Q
  7. 3 V3 H6 |* f% u  b1 n2 w
  8.   RTC_TimeTypeDef sTime = {0};
    7 I7 S, h  t& m0 Q
  9.   RTC_DateTypeDef sDate = {0};
    7 z6 H" P$ s/ _: a1 w2 X
  10.   RTC_AlarmTypeDef sAlarm = {0};
    + b$ n, P" i# L7 l2 q7 R

  11. $ Y  C% ]- P: b6 L
  12.   /* USER CODE BEGIN RTC_Init 1 */
    % j7 u" B/ s( s+ q1 X

  13. 5 K9 p& ]+ I% p
  14.   /* USER CODE END RTC_Init 1 */
    " ]+ Q# U% f( n; P2 p7 z) r
  15.   /** Initialize RTC Only# p' ^' x) t7 ~& n$ ~- N3 }. x
  16.   */
    8 `7 {) J" s& }; Q& C0 D, U! t
  17.   hrtc.Instance = RTC;
    ( P2 V/ q* C/ l4 F
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    % O9 \2 g  a9 |$ K& N7 c
  19.   hrtc.Init.AsynchPrediv = 127;' s" o) N$ o! z6 w( W
  20.   hrtc.Init.SynchPrediv = 255;3 c6 W  u! q, V9 s. v8 u
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;. D" Y6 d5 u  e
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    # i* r' _) F- n
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;! {& i: R1 q2 Q/ p1 {! y& O; \& P
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;* [: i1 V6 O3 t; {' y" Q4 f  B
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    " W  j4 c3 W' i+ B% E& R7 d% P
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)8 b. c" |* H9 y
  27.   {# a$ F8 h, b6 P
  28.     Error_Handler();
    3 |4 k# l: Q/ P+ t6 ?# h
  29.   }
    ; G) m+ d. ?6 b

  30. # }7 u' C9 V/ J& V
  31.   /* USER CODE BEGIN Check_RTC_BKUP */
    0 [; w, _+ F, o+ r! Y
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
    7 Y' V& ~5 X' O: m, Z4 b; \1 f
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)8 X( z7 G' A! e, Y8 W+ m* ~4 D
  34. //    {/ Z5 R6 g6 L! U; n" V. e
  35. //        //已经初始化过了,直接跳出初始化函
    0 Y9 b; b( ~6 G8 ?4 W- @. W
  36. //        return;( Y6 m: y- ]9 O- J
  37. //    }
    0 u8 t$ {2 P0 ?( T: m+ ^
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿5 h  w( q  c7 N" ?- ^( n4 s
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);, `4 h7 H4 d: r* q3 t6 _$ J
  40.   /* USER CODE END Check_RTC_BKUP */# `) J+ Q# x0 k- c
  41. $ ]; N& E; W! q/ s; `
  42.   /** Initialize RTC and set the Time and Date
    & s/ S- P7 @2 E# f
  43.   */2 z3 }, B& {  T! I4 V
  44.   sTime.Hours = 14;
    : _1 W7 G! Q' O7 w* M  z# C* `
  45.   sTime.Minutes = 50;
    2 r: t% b0 `  i! p
  46.   sTime.Seconds = 0;
    7 c) y# d9 v; \0 `
  47.   sTime.SubSeconds = 0;5 |) D* G! N. V. c. r9 w! o
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;, p7 N( F% i" B' E$ m5 t' D
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    - ~# U2 x* u& A& s7 K+ o
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
    ( R! i* Y% z8 \* f2 e! e
  51.   {1 b! G7 _9 K  B% l
  52.     Error_Handler();
    ( m2 m1 z1 w. g  U( M' u
  53.   }
    3 b) {7 T1 O: ?$ b/ k
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    ( a. @/ ?+ A9 Q, X. H- I& N$ l
  55.   sDate.Month = RTC_MONTH_JANUARY;0 x0 l3 r" G2 K* S& f: m" m
  56.   sDate.Date = 28;
    % x8 m1 l' a! {- r. Y8 i4 Y1 l
  57.   sDate.Year = 21;5 i/ A. {% p4 \8 Z$ P6 e( o7 c
  58. $ [5 s6 ]- |0 G) R! \' I
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)  q' U9 C  R+ ^" T$ z
  60.   {6 H' U$ l+ J5 n- ^
  61.     Error_Handler();
    8 ^0 Y4 I# Z( S4 P' _
  62.   }
      ?0 F1 v* v( ^8 N" X4 H
  63.   /** Enable the Alarm A+ a# J' u! L6 T* d( v+ A
  64.   */
    : b: h3 S9 L* P  ~6 s$ b/ R
  65.   sAlarm.AlarmTime.Hours = 14;
      {4 a3 D' d+ w. v; w! w+ v
  66.   sAlarm.AlarmTime.Minutes = 50;9 |$ `$ ?$ X7 s8 w0 b
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断- c6 p: L* w) N. n4 W
  68.   sAlarm.AlarmTime.SubSeconds = 0;$ f* F, Z1 |6 w1 ^6 b
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    $ {% M. a7 t: i: m& S
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;" S+ I6 A' |- `/ J, k% ]/ m6 V9 S
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;  F& U) n0 i9 }% U3 M+ u
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;5 O- c# z# v7 _6 V
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    9 g( ]( @$ v4 i9 V4 Y
  74.   sAlarm.AlarmDateWeekDay = 28;6 G; ^- y0 ]0 v
  75.   sAlarm.Alarm = RTC_ALARM_A;
    8 j- C% h9 }; h1 o$ F6 L+ `
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    0 o+ x3 e% |* m/ q9 W) i
  77.   {! ?3 M& `6 Q; E* z5 W5 m6 @
  78.     Error_Handler();4 y6 x4 H/ X, l  W- _  ~
  79.   }' A3 L$ k* [) R) P6 k) s
  80.   /* USER CODE BEGIN RTC_Init 2 */* ~4 P" D( s1 F" l( t  Y

  81. ' K! e$ f9 f/ k$ q# t" j& }
  82.   /* USER CODE END RTC_Init 2 */
      ]; t0 w4 ^4 z$ f$ `/ q) u3 n5 Z
  83. ' ^4 X2 u9 ]5 p; E# \9 P0 Z
  84. }
复制代码

+ ]4 N+ U: r& n9 |此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生." F" T$ H. N* O- g/ N2 E

1 g4 ~: F. s" b配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数: [7 j: P/ n1 m/ H; b% w
  1. /* 设置闹钟下次产生的时间 */
    ! d# B. a* s# p( d, @6 o6 D4 n. ~
  2. void setalarm(int hours, int minutes, int seconds)
    7 x9 B$ a6 |4 h+ ^; s- J
  3. {  ]! m; P3 M4 N
  4.     RTC_AlarmTypeDef sAlarm = {0};7 a6 ?9 k' I) N7 r- x' [' P# H
  5.     RTC_DateTypeDef sdate = {0};   
    7 T2 \  o% j5 T
  6.     RTC_TimeTypeDef stime = {0};
    / f6 r) u. t- ?' e8 h& W/ g
  7. $ J4 Q- w4 d8 f( r! b" C
  8.     //读取当前时间
    6 O3 Q) e* c2 g, I$ Q
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);   o6 U+ _6 {/ s0 O& N% ^
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
    9 H5 Q# N3 J: [+ f8 n+ r0 g
  11.     //获取设置中断时的时间% T, H; c4 w6 K- g/ t$ F9 J
  12.     sAlarm.Alarm = RTC_ALARM_A;
    # ~( Y8 G7 y6 |9 A1 B/ H8 z
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    * |: r& J2 a0 ^4 o
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
    1 p3 d& p  L7 Z; K8 \" h9 r3 U
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
    + w4 H) X* p5 E( N4 u( B1 u1 f
  16.     if(sAlarm.AlarmTime.Seconds >= 60)) }+ x! H+ Q7 H. J; R* l3 x% a
  17.     {
    7 \! ]3 Y! O  w; E
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
    . K7 v1 D2 @2 K' J' r
  19.         sAlarm.AlarmTime.Minutes += 1;6 ?& r# J9 `+ k. a' Z5 |% H8 w
  20.         if(sAlarm.AlarmTime.Minutes >= 60)* C: Q5 z9 r) H" w- _; j
  21.         {( e/ |% a# [: m- e! f! k% ?, o
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;7 {- m0 p# d+ }* v- g/ d, @
  23.             sAlarm.AlarmTime.Hours += 1;1 i* F: I$ L! r1 ~
  24.             if(sAlarm.AlarmTime.Hours >= 24)- b' @6 b: F. i6 a, C+ w: s$ o# Z
  25.             {: K& f  m/ |5 _# S
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    # Z  V2 l, K! c6 n1 k  z. t
  27.                 sdate.Date += 1;
    $ h' S+ N% z* U. t" H, i  `
  28.             }2 S$ q1 E! F  U8 q- J3 ]' C, l* i
  29.         }
    ) |0 m% ?9 d! a0 L8 g
  30.     }
    9 m1 N3 S3 N; n4 r7 \: Q" b
  31.     sAlarm.AlarmTime.SubSeconds = 0;
    2 F5 {5 b% y( n6 r; D5 x! P5 y
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    6 X& y) `9 c1 t
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    ! f4 r' c, }* M& B
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;; x* {! m/ X, E9 I' k
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    : h) q( [. j! S# m4 b
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;9 |$ G( A% ^) v2 u" p
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意+ R4 f) l5 ~- J6 t+ M
  38. 2 y' L5 {$ ^# C- r
  39. . w9 u5 J7 m: h( y  S+ l# b4 T! d
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    1 G# T; Y' u* @/ C- h
  41.     {6 I$ Y7 D7 E0 U) r
  42.         Error_Handler();8 o) G5 r2 T! h
  43.     }6 t3 d2 @& I; N! x  p/ G9 q9 q! r
  44. }" Y2 n; E7 J3 k- a6 _
  45.   K& O5 m# g) q5 ~8 ?7 s- b% r
  46. /**
    2 {& ^; x% f+ @& _! `3 S3 ]7 L2 M
  47.   * @brief  Alarm callback 闹钟中断回调函数% H5 n- r4 |) j5 Z7 u
  48.   * @param  hrtc : RTC handle6 z7 O+ G! t$ z3 i4 x
  49.   * @retval None
      v' Z8 q# a/ x( x+ }0 S# y5 X: I. H4 Q/ {
  50.   */
    4 M* y& _3 p- Y1 O
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)6 W( e+ r+ T7 v! X
  52. {+ S+ L$ v7 E! O+ j2 Q/ p" d
  53.     static uint16_t sEnterCnt = 0;9 d9 U# A9 R* G2 \- e

  54. 4 M; i9 p# ^8 o2 b( N
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断! [% p& v& i% U% |
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);" q& I* p" g( ~9 z2 o
  57. }
复制代码
$ m4 k+ I: G8 B& U" Z
main 函数
. O" E7 r' l4 k- i
  1. /**
    5 ~) K( W# D8 C1 f+ }* }' n& n' u4 \
  2.   * @brief  The application entry point.
    3 k9 ^' ]7 A* J5 o# U
  3.   * @retval int' U1 Y+ |' J" y( p* h" ~; x$ H8 ~
  4.   */8 {& t3 ~9 V5 p( V
  5. int main(void)( @, z4 [2 f' C$ ]
  6. {
    0 e' g& E& D. K
  7.   /* USER CODE BEGIN 1 */
    1 b# V1 H7 `5 W
  8. : n0 I3 Q* x: }, n- o
  9.   /* USER CODE END 1 */1 u! Z4 S- Q' N, `4 y  I* G
  10. 2 g& O. p5 J/ H" v3 ^( y4 [8 X
  11.   /* MCU Configuration--------------------------------------------------------*/: s& [9 i3 Q/ I- s6 G* z  V( D
  12. # A$ y0 l; h) y6 `& ^, c
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    & w; u( e" {" q3 ~/ J) g/ ^, K
  14.   HAL_Init();8 E. V# `. c; K- f
  15. , s3 o4 ~4 \' U" ^
  16.   /* USER CODE BEGIN Init */
      j& O! V: K8 [" x; W9 E  Y
  17. " e* k& I; B' q
  18.   /* USER CODE END Init */- ]9 u5 p# Z) d1 H

  19. / q5 s% U; I# c/ ?
  20.   /* Configure the system clock */
    3 Y8 w9 O) w( f1 D$ T) l2 a$ `
  21.   SystemClock_Config();
    2 l- e2 {, s; Z" E
  22. 7 ]+ }$ H6 F* s4 I! R" g
  23.   /* USER CODE BEGIN SysInit */
    7 q; p3 D3 E6 x" _, D
  24. & z& G: D  A, z! @( I# X
  25.   /* USER CODE END SysInit */
    9 a/ C+ d3 ?: z- F
  26. ) o- [* q" w0 k4 q1 r
  27.   /* Initialize all configured peripherals */
    - V+ w4 A+ O7 v( _
  28.   MX_GPIO_Init();/ B% Q2 f, _8 Q; F
  29.   MX_RTC_Init();3 `( n9 W. x. e0 N: U+ K& L9 d
  30.   MX_USART1_UART_Init();4 y7 t- Q* B8 Q
  31.   /* USER CODE BEGIN 2 */! e. A- W1 S# x! j5 m" I- ^+ r- R
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");
    # o( z* V' S6 a4 ^4 B- G1 b
  33.   RTCStatus = 0x01;  A+ G4 j! I4 x
  34.   /* USER CODE END 2 */
    1 @3 B' _% |/ u  G/ G; f. A
  35. * p, h: |1 m! G, U6 |4 {
  36.   /* Infinite loop */) J. r( i# J; b  {8 W3 s" Y
  37.   /* USER CODE BEGIN WHILE */5 B2 D! k! M( h8 r" ~
  38.     while(1)- r2 F/ J; P5 {
  39.     {
    - U& q: W/ z' q2 p3 H
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    1 J- h- N. x; V: M- ^
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    ' _$ Y9 n  R$ F% a( ]; A
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
    0 K! T0 Z" e0 j7 {7 R6 w0 {
  43.         HAL_Delay(1000);$ h0 ^' W' u! w% w; e: S/ w
  44.     /* USER CODE END WHILE */
    ' y% E  _( r2 c1 w
  45. / O* N% H2 t# w) E& p7 y% B% w
  46.     /* USER CODE BEGIN 3 */1 ^/ U+ P2 a6 E* Z
  47.     }/ i! B8 d5 T  f. Q
  48.   /* USER CODE END 3 */1 `0 x8 G) m; a3 g3 C" {* y% V6 B
  49. }
复制代码
' T6 c( C" n& b6 `- K8 d! G# W; N
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
3 u9 f' t3 G0 e& f; ?2 ~8 a  g! f6 I6 |' Q% }
3. 编译并下载测试0 g( F5 z, M/ ?$ k/ C9 e/ |! L& z/ ~
将程序下载到开发板中,连接串口助手并打开;
/ M; h, S( E! P9 b1 z实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
+ [5 C5 d/ A1 O( A6 f" r& n* y& y$ _
# L/ z. T, P' b4 Q) f! q( o  H% p
20210128175241625.png
, x! M; h1 ?) k& S! n/ d
% x5 g( m' T1 L: c' {/ S  e
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

相似分享

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