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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
8 l5 W$ y" L7 c1 \! ]4 {打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject." ]9 c6 N1 g6 n! Z& T& b9 v; P
6 Z# z) e( u- o: M8 v3 R; a
先配置一下串口,用来打印相关信息; c: i% G  s6 ]
0 i1 t1 R/ P# C* J* K, K
20210128091458888.png
! |$ |: W4 C% I7 R6 q8 U
/ G  {# C. |8 _  s3 l: }+ G8 A" l
再来配置 RTC3 M7 M4 k( x* v& Z8 y1 L" N3 h
" W6 ^, j. `' K! k
20210128170709886.png
' [' M4 R4 K6 I( E; p

% U' d3 ~0 f! `" c% y
20210128170837705.png
6 J8 \7 A  M3 h" r8 g
4 a( J% u  ?$ D( ]4 G
配置时钟
& m2 Z- M/ _! G& o" _! e& X# @8 c1 C+ |: l3 w
20210128171003870.png
% [& e  S+ ~3 L+ _& x

0 f$ `( r  v* M- a" e6 jps:本实验使用内部低速时钟测试,未使用外部晶振.
! q& d/ z& l7 a7 O: ?
* k+ N' D' ?& x1 j8 v; n: U配置工程相关选项  e9 w" M0 y4 z2 k: a: e
8 s, f6 ]. `. n( S
20210128171144837.png
! z9 _$ {; [, H
% T0 y* f1 N& Z% y3 u* c5 m) K& D
配置完成后点击右上角 GENERATE CODE完成工程的创建3 |' S5 v. X4 D- K+ G
/ O1 P( v' ?2 X, f, U
2. 编程% N  f9 }# v3 _1 D# `
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口' t, d7 X5 D% f/ H
  1. /*设置系统时间*/
    # S6 o: x" F8 I! c7 ^4 d9 ]
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    5 I. ]; b. g5 g7 H
  3. /*读取系统时间*/8 r8 i2 v) x, M, T
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format): ^% E* ]& L5 P, P8 Q  R
  5. /*设置系统日期*/7 [' z! O" S8 y4 W6 b2 ?% S
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    9 {, [" R. n0 N$ @& w+ R  a
  7. /*读取系统日期*/
      A: X, S8 r5 f6 Y4 w7 P/ X
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    # ~" S; Z6 y# I# e& {: p
  9. /*启动报警功能*/
    6 \9 t' o* u' s3 v
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format), i& A! E7 r" e4 A0 T( i
  11. /*设置报警中断*/, u4 A" W9 A- @% \& v. x  g
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    1 z7 x- V2 f, v1 u( j! N
  13. /*报警时间回调函数*/
    , s4 o4 z1 w4 \: \
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)- Q: F; \* J( ?
  15. /*写入后备储存器*/7 T% [; l' \) W/ a3 B
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)4 ]. K; L7 G1 Y' v+ [  ~: U7 Q: z6 }; W
  17. /*读取后备储存器*/7 G3 \% l- J* Q* v1 |; H$ Z! U
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码
1 D1 r! i0 l: k# U+ Z7 O" G2 E
2.2 串口相关的代码# ^3 k+ J3 g8 S" D5 {
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
3 b! \8 M. m6 @% [# X* j# u: P: b' F
  1. /* Includes ------------------------------------------------------------------*/+ V3 v0 z- [# s6 B0 X- g% @
  2. #include "main.h"6 t  n/ a! S& T; N( f; ^

  3. 3 y1 G% Z1 N4 W/ o9 y) F3 X
  4. /* Private includes ----------------------------------------------------------*/
    % Y7 k; a1 [( K( I; N! X
  5. /* USER CODE BEGIN Includes */
    ) }5 M% `2 n& n- y- b7 N. u& v
  6. #include "stdio.h"
    , C" V4 u& l4 {+ A
  7. /* USER CODE END Includes */
    3 L; I( i$ J9 y% a
  8. % m0 ?' q' d' A9 p8 G
  9. /* Private typedef -----------------------------------------------------------*/& M: q$ n/ E; e
  10. /* USER CODE BEGIN PTD */, F9 c3 M4 Q2 j$ \

  11. / R& N: V5 ]& M* U; \! [# o
  12. /* USER CODE END PTD */
    " J, T8 h6 h) P+ a% D$ f5 {

  13. + K/ V& n3 N# e3 i
  14. /* Private define ------------------------------------------------------------*/. J; f7 ^$ r# L" S3 G
  15. /* USER CODE BEGIN PD */
    + B/ F! [) {. i+ f8 a5 c. ?
  16. /* USER CODE END PD */
      j) T8 U0 B. l) f' ]

  17. 1 b" j2 i4 T9 v% @7 H$ ]8 a: E, Y
  18. /* Private macro -------------------------------------------------------------*/, s/ q7 _7 j7 G9 {( f- p( C8 m5 C0 \
  19. /* USER CODE BEGIN PM */: @0 o8 _% g/ q$ [; K7 t

  20. $ s& ?( M! P4 Y' [( _9 Y: L& ~6 e- N
  21. /* USER CODE END PM */
    : i- z1 n! H( V- A9 `. B, P

  22. 5 M! m; U' R% b1 R
  23. /* Private variables ---------------------------------------------------------*/5 A: P0 k( n1 d' m) T
  24. RTC_HandleTypeDef hrtc;& p) D) \8 A$ V* A: @# C+ g0 G( H
  25. 4 b. a, K0 A# ^2 d. K0 ~6 k
  26. UART_HandleTypeDef huart1;% G$ G3 m: K5 V

  27. 6 ^0 G# \  N" [0 o* U: Q$ y- s
  28. /* USER CODE BEGIN PV */; K) o# X6 s+ U7 _$ D2 J
  29. RTC_DateTypeDef date;        //读取日期
    2 O* V; U  x- y/ _5 a, Z2 K4 h
  30. RTC_TimeTypeDef time;        //读取时间
    ) j) s& g; u2 v
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    1 N2 c7 x$ S( q$ w6 [

  32. 8 }. g* U( z3 v  S' O* r
  33. /* USER CODE END PV */: Q$ d+ ]# g( x6 j- y( _' M
  34. $ A- Z3 w' J6 A0 u6 p. u
  35. /* Private function prototypes -----------------------------------------------*/) A( V' W: d# W! \  `
  36. void SystemClock_Config(void);' {1 _& D$ q# R3 y  D
  37. static void MX_GPIO_Init(void);
    % \4 m( {! a: ~4 d9 _/ g* r% A
  38. static void MX_RTC_Init(void);
    , A" X% p9 S5 Q2 _: Q+ C6 o
  39. static void MX_USART1_UART_Init(void);! m2 `4 @0 T1 t  C$ z9 Z
  40. /* USER CODE BEGIN PFP */( ^7 e' u0 h9 F4 d0 ^8 b
  41. // fputc 函数重映射
    : C( H, d9 t& u- @
  42. #ifdef __GNUC_; ]4 o# E! \$ y# Z1 ?
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)! C! L) B. v% F/ @" Z3 F3 |
  44. #else
    , @  I* Q& R7 C2 J
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    6 ?" Z2 {7 a! `# Z" U$ J
  46. #endif6 U- B* Z" ]$ q7 B' A
  47. PUTCHAR_PROTOTYPE. K, ~& N  H. Y! J* l. g% x- V2 X
  48. {2 s7 Y: }  w+ u" Y' ^* R
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    $ F& s9 U. e- K5 v/ }8 w/ R
  50. & z3 j: {' D( m  T0 B1 r
  51.     return ch;
    : Y/ B  G0 b& o6 p5 ^
  52. }
    ! J# f5 f! S4 D2 L, P
  53. /* USER CODE END PFP */
复制代码
3 Y: b! b7 X/ w$ Y4 s4 j4 N8 p. ?

3 d+ r5 I$ h& U' m  G8 Q% B6 ~3 WRTC 初始化; w' [( Q5 `$ x6 @: H
  1. static void MX_RTC_Init(void)
    . w) |" H/ p: n+ X+ S
  2. {
    - E+ f, J6 ~3 |4 @1 _" E
  3. . q. P( j2 Q: s1 [0 |8 G
  4.   /* USER CODE BEGIN RTC_Init 0 */& K9 R- k( i& g  l% [
  5. 4 Q' T7 i# I- @+ F' P& _) c0 C
  6.   /* USER CODE END RTC_Init 0 */
    1 F: i0 ?& c6 ~9 S2 [
  7. 7 w8 s" Y0 G* v6 M# {
  8.   RTC_TimeTypeDef sTime = {0};: ]5 s' A8 N( k! u$ k
  9.   RTC_DateTypeDef sDate = {0};
    % Y' Z4 R/ [2 B
  10.   RTC_AlarmTypeDef sAlarm = {0};
    4 O$ N4 z+ m* f/ F9 _

  11. . r4 H) h' M" n1 q! M  t
  12.   /* USER CODE BEGIN RTC_Init 1 */
    ! ^- P% c4 a8 X8 T/ E, n

  13. $ t$ q: n' i: [5 t: z+ K. n+ o9 d
  14.   /* USER CODE END RTC_Init 1 */
    $ `3 t1 ^6 i9 w& [
  15.   /** Initialize RTC Only
    ) S$ z* M! l( e  r8 N" c% c! L/ \/ ^
  16.   */* p& x3 y; }. z& s5 L0 T' i/ T
  17.   hrtc.Instance = RTC;% ^/ D8 K' C7 n4 z5 r
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;! a( ^* e1 f  R
  19.   hrtc.Init.AsynchPrediv = 127;
    % R/ X2 {0 s' O
  20.   hrtc.Init.SynchPrediv = 255;7 Y( w/ q. K" D. w) e: J* ]
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    , Q' X* n. m' z! p" Z
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;1 Q$ g% a; I* u" v/ z% j1 H8 ?
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;, j7 A* H7 d0 x8 V
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;9 J7 Q. r" G. T( i6 b3 a# X" {
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    : k% Q* d! ^/ K3 x$ F6 ?
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    7 [; ]9 n4 p4 z9 s
  27.   {
    3 V4 s$ j3 J, i* o# e
  28.     Error_Handler();& A: Y/ J4 g+ m1 A& v
  29.   }
    3 u0 \. T2 ~" m) {
  30. $ M% u0 `/ A! k
  31.   /* USER CODE BEGIN Check_RTC_BKUP */
    1 V/ Z( b* C2 r' j: x& C" p( @- ~4 D
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿0 O5 |; ~+ J) T( |1 j
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)3 H7 k8 A2 N1 ~* |
  34. //    {8 W# U8 A. {9 O: L* Z. q( _
  35. //        //已经初始化过了,直接跳出初始化函; @' z) t0 N) }6 F( ?. p* m
  36. //        return;9 A9 y) O1 p5 d7 b
  37. //    }, v# [# C# v: P# ]; j& @0 k  V/ o( l
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿  k# @9 v" J) S- t1 s) {
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    3 R3 M8 E/ w9 T4 l6 g$ b
  40.   /* USER CODE END Check_RTC_BKUP */2 K: J# F, O" D5 ~9 y

  41.   o2 e/ Q9 |1 C. N, z; r
  42.   /** Initialize RTC and set the Time and Date
    6 P/ f' k5 T" U& p
  43.   */# H9 f, B8 R# E+ y1 B
  44.   sTime.Hours = 14;
    - h1 Y- a7 d( k, ]5 ~3 W2 ?: w
  45.   sTime.Minutes = 50;
    0 ~0 t$ f0 p3 ?# e# i4 K( K: \
  46.   sTime.Seconds = 0;* @" N0 i" v6 f2 [! f5 l7 B
  47.   sTime.SubSeconds = 0;  T9 M  I4 j" ^9 i
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ; O0 A7 w# f1 Q. J6 k
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;9 b- a5 \: h7 R, N; q
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)2 Z9 N0 k, G" _1 f% |! F+ z+ {7 V% o
  51.   {, @* X6 U4 M; |# Q, a, ^% ]
  52.     Error_Handler();- l% D. J" m, L7 T% N3 N, J
  53.   }
    " P# x+ p8 r$ z3 C3 g
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    8 h" o% ?6 H2 |. d( a8 w- y% _
  55.   sDate.Month = RTC_MONTH_JANUARY;; k8 P( T3 D: U% G) ^+ b' E% p
  56.   sDate.Date = 28;
    + T: \, k$ {- w7 X; J
  57.   sDate.Year = 21;0 s9 ]3 o, ?8 b6 ~+ f0 F7 d& Q

  58. 1 C+ F( n. a4 P* P2 }/ `4 C+ ^
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    ; j: K: ?# F9 x1 T5 A
  60.   {
      T) t( j1 i' V4 v3 T; e3 C$ m
  61.     Error_Handler();7 D0 }3 S: _2 M4 C/ L# w  p
  62.   }7 h7 U0 i6 T7 S
  63.   /** Enable the Alarm A1 D% r9 Q, T* Z) @3 a
  64.   */
    / n2 [8 _9 P  \2 f- q
  65.   sAlarm.AlarmTime.Hours = 14;
    # {3 r. A9 @  g# o/ |1 d- w
  66.   sAlarm.AlarmTime.Minutes = 50;
    & h" Q: u) c2 K# Z
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断
    1 ^/ B+ E  D1 R; i" v  `) r/ v
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    8 M; S5 g6 d* g  K
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;: E7 [+ H4 K+ ?& D) x, k
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;7 Y3 A/ y8 V- L- m  B( |
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;( r2 r! P$ x9 h- U9 R' _
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    5 [1 a: P8 y$ ~! e/ M. P7 Z
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;" x$ |# Z, a7 i9 }  t' ~
  74.   sAlarm.AlarmDateWeekDay = 28;
    + `+ `, [& Y/ Z0 F
  75.   sAlarm.Alarm = RTC_ALARM_A;+ a0 c" Q5 ^$ \
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)+ J, q: W3 K' p2 J, j
  77.   {
    - U$ d% d* J$ S* T6 u3 Q
  78.     Error_Handler();
    $ Y/ q2 m; }& t9 E1 D3 R
  79.   }
    # o7 L3 H& D- J0 e6 G
  80.   /* USER CODE BEGIN RTC_Init 2 */
    ; P$ p$ L9 n* V" ^% r7 g
  81. ( d- E$ @' X7 d) r# j6 ?9 O- K& ?
  82.   /* USER CODE END RTC_Init 2 */. ?0 g( c/ w; D8 Q( o

  83. ) m7 b( P5 O1 s! t' h4 B' G) }
  84. }
复制代码
, Q; T& Z7 N' |) ]* o8 v
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
" J5 X2 m4 f. N3 n8 p
2 f4 Y) G) o# h6 G* K配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
9 D* A; u  W6 g
  1. /* 设置闹钟下次产生的时间 */
    ; e& ^- z- T2 G) w# @% y
  2. void setalarm(int hours, int minutes, int seconds)
    + W/ g: {; q, U" x( X6 e3 `
  3. {
    # d; {& ~5 [& N" U1 B# X7 X
  4.     RTC_AlarmTypeDef sAlarm = {0};
    ; I. b' o: w) [
  5.     RTC_DateTypeDef sdate = {0};    - H" w7 Q2 _& F9 T( s1 r0 X* Z
  6.     RTC_TimeTypeDef stime = {0};( N+ k: B: o! v4 z: Z+ r
  7. ' p  C/ }2 R( F! t' E. R8 x) b/ R
  8.     //读取当前时间
    : i* z+ e* ?6 {2 Z. o& c# }$ X4 W
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);   P3 v0 I2 i0 s
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);* ^; M4 ^/ z" v+ `- i* o
  11.     //获取设置中断时的时间
    * e& e" ?' w1 F0 s
  12.     sAlarm.Alarm = RTC_ALARM_A;( W7 v5 {! W+ B! i& |3 x/ M- b
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    : A/ f' R# S9 ]; P0 Z! k" K; V
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;1 Y3 _: f( T. S1 B2 o" s8 y. @! v
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;
    " U5 U; }$ q' L/ c9 l9 G
  16.     if(sAlarm.AlarmTime.Seconds >= 60)' S6 o( o! \' S
  17.     {
    : _7 f: V' c  H
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
    3 _7 y0 Q, ?0 q9 o% ?
  19.         sAlarm.AlarmTime.Minutes += 1;$ D" I% F& i* r9 r
  20.         if(sAlarm.AlarmTime.Minutes >= 60)
    % E! e5 ~1 |% Z4 e- F* w
  21.         {( y3 y% c  F! L8 D8 t. Y6 F0 K
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;3 w6 p1 C4 n$ D: F. Q# m
  23.             sAlarm.AlarmTime.Hours += 1;
    7 o8 f! X4 w4 b# M
  24.             if(sAlarm.AlarmTime.Hours >= 24)
    * e8 S6 H% [$ i. Y" h1 a6 X
  25.             {
      S( U6 O- N" f3 G' z) u/ B. I
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;0 G' o0 G$ O6 Y+ L1 s# r: D! \" A$ a
  27.                 sdate.Date += 1;' D9 \# Q  {: Y# i8 l
  28.             }
      T, {# b4 p$ C$ i' P; A/ b  E$ I
  29.         }
    + q; B5 |$ M  O" }, b) n
  30.     }
    0 i1 y  ?/ A/ z) l* w! _: a
  31.     sAlarm.AlarmTime.SubSeconds = 0;" E1 K$ c: E$ z; P, }) q; U2 r
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    0 q, R3 W" l- D" T8 G+ e
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;8 m$ Y2 d  n: T
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;% a$ F! h6 |# _0 u, P; k
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;$ P1 I& R% V3 [; ]
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;! w7 }: C$ i0 z3 f
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    5 M3 F/ ^8 O/ R7 Z1 a& X" C
  38. ( W0 F! X, j4 ~6 \1 d; [
  39. 7 X+ V; D2 F: k& g- G
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)" Q" A" {3 `8 _/ f- Z1 ^* X9 N+ C
  41.     {
    9 {% v% v, E+ N/ N5 Q! A4 y1 U
  42.         Error_Handler();
    2 R0 v8 K2 x7 b" ^4 R
  43.     }0 ?$ v. D4 q* H2 m$ f
  44. }
    9 f; {: v: |9 m! ?# T5 x

  45. % L; f: E9 T3 e
  46. /**0 K0 d0 L( M( c+ K
  47.   * @brief  Alarm callback 闹钟中断回调函数
    : h4 ?; ^/ G5 g5 C
  48.   * @param  hrtc : RTC handle
    7 m6 X% m( J( y' w7 m
  49.   * @retval None
    ( x: F/ y* P; _* Z) z
  50.   */6 x  D: r$ S, D% l$ a/ f
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    ) o+ O* C0 L3 _: [! B
  52. {! U4 a1 I1 G. q- _  Z) \# a7 k' e( D
  53.     static uint16_t sEnterCnt = 0;* t/ i( ^+ v1 @

  54. * J" w4 M+ `& i! k' {7 V8 {7 o2 U
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断
    / Y: x$ e) a0 V$ t
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
    " c, R* g6 P( V) U5 i0 x3 I0 ^
  57. }
复制代码

' i# s9 Y; y1 X* X5 mmain 函数
: K* f6 C. X% ]  _
  1. /**
    0 q6 ]8 e, H$ V; _, ?) {9 i
  2.   * @brief  The application entry point.) W( v6 p% ~0 ]# \/ W8 h
  3.   * @retval int3 O! j0 ~" \6 [6 K  k6 W" |0 @
  4.   */! H/ b5 Y3 r( [" l6 `
  5. int main(void)# |/ `  y% F. ?* W1 S: y9 V0 a4 C
  6. {
    * t3 p+ `% [+ T; ]0 t1 n8 ?9 k* F
  7.   /* USER CODE BEGIN 1 */
    . c1 a" ~& A) x9 q- O2 x& T7 y
  8. % h6 y7 N/ P# U* r' t3 i
  9.   /* USER CODE END 1 */1 t# e/ ^$ C: Z# n* k
  10.   x- e* \5 B) T# W" a' i' c
  11.   /* MCU Configuration--------------------------------------------------------*/
    " }7 k* d, }  C9 `% R7 d; x; D
  12. , E5 z5 s  h1 f
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */6 m7 {. P2 z3 L9 w" a
  14.   HAL_Init();
    3 M* G& X) K# P! F" u' K  o+ k
  15. + M3 i& v% ^, j0 J
  16.   /* USER CODE BEGIN Init */
    $ u5 v6 T, w9 [2 L) H" U2 F

  17.   u: G1 b/ P, h
  18.   /* USER CODE END Init */
    2 [4 A% @* z8 w8 }1 `" S
  19. / L# A9 a1 K* v% G$ n
  20.   /* Configure the system clock */. ?" l! l, |, T  Y+ f3 p" ?
  21.   SystemClock_Config();: V& Y6 F0 h# ?

  22. 9 t0 a0 z8 M; U$ s8 K
  23.   /* USER CODE BEGIN SysInit */7 b  C7 j0 e$ p0 {7 ^

  24. 3 Z$ c( v4 |. @$ Z; j
  25.   /* USER CODE END SysInit */
    3 t: F) w( k/ Y; }) w* b/ y% t
  26. + R+ R  k3 q8 c& D/ T/ Y
  27.   /* Initialize all configured peripherals */
    , v% n; d3 I8 y; f: b
  28.   MX_GPIO_Init();/ ~6 x: R6 v0 H! C
  29.   MX_RTC_Init();
    7 ]$ I# g7 g: {, Y$ V, g) U4 |
  30.   MX_USART1_UART_Init();
      x" j; Q8 i; a0 I3 S
  31.   /* USER CODE BEGIN 2 */1 [0 q- b4 C& @" {' ?" O3 a
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");$ V7 v" L- P+ v, N* {8 W1 {* {$ O
  33.   RTCStatus = 0x01;
    . f7 X7 a& |- U1 n/ c- L' F' s
  34.   /* USER CODE END 2 */) N5 W+ \& w4 Q' `
  35. 8 L/ }: g" C$ e/ }; W; J& I# h
  36.   /* Infinite loop */
    6 ^, w  Z  A, e9 b% D% U$ w
  37.   /* USER CODE BEGIN WHILE */
    * ~! E" m9 d$ b( o# U  l
  38.     while(1)
    ! m4 q3 S# l. C  h& S% z/ P
  39.     {
    ! o8 H/ T. w  ~) B! G+ e- P
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);) ?& d' q' S3 C# ^6 P
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    * v. U& M" z$ y; P+ W  Y: ]* j
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);+ q- U: g) [/ q6 S3 |
  43.         HAL_Delay(1000);
    7 m. e) j3 s  p5 p1 U4 b8 n2 B
  44.     /* USER CODE END WHILE */
    ! r; {8 X1 I/ D
  45. # F3 [  ~! P, Q2 q
  46.     /* USER CODE BEGIN 3 */
    # C! K; K. ~/ y8 c' y9 o
  47.     }
    ' P2 `  S3 ~! p$ o8 G; M
  48.   /* USER CODE END 3 */) T+ t- ]6 u9 d& G8 ^4 D: ^
  49. }
复制代码
4 x0 H/ u$ P9 Y) E, X
主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
/ c. o) d, q# a3 Q  t
, o/ X* ^+ x6 K1 `  e2 w3. 编译并下载测试. H7 ]& f- k! n3 N! S
将程序下载到开发板中,连接串口助手并打开;/ h2 O. o0 O8 \; R' K3 D
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
/ F. u$ o4 m2 n, @2 R7 m$ w  J- l
* ^4 E# F- U. f! X* g9 d. F, I5 T
20210128175241625.png
) {7 u6 M$ T3 O2 }
* S9 s! \7 Y2 t$ A
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

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