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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程3 W2 t0 g4 c7 @1 e
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.# S& {, C; H4 Q9 \; {0 H
6 ^5 v1 z- S; a' e4 x
先配置一下串口,用来打印相关信息$ V6 y1 O( _! w* I1 O' }% c
) T. c: z: b% l) D  N7 M, ~
20210128091458888.png
5 }( u5 D, i0 n0 T8 w( \
+ H; f6 A2 M1 z  T+ Q
再来配置 RTC5 Q: Z# G; C5 v$ W" p) ~
* A* P! A) [0 I9 {
20210128170709886.png
* r% l3 u7 ~! `
% M. `2 w% {( s$ V* ]1 @( v
20210128170837705.png

3 y/ q% Y) S* |+ d6 k; B; e. a
9 n7 q% Z7 T( S8 j1 ?# T5 Y配置时钟% Z' i6 [. b# U* a/ H  w! T
+ S% N; o' `- S3 m9 F' H
20210128171003870.png
3 F! v# \. g* t" O) S

7 _# e) K. x4 {/ h; A; Hps:本实验使用内部低速时钟测试,未使用外部晶振.
( }$ J( C" ^, S$ U! B6 Y
, k( n2 J' y' G- `/ {$ p9 ]配置工程相关选项
, Z; I4 i; _, ?3 {0 d; _
+ {8 O8 d0 V$ O5 F2 y
20210128171144837.png

- ]; F9 A6 ^$ o8 s3 q( Z) |. }9 [) \/ V
配置完成后点击右上角 GENERATE CODE完成工程的创建- {5 o7 Q0 P# w; O- b: G
9 Y# S2 f( J" G4 s$ x0 n
2. 编程+ `1 |3 h5 z/ l# A
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口- |2 |: `2 ]* Q; F; K4 L$ q" m- H+ a
  1. /*设置系统时间*/
    - `* m3 [* M9 d: z$ E$ w
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    : m  ]$ K( x8 p4 J
  3. /*读取系统时间*/  e, }5 `* N7 b* R* z6 t! {
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)" t! M7 n$ F+ Q# k2 Q% B
  5. /*设置系统日期*/5 Q0 N" q% n6 l; }# i+ L: `) P
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)6 {/ q- S8 Z& u1 I+ Y3 r2 P4 W- L6 s) y
  7. /*读取系统日期*/
    % r4 J/ g! ]2 W) m
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    / ?8 H- Q# N3 _( J' u6 H) ]
  9. /*启动报警功能*/! r) r4 G# ^/ _% h7 k; L. w, s- r
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)& ~$ S& D5 G6 K$ R1 Z
  11. /*设置报警中断*/9 I. A) d; f  b5 ^
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    6 M5 w$ j4 h3 n
  13. /*报警时间回调函数*// f7 B( a( V8 V; {- X
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)/ p4 H! C( _' |( \' K0 h
  15. /*写入后备储存器*/
    5 U( v2 u$ ]- x3 T
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
    7 `7 u/ `! Y7 r  r% Y7 I5 n0 t
  17. /*读取后备储存器*/! N6 T0 O+ ^, [8 ]) x
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码

8 `% J. w' `! ?% Q/ ~2 i: B, U2.2 串口相关的代码# B) T4 W  [2 h1 Z/ F* d; L2 }
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
, y6 l( e! Y  }8 g0 n
  1. /* Includes ------------------------------------------------------------------*/
    , o* b7 t% Y7 W: M
  2. #include "main.h"
    - y9 D* S8 {& Y( T1 R% V% O: _2 T
  3. # s0 _2 y. @3 y' X+ {
  4. /* Private includes ----------------------------------------------------------*/
    # h# P& u+ z, K' ?" g
  5. /* USER CODE BEGIN Includes */( g$ h# Y' j; h4 c! n# L* g, }
  6. #include "stdio.h"
    & N3 G& x/ b7 d
  7. /* USER CODE END Includes */& I( ]/ K: M% v7 e5 b
  8. ) h1 v8 u# ~& l: m3 E3 f. ?
  9. /* Private typedef -----------------------------------------------------------*/
    ! u3 K: J. t5 x4 Q9 ~
  10. /* USER CODE BEGIN PTD */
    3 r2 t, J: O2 e% F5 @+ u

  11. 0 p- X' m' y# }) X  t
  12. /* USER CODE END PTD */5 H7 ?6 w; b  C# N
  13. + o4 j0 p6 p7 _4 G
  14. /* Private define ------------------------------------------------------------*/
    2 u* `. ~9 w$ i4 o; E
  15. /* USER CODE BEGIN PD */
    7 B4 ?% a% \! G, y3 Z# h
  16. /* USER CODE END PD */
    8 Z" m: X* R$ U1 @) `
  17. ' a" f: B$ z; F3 f, b. l) @1 [
  18. /* Private macro -------------------------------------------------------------*/1 E% T. P4 l' f# g
  19. /* USER CODE BEGIN PM */  h( w3 i% ^) u' P
  20. " l! Y6 X1 X/ }* _) D, l
  21. /* USER CODE END PM */6 @4 n) Q" H/ R1 a) i
  22. ) n5 P5 j+ y8 x$ \, F1 u: m
  23. /* Private variables ---------------------------------------------------------*/
    ! p/ s3 i. c+ Z6 G$ j
  24. RTC_HandleTypeDef hrtc;5 c3 u+ G2 G  q
  25. 3 b0 c4 V: z3 _9 B$ D- u0 }
  26. UART_HandleTypeDef huart1;
    " _; r6 U1 x5 g0 }
  27. 0 v+ T& K* A2 @! @
  28. /* USER CODE BEGIN PV */
    % J5 j( V7 ^9 L. a1 d
  29. RTC_DateTypeDef date;        //读取日期
    . w/ ^; c5 Y; V" e/ M
  30. RTC_TimeTypeDef time;        //读取时间
    ( R* t2 }$ ]) \
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    1 R3 Q4 x$ \% j5 a" b$ I

  32. 9 U; g6 j3 ]/ N( O
  33. /* USER CODE END PV */
    & z# Z' M1 a8 p

  34. % [5 o# I; h- X
  35. /* Private function prototypes -----------------------------------------------*/
    ; e; R; J) \% k1 e. P  O5 |
  36. void SystemClock_Config(void);
    * w& R& n# O: C6 _) O
  37. static void MX_GPIO_Init(void);
    0 _8 d6 s+ T$ k+ T6 P
  38. static void MX_RTC_Init(void);) d  c* |) {" X. x& ?. [
  39. static void MX_USART1_UART_Init(void);
    % l) I; z1 w9 f1 d
  40. /* USER CODE BEGIN PFP */
    : z5 f5 `* x- x. p
  41. // fputc 函数重映射% v/ F) X# ~) _1 g8 Z% f) U
  42. #ifdef __GNUC_$ x3 ^9 e5 G4 `$ k3 C! Z
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)9 i! |  q% v8 c1 i  ?6 g
  44. #else
    0 b6 _9 ?) _6 N/ o
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    2 `$ m( f" H% D  f$ d" B# Z
  46. #endif4 y! s& p& M1 d
  47. PUTCHAR_PROTOTYPE4 P4 K; m5 ^4 G. o3 p7 U
  48. {% v$ f* Z, {; |1 X9 ^
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    6 y  H' _4 |$ ?* A4 T
  50. 1 v% x% k% U" B0 }' c
  51.     return ch;( R. N' V- S" [/ b& ~
  52. }
    / r- i) A6 r- O0 Y
  53. /* USER CODE END PFP */
复制代码
* ~* `% z5 g! O9 M* u" @. J# v
8 S3 D  d4 |+ F$ @- R
RTC 初始化
- h0 T+ g- H3 ?9 m$ p1 Q2 K
  1. static void MX_RTC_Init(void)& D+ F4 @6 q: G" G, K
  2. {
    2 ~6 A" b1 [; A1 a8 D
  3. % o+ T8 w4 o2 m# A4 L) Q
  4.   /* USER CODE BEGIN RTC_Init 0 */
    ) Y, t; u5 _' v" I) L! ^
  5. , g/ Y3 j& y4 M; u9 Y- {. Q, `* l6 f
  6.   /* USER CODE END RTC_Init 0 */' P; `0 A7 Z5 W% ^8 ~' T) P
  7. 6 t- @* H- h. D4 d  S/ D2 u
  8.   RTC_TimeTypeDef sTime = {0};
    % Z4 i6 [3 w5 g
  9.   RTC_DateTypeDef sDate = {0};- o! g' g$ P8 L# T- ^4 e1 E
  10.   RTC_AlarmTypeDef sAlarm = {0};8 H$ v. ]" C5 K" D# c. g
  11.   {# p* D# N6 l/ ], Z. ~0 g, t, b
  12.   /* USER CODE BEGIN RTC_Init 1 */; l; E. ~  T4 U$ [) s
  13. 3 B* Z8 P$ u4 X, s' @8 U3 T# u; O2 n
  14.   /* USER CODE END RTC_Init 1 */9 e, e  x/ X* q( W
  15.   /** Initialize RTC Only% G4 z1 @: H0 p+ X% d
  16.   */
    4 z0 c0 o4 x9 y( }$ |8 V
  17.   hrtc.Instance = RTC;
    . s) d0 G* x5 g& |' P
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    8 e: |/ ]: l  ^- T, L7 o% C
  19.   hrtc.Init.AsynchPrediv = 127;: v- z% p  [3 E7 f1 P
  20.   hrtc.Init.SynchPrediv = 255;
    3 o* ^5 ]8 U& ?' {
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    * Y/ X# a! p: C. ^# G6 k: T
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;6 _1 M5 x  I: \5 i# I
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    ; \) a, J+ v; R# p) O2 R+ d  m
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    ' N7 n* f' U+ e/ _4 O9 z/ M  m7 _
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    + v4 l" ^  |, v
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK)! @' p! l7 b* H% P
  27.   {  f! U% `  i0 n* f
  28.     Error_Handler();
      q: g2 u/ X% C' i
  29.   }
    5 ^! T+ K! e  t, Z) H* Q  y
  30. : I6 E0 N0 G# S3 g9 d
  31.   /* USER CODE BEGIN Check_RTC_BKUP */
    7 e* G: t& K& `0 E: h8 |* p6 x
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
    ' K2 ^* L& k6 @" A+ y/ q( ~
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA)# ]+ M1 v* n6 s5 {" N4 n! F" C
  34. //    {! @9 F4 V$ }$ ?# r) y7 d  I) [* B
  35. //        //已经初始化过了,直接跳出初始化函
    ( t. s3 y4 y8 G. N6 B" k# I, l
  36. //        return;0 d. R' m  E7 I  ^: q
  37. //    }
    ! w# k: k/ C( r: W5 k
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿0 u( L( }" p; d9 }5 H+ n. z
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    ; v- k, c3 r+ u+ Q
  40.   /* USER CODE END Check_RTC_BKUP */
    9 |9 e$ w3 ~- {3 e4 B' \

  41. % |: O, Y' K$ ?1 k6 B* Z$ D
  42.   /** Initialize RTC and set the Time and Date! W& q9 b0 R8 p& {- X; f
  43.   */! P8 z/ X: Q* G5 y3 C  c$ F
  44.   sTime.Hours = 14;8 @9 q( ]4 G( \: U7 W# g% l
  45.   sTime.Minutes = 50;) v! J' J; f4 a( z( w# D- e
  46.   sTime.Seconds = 0;
    $ p- s! W% \' X9 A1 j5 R
  47.   sTime.SubSeconds = 0;
    . L7 D$ A  V5 N: c8 P
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ' H) [& ^' M3 K
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    - z7 P; K' q+ T) @$ E
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)3 l' r: h4 K+ }5 F" O
  51.   {
    0 u8 C9 q& X' R' J/ R* M
  52.     Error_Handler();1 m/ B8 N; N5 E  e$ v) j- l* g
  53.   }( ], N  l7 L' v) i" c
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    ' j1 Y8 S* W8 A) v0 G
  55.   sDate.Month = RTC_MONTH_JANUARY;: j/ \. J8 ?$ J$ Y3 g
  56.   sDate.Date = 28;
    6 U- s) L2 ~  D
  57.   sDate.Year = 21;+ C% Y( J7 Q! j! Q: h

  58. ( [* u; I# x7 S2 ^
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)8 M7 j  x2 T0 u+ j% @
  60.   {! q/ b' Z8 J/ C& E8 f
  61.     Error_Handler();$ H# `/ I1 E8 ]
  62.   }
    9 K6 U4 G" F9 D9 i/ D* m$ ]% ]. `
  63.   /** Enable the Alarm A
    : g) `- a& `4 U) w% v  I' }
  64.   */
      g" ~) U* @! b$ P$ ]
  65.   sAlarm.AlarmTime.Hours = 14;
    0 T( H8 Z& s( a: @
  66.   sAlarm.AlarmTime.Minutes = 50;
    6 o# l5 b- v% E. _$ i: S9 F$ K
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断
    ! Z" v% m6 T! ~+ k: Z
  68.   sAlarm.AlarmTime.SubSeconds = 0;
    0 A4 j2 P4 }8 l8 V2 f2 X6 s7 K
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    " l5 w8 X: t( g% v5 v5 Q& a
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    0 |; {, A0 d: q6 v/ V2 C
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;6 l6 y. F8 ]. C5 x
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    5 d) Q8 s' r1 C3 E0 z# t' |
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
    " j6 H  a3 R- _3 u
  74.   sAlarm.AlarmDateWeekDay = 28;
    0 Y7 a: e8 r6 W1 q
  75.   sAlarm.Alarm = RTC_ALARM_A;, w2 C* n/ M1 d2 ~
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)0 Y! q& Z0 Y' v* a
  77.   {8 k7 e7 F$ H3 K+ \7 n
  78.     Error_Handler();) r/ A4 S: Z0 ?5 }5 W9 ~
  79.   }
    ) a* A4 g! U: \8 U( Z9 H
  80.   /* USER CODE BEGIN RTC_Init 2 */
      B4 a4 c3 s4 W. o% x
  81. : U9 O2 A9 c0 f' K
  82.   /* USER CODE END RTC_Init 2 */# L9 k! n7 C  _
  83. , U, t$ w/ _+ c: S( P
  84. }
复制代码
) m. \- F$ C8 Q$ u. k
此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生./ W5 J8 s+ p' w" O$ ^
% \: O+ [( t& y5 Q* }# i2 D* V
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
  m3 Y% f) s6 O1 M# S0 G" ~1 ^
  1. /* 设置闹钟下次产生的时间 */1 W" O2 B" k- ]5 L- ]+ P
  2. void setalarm(int hours, int minutes, int seconds)' X7 `8 e: ^' A" V9 ~3 }$ K9 f
  3. {
    : E5 J- S4 q7 V! v, W# F3 N2 J9 b0 i
  4.     RTC_AlarmTypeDef sAlarm = {0};
    ( \- e7 [: \6 ]. ~  A
  5.     RTC_DateTypeDef sdate = {0};   
      r6 V" U' _+ d% A2 t( N: K2 q
  6.     RTC_TimeTypeDef stime = {0};
      z" a7 J. v' H+ P& l" s! `
  7. ( b, |* r! p# t. G/ o
  8.     //读取当前时间 1 M- c0 Y! x: K7 [& @
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN); 4 V0 z4 N; y! K
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
    ; \' Y; d$ S8 d6 z7 o( }
  11.     //获取设置中断时的时间4 D1 r/ U( g# d4 }! f) W* k
  12.     sAlarm.Alarm = RTC_ALARM_A;3 ]! N6 M/ B) P  W$ P
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;4 b8 [) I7 b! n6 r( l; N0 N
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;* s6 i$ J  z1 O5 T! e! n
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;' Z6 a: a( ~" R" Q- W* k! d
  16.     if(sAlarm.AlarmTime.Seconds >= 60)
    2 K, i8 a+ u/ U" _# z0 Q
  17.     {
    1 X4 m% ?8 h+ z& ^, H$ K5 S6 ^3 j
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;1 r0 V! x+ M8 j7 d" Y& H! |3 l
  19.         sAlarm.AlarmTime.Minutes += 1;
    2 y" e6 s" k6 |/ r, x# D
  20.         if(sAlarm.AlarmTime.Minutes >= 60)
    4 Y4 J8 V6 p/ a
  21.         {4 F$ B, J8 z5 h$ m2 Q! D
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    + c9 x& O% T( b" j! h
  23.             sAlarm.AlarmTime.Hours += 1;: ]; f0 D& S, s
  24.             if(sAlarm.AlarmTime.Hours >= 24)
    9 ~2 g3 L  V8 ~( m0 A
  25.             {" \) [) y1 [0 _+ B& b
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;( ~& i- u& |2 Z! x/ Q3 @! }
  27.                 sdate.Date += 1;
    $ c/ i+ D/ i% C6 i$ t9 n0 {/ q
  28.             }
    + Q* N% Y7 y6 p
  29.         }
    ( W) ]) S! g. {
  30.     }
    6 j2 L' P, L- `& ~# \
  31.     sAlarm.AlarmTime.SubSeconds = 0;3 P4 [, i. Q! j+ R: q& j& q" P
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    . a9 `+ [! v, j! i, c# V
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    & g7 G4 S! U- u6 d
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    0 ^  ~" c5 f; N& |" K& {
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;5 f- a  u3 j- H* P
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;7 Q, G' q  o( P2 G& |( d
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意: a. r+ {1 {8 P. Z  y
  38. 3 r  P3 N7 e. L( M# V

  39. 5 B" g! |* U! Y  }* z$ Z
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)& i3 N- s2 n% ~; V; }# x. P' a$ ?- H" I
  41.     {) T( Q$ a' C3 ]  G! Z' a
  42.         Error_Handler();
    & N- Y3 o# T! b0 K. B
  43.     }
    4 [: T7 e$ V8 r! B
  44. }
    ; @. ^: b; l3 L4 M, J$ |
  45. . w  I  u- I+ {6 Z/ Q
  46. /**% K7 z; ^; w1 _9 i% L
  47.   * @brief  Alarm callback 闹钟中断回调函数3 @* n/ Y8 g2 Q, o% G
  48.   * @param  hrtc : RTC handle
    ' p" H! y3 V& E* x/ L6 `# b
  49.   * @retval None, ?5 a2 x# h8 x. k
  50.   */* O6 o, D, D% i( B5 C& w: b4 e3 S( v
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
    # M+ V! r4 E( @1 @/ ~6 @" r7 H
  52. {  F9 l* m6 T. V; f
  53.     static uint16_t sEnterCnt = 0;/ h$ z6 M7 N2 ~3 S7 [4 U
  54.   j8 ]8 H, Y! U% v2 G
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断5 M& ~  h' x+ P. E5 r  l
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);
    + l; u& O! G: H
  57. }
复制代码

" r( U/ O( S2 E! dmain 函数
+ l( D1 _7 x# y/ a6 E9 \. g$ p. Q
  1. /**
    # G% t9 P) v+ `
  2.   * @brief  The application entry point.
    + }# L" o- ^( I& w. z9 h! r
  3.   * @retval int
    , R$ Z# z1 b" _: C! q5 H/ B# O
  4.   */
    9 D" z. x& ^7 [" Y2 Q. J& U8 R
  5. int main(void)
    5 \8 \* i- O) e1 H" J1 T4 D; m
  6. {
    9 D' [+ R4 @. j4 F
  7.   /* USER CODE BEGIN 1 */
    # L( R9 A5 G* U" ^4 A/ S9 r$ V
  8. - a; B, a, D7 |" Y$ V
  9.   /* USER CODE END 1 */
    ! E8 K2 y+ Y0 ?$ o9 R
  10. " l; W, H1 O: g$ E2 z
  11.   /* MCU Configuration--------------------------------------------------------*/  r9 r. J8 |, `5 w% B+ p; Q1 x

  12. $ P3 l) J9 Y! d* h+ E% D" k8 H% p% w7 {
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    / {0 }5 }: x9 V/ a4 `2 G* k
  14.   HAL_Init();
    + v* h, F+ d) Y, g
  15. # G- x3 Q: Q/ Q+ ~" ^; p3 l
  16.   /* USER CODE BEGIN Init */
    % C7 c# y6 P$ V) }, G& F

  17. 4 U' I. |& S' x- S1 t3 N. V  s! M
  18.   /* USER CODE END Init */0 A! t7 o- X$ L$ W

  19. 2 \6 S5 {* M" |" K
  20.   /* Configure the system clock */2 Y! ~# @& z; [% S3 w7 `8 J: R
  21.   SystemClock_Config();
    " i; x, |* v9 z. y6 ]

  22. ! n/ p  J3 l2 F9 ]& J
  23.   /* USER CODE BEGIN SysInit */
    2 Q: l4 _4 s# V

  24. 3 Q& R/ D+ E4 ?2 d# V! g
  25.   /* USER CODE END SysInit */
    . |, b- x$ p" k3 w1 w

  26. / \+ U1 c0 C, Y6 l; U
  27.   /* Initialize all configured peripherals */
    5 W. `" a0 D; [) g2 b
  28.   MX_GPIO_Init();; T6 Q; R6 j& Z8 ~* G
  29.   MX_RTC_Init();" \# U6 P4 C/ E: p" u; e
  30.   MX_USART1_UART_Init();
    7 e8 i0 X% N1 p" g9 g6 F3 A  h
  31.   /* USER CODE BEGIN 2 */
    ( l/ @7 G; C: r! i9 F7 x
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");% R" x% }2 H" a
  33.   RTCStatus = 0x01;! a! N0 X2 Y3 k- d! e" P# d
  34.   /* USER CODE END 2 */- ~0 z* C8 z" m7 P
  35. 0 F2 j$ ?3 \1 U/ n5 G; a
  36.   /* Infinite loop */
    5 y, s: v3 o+ u$ z
  37.   /* USER CODE BEGIN WHILE */
    9 F6 d& ?* p: f
  38.     while(1)2 `3 n! u7 S0 Y" h7 ]& z) |. Y
  39.     {0 |  L1 [  n0 T( }0 W3 f) l: u
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    4 Q% J) R2 q7 @+ o
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);0 t( I* O" U: N( u
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);3 {, }" N7 M) y: c  I
  43.         HAL_Delay(1000);3 p4 i- v2 n' m/ o
  44.     /* USER CODE END WHILE */
    + d! l/ p# l* }/ I/ O1 O) e& C
  45. & X+ `9 Q  s, F- }3 t, }4 b
  46.     /* USER CODE BEGIN 3 */
    2 Q' I: \$ p; q4 |6 Y/ a
  47.     }
    ' W- ?* q& o- T' P
  48.   /* USER CODE END 3 */
    1 M. S/ _% [% K; f( X
  49. }
复制代码

& p! r2 j3 P" b* V3 t. P主函数中每隔 1s 读取一次实时日期和时间,并打印出来.
4 S" {. B) s- x8 M5 [$ n  k( z' s( `3 a9 W# O1 n
3. 编译并下载测试, E4 h/ ?2 c" Y( E7 C
将程序下载到开发板中,连接串口助手并打开;. T+ c( }+ s( B
实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.' E" |* V- C3 E5 J/ I
5 ]/ @& I) Y5 C
20210128175241625.png

# ~. J$ ^$ O; B  i3 ]# ]2 Y* \, b
; i* S  S! H5 y7 Y7 P0 @
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

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