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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 18:02
1. 使用 CubeMx 创建 RTC 工程
2 O6 @2 `& }0 B! O9 ^' [打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
. y2 K+ W7 u( g. R
, \( U/ }' }% \* N* E2 h先配置一下串口,用来打印相关信息( }/ C% ~# f: Z# Z. J
: S' x9 L) _4 {" q; A# ?
20210128091458888.png

3 q( f5 v' G6 E8 r! A% i5 p9 l6 J
再来配置 RTC
0 l' E# w( _# o6 B( w' A
4 ]; Z+ n4 q5 b5 J) L% s7 ?! d7 q
20210128170709886.png

6 U: \9 E( t* }: V; P7 a5 r# f; y. n  c& k5 ?
20210128170837705.png

- y3 c: h. p. f# Q; w5 K+ n* @4 A, Z3 m* R
配置时钟8 n9 K9 M! h7 R3 I5 w
3 B4 ~% `% \" M' j- ], z" V
20210128171003870.png
+ e& ^8 u8 g% d2 x3 T' a

& n: T5 i4 Z  v1 W" m  Dps:本实验使用内部低速时钟测试,未使用外部晶振.
8 r# m: M4 E* Y9 C. S$ N- y+ ?) f- ], t+ T, r! j/ j5 p
配置工程相关选项
+ E5 x" A, U: u3 G/ U7 q
4 X! q( V2 r& }! Q8 h0 C5 y
20210128171144837.png
% c& P6 h0 K7 _: Z5 z& N

' u. p5 h% f9 B3 d% v9 M6 M配置完成后点击右上角 GENERATE CODE完成工程的创建5 N2 f# r5 y3 w, v/ R

% [- d' b4 ]7 Z3 I2. 编程# z+ f. t' l* g3 Q) `
2.1 熟悉一下 Hal 库中 RTC 使用到的相关 API 接口
; d5 J5 L4 _  L! ?' U
  1. /*设置系统时间*/
    ! Z$ z6 z! g* [5 ]7 V7 N% G
  2. HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format) - f: \. `0 X4 A2 m; y
  3. /*读取系统时间*/& L: Z. T% Y' L7 h1 {. R( \4 F
  4. HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
    ( a. u0 D3 z+ S7 z, {' a- i
  5. /*设置系统日期*/7 r. `. h$ Y9 Z- P8 M3 y7 ^
  6. HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)) h, `8 u- X, e" n# X
  7. /*读取系统日期*/5 A! n& E. `3 G$ c, X! Y
  8. HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
    " `- p2 Q/ H  p7 S- m
  9. /*启动报警功能*/
    ' S' a" m; X; f
  10. HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
    1 [4 Y9 [8 _( ~* h
  11. /*设置报警中断*/
    ( q2 m2 s; \# c; u7 O
  12. HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format): _7 {% ]. Z: k. ~& f
  13. /*报警时间回调函数*/
    2 K4 C# c; |5 o) [
  14. __weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)! Q( q0 o6 t  q0 z; o
  15. /*写入后备储存器*/
    ( j2 O) Z. k$ q1 M$ s
  16. void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)5 ?! i1 l- f4 t; ~
  17. /*读取后备储存器*/' A% m% {% c) B1 C
  18. uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
复制代码

7 f, q7 Z" D" c, a/ u6 u0 I2.2 串口相关的代码/ h6 V  C& m0 K( p
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数( y  {$ J, x$ m* e
  1. /* Includes ------------------------------------------------------------------*/
    3 S" I; s  C" n, f# R+ v7 S" ^! B
  2. #include "main.h") e% k1 f$ Q* f# {$ W

  3. 3 _/ P; y  }# v$ g6 ^
  4. /* Private includes ----------------------------------------------------------*/
    7 p: c+ Q+ B; f3 G8 Y5 j/ ~4 D4 u; _5 q
  5. /* USER CODE BEGIN Includes */7 ~1 I" J% }# Z: b$ j
  6. #include "stdio.h"" p$ a+ V# D8 |7 Z+ e1 R9 U4 U
  7. /* USER CODE END Includes */5 s* y2 g% i. P$ d
  8. . b5 V) C7 g8 A2 |$ j
  9. /* Private typedef -----------------------------------------------------------*/$ N$ m7 Y5 ]( y4 |& `$ y' ^& O
  10. /* USER CODE BEGIN PTD */# r" y, W% K2 u

  11. 6 R+ P7 I7 l7 Q% L& F
  12. /* USER CODE END PTD */
    : ~8 S' @( ~; N4 \0 u

  13. ) t( z8 H( H) u' ^
  14. /* Private define ------------------------------------------------------------*/
    1 n8 R/ `6 e! T; P5 z4 V( @
  15. /* USER CODE BEGIN PD */
    8 U( g; `* U) ?7 V' ]
  16. /* USER CODE END PD */( o/ M+ |! O* ?, l* k; C1 P: f: k
  17. . I1 E7 Y# q+ ~+ D; Q
  18. /* Private macro -------------------------------------------------------------*/; k6 u/ i+ u" O6 [3 b* K. b
  19. /* USER CODE BEGIN PM */
    6 T9 O& C- d* a$ u: D. {* j
  20. & [9 Z% x3 B# J* g" ]0 U9 q# {3 ]
  21. /* USER CODE END PM */, O9 f: C6 a1 T, n! l4 a& @' Q+ L

  22. % R  U# T0 B# s7 A( G4 q
  23. /* Private variables ---------------------------------------------------------*/% V8 h2 K* Q2 U0 g, |
  24. RTC_HandleTypeDef hrtc;
    7 Q5 o- d7 P! Y) W. e. d  P! i

  25. 7 n( n4 T' Q# w1 e0 y
  26. UART_HandleTypeDef huart1;
    % A, S. U. z  e

  27. 1 K/ ^, y7 k( ~/ g
  28. /* USER CODE BEGIN PV */+ `, M  K$ P6 W0 [8 }: H( T# I, g
  29. RTC_DateTypeDef date;        //读取日期
    3 Y. |) h, i+ t! A9 k; D
  30. RTC_TimeTypeDef time;        //读取时间6 c8 o3 l9 U2 n/ L2 {7 S
  31. uint8_t RTCStatus = 0;        //指示RTC状态
    & k% q- }6 o) X4 V; n
  32. 8 a" |+ F$ v8 I/ e# ^6 N- R! X/ H
  33. /* USER CODE END PV */0 d* r/ ]0 s. ~7 B; w+ E4 N. `

  34. ' ?8 K& q! K$ d
  35. /* Private function prototypes -----------------------------------------------*/
    - r% W6 D+ Q" W( a7 S$ l
  36. void SystemClock_Config(void);/ e& R5 \0 n/ q: H0 Z( S* z! F
  37. static void MX_GPIO_Init(void);4 W3 j- M3 p7 |( s
  38. static void MX_RTC_Init(void);" p8 s2 M* E& Y% J  X# A4 A- w4 {
  39. static void MX_USART1_UART_Init(void);. ^% v. u; o2 q8 a& t1 x
  40. /* USER CODE BEGIN PFP */
    4 m8 `0 i6 O+ ~" s. q& w
  41. // fputc 函数重映射
    # q/ c  l3 o8 n/ |
  42. #ifdef __GNUC_
    * c3 {6 }. l0 {3 x' w* z
  43. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)% C( f, z, C6 T* b% u8 Y
  44. #else# m; `& r1 Z) R7 L4 h; K$ ^9 g
  45. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    , G5 m1 Z" d9 e* x
  46. #endif; r$ v& {' T: e; w
  47. PUTCHAR_PROTOTYPE
    ) o/ S+ d6 \1 s, }9 V4 {
  48. {) Y+ ?  s+ W7 B. e. Z6 i9 H
  49.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);& l4 v% y9 w$ u
  50. . X/ s# B. M6 _! c1 O" J, t4 b
  51.     return ch;
    # n% F5 c0 j) `( [& G% j
  52. }
    / }, I* X2 a& U
  53. /* USER CODE END PFP */
复制代码
" \0 b# ~/ T# O  S' A5 j, [" z

9 q% {2 {% `7 uRTC 初始化. d$ c# k. ?( N8 Y/ y7 f
  1. static void MX_RTC_Init(void)
    , i  |) K; q; [
  2. {9 p) n* T/ L9 i. l0 Q0 ~

  3. 6 T+ H# r- r: w! b" Q6 l" e
  4.   /* USER CODE BEGIN RTC_Init 0 */* z8 D* o: u# B

  5. ; Y9 T8 S& G! ]
  6.   /* USER CODE END RTC_Init 0 */
    1 E1 I1 I1 [5 O' M

  7. 0 o+ Q" x9 V1 o$ P( @8 E0 e
  8.   RTC_TimeTypeDef sTime = {0};
    5 \; K  ~# q. @3 P4 W8 d
  9.   RTC_DateTypeDef sDate = {0};& p$ S4 Y0 L& ^/ I  y( H
  10.   RTC_AlarmTypeDef sAlarm = {0};
    % Q8 {5 K1 c# P8 L4 i
  11. , H3 C9 M( {  h" }5 r* {$ G. P, g( }8 u7 h
  12.   /* USER CODE BEGIN RTC_Init 1 */0 ?* p9 A: Y, Y9 ?# ?  z7 E0 f
  13. 6 Y2 W6 F* I$ e$ t0 v2 o2 x
  14.   /* USER CODE END RTC_Init 1 */5 q2 R  F4 A7 U( l5 g
  15.   /** Initialize RTC Only. C! o7 y9 P3 P6 P
  16.   */
    - Y' ?8 v5 G: c& s
  17.   hrtc.Instance = RTC;% @2 j9 ?" ?( `, n  E4 D$ \
  18.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;; I, t1 t& s! _& c6 Y& G8 N
  19.   hrtc.Init.AsynchPrediv = 127;
    ; ]' \" y( d8 ^8 ]+ G" J
  20.   hrtc.Init.SynchPrediv = 255;
    . w. }( q/ P9 }
  21.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    ( g( }& Q9 Q! `' Q
  22.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;0 L2 ~- \( X$ j
  23.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;: I6 P; x1 ~- I5 g3 `/ D" F0 v
  24.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    + t; _) v; ]3 Z
  25.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;7 ?3 S# e# v( f. R5 ^
  26.   if (HAL_RTC_Init(&hrtc) != HAL_OK). ~% j0 q7 }% d: C
  27.   {9 x" K4 [  n1 U7 u- P& b% k# B
  28.     Error_Handler();
    ! n; |( p7 P- F
  29.   }
    1 f- B8 v0 _3 H" H. K1 u

  30. % `/ {! v- x, {0 n% q
  31.   /* USER CODE BEGIN Check_RTC_BKUP */1 \( a1 U5 ?0 @: U
  32. //    //重启后判断该寄存器是否有值,判定是不是第丿次初始化,是否要装载初始倿
    $ A# A- c. M* i) c8 E
  33. //    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == 0xAA). ]( K( c4 t( t  [" A
  34. //    {
    3 d. a0 k, A) |& F% @* X
  35. //        //已经初始化过了,直接跳出初始化函- x" G, p8 d5 v* G
  36. //        return;
    ( U  i% `$ V! |1 J/ [
  37. //    }
    + [% X+ J. x2 q; W. y
  38. //    //第一次初始化,将任意后备寄存器写任意值,做个标记,标记已经初始化过了,下次系统复位时不用初始匿
    3 L/ J, ]9 P8 O2 b" u' I& M. u
  39. //    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0xAA);
    ( n2 a2 X. c( a% `
  40.   /* USER CODE END Check_RTC_BKUP */. N$ U: g) F6 N( I! e3 A

  41. 3 ?% h! p0 E  }: M
  42.   /** Initialize RTC and set the Time and Date; F+ |1 M( a  t7 A9 C8 ]3 m5 j6 T
  43.   */
    4 S$ o1 Y+ f0 x: W4 M* Y4 U
  44.   sTime.Hours = 14;2 u+ a: r& C6 j! g! x1 U( G
  45.   sTime.Minutes = 50;+ [5 j4 }1 D$ g- y
  46.   sTime.Seconds = 0;
    $ a) t3 s& E1 x
  47.   sTime.SubSeconds = 0;  [, Z+ g7 Y/ b& [# i
  48.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
      a3 v3 s) p1 Y+ j; C% ?" h
  49.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;) d2 J9 B8 `/ A" N& [( M0 A) e# w
  50.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
    7 N: P' ^1 u" }' X% ^0 b
  51.   {
    / }9 Q5 S" l: g( B+ a  w1 {
  52.     Error_Handler();
    8 t6 O& t( g7 J8 S( m# n) t) [
  53.   }1 c5 G% T6 c% O2 }- p
  54.   sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
    6 `& I* q) r3 F- e
  55.   sDate.Month = RTC_MONTH_JANUARY;! L% ^  k( L0 Y! C6 W" ~, Q
  56.   sDate.Date = 28;  @: I- M* _2 C
  57.   sDate.Year = 21;
    + T$ t5 Z4 P3 ?$ W! U! H3 B3 [
  58. # ]: k  L7 i  T7 e- e  E
  59.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    * j: z4 l. n" h0 s, R3 M# w$ G: A
  60.   {( e, }, r/ s/ W, x* c
  61.     Error_Handler();9 T. z1 a! S7 G2 O
  62.   }+ }5 {0 B6 b' V/ @4 {$ b
  63.   /** Enable the Alarm A( k* ~# @. p- _% M& ^/ Q" s* d& H; Q6 q
  64.   */
    $ z/ [: D  S. l! L* M1 @1 s! N: ]
  65.   sAlarm.AlarmTime.Hours = 14;
    7 Y) S! ^+ M$ B) ]5 M8 d
  66.   sAlarm.AlarmTime.Minutes = 50;
    ' a& t+ m$ r8 a, `  e& _8 H
  67.   sAlarm.AlarmTime.Seconds = 10;        //设置 10s 后产生闹钟中断7 I7 g: W( E% B- N9 S! N  B4 i
  68.   sAlarm.AlarmTime.SubSeconds = 0;  D! ]6 P  F' {
  69.   sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;! r/ R0 m1 h% L9 P7 \
  70.   sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;7 n# v" f8 z$ V  a$ K: s# ^6 e
  71.   sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
    " Q" h4 I6 d$ C6 N7 X
  72.   sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
    ; d. L/ ]8 b6 C' m5 W/ X
  73.   sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;# ^* \1 v5 v( s
  74.   sAlarm.AlarmDateWeekDay = 28;7 J; _/ o# M' d' U8 v
  75.   sAlarm.Alarm = RTC_ALARM_A;
    # S0 e1 j5 a) D  e, U) T
  76.   if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    # ]: R. }1 E4 H, l. z8 U
  77.   {
    % d+ w9 k& N' s- W  S& l) z
  78.     Error_Handler();
    & n; x: n! _! i' L. ~+ s
  79.   }
    . E$ W+ t. _8 i( B/ i: c9 f7 b5 n
  80.   /* USER CODE BEGIN RTC_Init 2 */
    3 F" U6 [4 d* c* {

  81. - R% ]0 y, \. S1 y9 m
  82.   /* USER CODE END RTC_Init 2 */
    % j1 J, N6 q4 Q4 R& _0 q; Y
  83. ( T, R6 \: w. Q7 I0 p6 o' c
  84. }
复制代码

1 i4 G  k  j( L$ |) R% Y- X9 N此初始化函数中 设置了当前的时间和日期,并使能了闹钟中断在 10s 后产生.
/ M/ B1 Z2 h* ?) C. T( @6 ~1 F7 S4 k3 ?& v, n: C
配置 RTC 闹钟中断的回调函数及设置下次产生闹钟中断的时间函数
8 `/ s+ n# v. K' x) F; E( [
  1. /* 设置闹钟下次产生的时间 */
    # G+ Z+ s( s/ Y
  2. void setalarm(int hours, int minutes, int seconds)* S0 R5 i& f* U; x% n
  3. {
    ; W( O/ n3 T+ i' d/ i
  4.     RTC_AlarmTypeDef sAlarm = {0};; J# ~5 j3 |) g9 h5 Y+ o* y- D
  5.     RTC_DateTypeDef sdate = {0};    , ]1 p3 k. J9 L( M6 A
  6.     RTC_TimeTypeDef stime = {0};
    ! b0 K  E+ Y% u# ~' L
  7. 8 ^% g' Y& ^' e
  8.     //读取当前时间 - F) X5 ^5 C4 M
  9.     HAL_RTC_GetTime(&hrtc, &stime, RTC_FORMAT_BIN);
    0 ?+ R3 @6 Z1 S3 m( f, I% Q9 ]
  10.     HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);* y# b0 R; |8 Q- B$ \
  11.     //获取设置中断时的时间, H4 v2 E" A/ Z/ b1 R+ P4 ^$ d, @
  12.     sAlarm.Alarm = RTC_ALARM_A;, z& J$ I0 {0 R# P, F6 V
  13.     sAlarm.AlarmTime.Hours   = hours   + stime.Hours;
    0 W& c. Y* @9 q5 }$ p7 O, I5 L$ q
  14.     sAlarm.AlarmTime.Minutes = minutes + stime.Minutes;
    ; q# V& x* N( T" K
  15.     sAlarm.AlarmTime.Seconds = seconds + stime.Seconds;: X9 _9 Y1 ]( f6 r
  16.     if(sAlarm.AlarmTime.Seconds >= 60)
    ) D4 w% ]# p  t  h7 U% }4 _3 g. m8 b* \
  17.     {! O! C5 w. z% V$ o3 `* I# r
  18.         sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;/ \$ S. h7 k# u
  19.         sAlarm.AlarmTime.Minutes += 1;
    0 p3 k. O1 ?, d
  20.         if(sAlarm.AlarmTime.Minutes >= 60)
    ( G) W; G! K8 F6 E
  21.         {
    ) O( D$ c8 v, Y" Y  w* r
  22.             sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
    6 ^( R4 ~+ s4 ?
  23.             sAlarm.AlarmTime.Hours += 1;
    , g5 k. U: r( L" H
  24.             if(sAlarm.AlarmTime.Hours >= 24)
    2 k# i' Q$ o0 J' ]( A4 l( m+ r! _
  25.             {3 l: c" N& P3 x' V' b6 S# }
  26.                 sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
    + g2 T, z: x! p
  27.                 sdate.Date += 1;
    6 w3 Q1 N; p0 b* R3 R2 L& A
  28.             }
    1 s6 d( |' D) P2 O* \2 \: U
  29.         }6 Q# Z6 U  t$ `, r  q7 D
  30.     }$ I% r5 ^# I- R+ u/ {! ^
  31.     sAlarm.AlarmTime.SubSeconds = 0;# P( ]9 P" |7 z8 z$ E
  32.     sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ( o7 Z% y8 z6 _
  33.     sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
    ' J3 c/ v  }+ {- N; u, `  P
  34.     sAlarm.AlarmMask = RTC_ALARMMASK_NONE;2 i  w; @# x7 ?- j5 P
  35.     sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;* {' ]( X9 y: `" w: k7 E
  36.     sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;+ n# d( Q6 c( n" C$ z' p; r
  37.     sAlarm.AlarmDateWeekDay = sdate.Date;   //跨天数定时,需要注意
    7 n9 m% k# n" H+ _3 ]* P
  38. % p- Y+ U$ A2 W4 f6 |

  39. " w, ?- [* d3 p( c9 f7 N
  40.     if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
    " a$ B; c+ G$ Z8 L% S% `
  41.     {; i# Z$ N  L6 Y! K: \* |8 f2 ?
  42.         Error_Handler();
    & K. l/ S9 \5 z
  43.     }% ~7 m7 ~: m, K; r
  44. }
    2 ^! m& g% D3 f: @% C/ T# U" s
  45. 2 F" v7 I' Q& u9 {7 m- X
  46. /**
    " l, Q7 J% o: }4 s2 B8 g) B: w
  47.   * @brief  Alarm callback 闹钟中断回调函数3 f- o8 ]0 G1 f" k; v2 x
  48.   * @param  hrtc : RTC handle1 p. p4 i$ l! e8 G7 E
  49.   * @retval None3 g; q/ ^2 Q5 Y  e7 L: y
  50.   */( x& U- B5 \& L2 ]% M, U7 l
  51. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)% d; k! P' e, \# F# A# ~* Z; [" o9 [
  52. {
    ' v3 H1 A2 A7 h6 W8 j
  53.     static uint16_t sEnterCnt = 0;
    / V) b3 b  V% W. x
  54. 8 j8 C* O" y, i% D
  55.     setalarm(0,0,5);        //设置 5s 后再次产生闹钟中断, q& r2 \( H8 t, ]* ~& ?- Z2 m
  56.     printf("Alarm A Interrupt Cnt:%d \r\n",sEnterCnt++);2 @7 [+ p1 X& i
  57. }
复制代码

* o6 Y3 f* L* ^# U; ~; G! B9 lmain 函数
) U. o; f9 X: \) T8 b0 K, [
  1. /**
      @' _3 Z; A; M+ v% i
  2.   * @brief  The application entry point.
    + e: M; W: m) d$ g
  3.   * @retval int, ~1 z# N/ Q* O* U
  4.   */
    ) i. h9 U) T& F9 _
  5. int main(void)
    4 @( Z, h4 ^4 Q7 k; p8 l/ _! `
  6. {8 ~# W2 ^& _# z. Q& f
  7.   /* USER CODE BEGIN 1 */
    8 R$ w1 \$ _' Y, N; Q9 |
  8. 5 B. m+ E4 F6 w& W2 f, _7 M
  9.   /* USER CODE END 1 */
    ! X# ~$ _0 P$ D: ^+ B9 h: J  e0 p

  10. & D  n) t: b+ k/ r
  11.   /* MCU Configuration--------------------------------------------------------*/
    / j8 x& w$ X( F: e2 q
  12. ' f  x; {  B4 t6 i* L
  13.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    . n& Q  A  E  N3 o& ~# @
  14.   HAL_Init();
      X% K# _1 ~" e5 P: M7 H. k6 i6 X
  15. 1 g1 ]8 T! D7 H' w; U* M& f
  16.   /* USER CODE BEGIN Init */
    0 X) }6 L% x& p( m' F& C

  17. / U( A: M4 N& Z
  18.   /* USER CODE END Init */
    7 a+ j; r& z( F0 i# Q. B
  19. . ?/ h) r9 \% P8 _' m' ^8 f3 h
  20.   /* Configure the system clock */; l4 p, c# d. P3 d$ u( p
  21.   SystemClock_Config();. A4 J2 n6 ~! C. v% t; @, r2 a

  22. 9 V2 \2 \6 s# X
  23.   /* USER CODE BEGIN SysInit */) K" D/ J1 z8 J% B
  24. % v, H& @) y9 C6 C4 a. l( F
  25.   /* USER CODE END SysInit */
    8 z2 i! j0 E) s8 |% b6 W
  26. $ M  h$ A+ n: w& |+ E6 y6 W( e
  27.   /* Initialize all configured peripherals */
    * z/ o( d- v2 N
  28.   MX_GPIO_Init();
    ' w1 A0 Y' o2 |9 q
  29.   MX_RTC_Init();
    ; {+ L. S% y0 B& T( [( V
  30.   MX_USART1_UART_Init();
    - U4 [$ ?4 ], v" B0 W" Q0 J# s/ ^
  31.   /* USER CODE BEGIN 2 */
    2 K; W* e+ m/ ~1 S4 L& ]' h/ o7 |$ }
  32.   printf("stm32g030f6 rtc & alarm demo start......\n");
    0 T( `  O: t* p8 y. S
  33.   RTCStatus = 0x01;' A2 I0 p, Z5 s; x* z6 J, ?3 v. k
  34.   /* USER CODE END 2 */% c4 a5 J: j( E7 F0 w: X
  35. % s! F# l& S+ w& z3 d+ Y1 `  [
  36.   /* Infinite loop */
    - |+ F) J* ]* r0 g: J* e; H5 _
  37.   /* USER CODE BEGIN WHILE */& M6 n% f* q5 U+ D# t
  38.     while(1)* O( v' H! u( i$ m2 I
  39.     {
    1 Y5 g) x1 f" u# B9 X# z: o
  40.         HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
    ( `0 n: h0 V* b( m
  41.         HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
    % ~$ E  n+ V' r3 j$ ]. l
  42.         printf("20%d-%02d-%02d %02d:%02d:%02d \r\n", date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds);
    . P/ q% _$ ~+ `9 E
  43.         HAL_Delay(1000);
    ) W/ B& G  i6 |4 Q- r1 k
  44.     /* USER CODE END WHILE */  G; V: n- u! [+ O, J8 n4 \2 Q

  45. % |) E; x0 x4 B7 i3 c
  46.     /* USER CODE BEGIN 3 */$ h' n6 M; _* R% j% p* S
  47.     }
    4 p5 t6 O5 K  Y
  48.   /* USER CODE END 3 */5 V' {4 ?  X+ R) o  n
  49. }
复制代码

; L* F  h/ j! d主函数中每隔 1s 读取一次实时日期和时间,并打印出来.  f! \3 t- v8 F) }: @0 G
0 Q. o0 g7 g& s% `
3. 编译并下载测试0 A; F3 N9 o9 D0 m2 c2 q& ]6 d3 e
将程序下载到开发板中,连接串口助手并打开;
( b% v; i* m. B5 q; v4 S8 u; l2 X2 z* V实验现象: 打印实时时间,10s 后,第一次进入中断,并打印进入中断的次数,而后每隔 5s 打印一次进入中断的次数.
& V! K: i" [" ^5 W# W3 q: M
* e. u+ x) ]% y* I1 O$ G8 ~
20210128175241625.png

) n: S5 d0 C+ F: `; D: d3 N' ]4 U4 E  h6 Y# K2 U! x% o5 U
收藏 1 评论0 发布时间:2021-11-10 18:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版