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

【经验分享】STM32CubeMX配置RTC——基于(STM32G070+STM32CubeMX+HAL库+RTC)

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:
# d% x) M% H% m通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。5 g: I# A/ A& W# s) V+ p
1 @6 U+ u, _: V  J
一、STM32CubeMX配置如下:! N2 g' r# s  X% J1 H
1.时钟树配置:
4 x& ^" M' t3 l: w4 M因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:2 @* A$ q- a* z9 j
" y* N8 V+ V7 t# h1 U
2020090915425866.png

8 p; T2 `& q& M7 z: k9 g
. V% |- w) C# a! b# k( N- ?6 R2.RTC配置:
1 R, S) x( W6 _
$ M; o" t* l8 I
20201217151841576.png

1 C2 f" I5 l, H! y3 w6 q5 P
1 x; o" o) W6 H. w(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:
! Q/ P$ s2 x& L8 P; g: c
4 T4 x% N# Y1 t" g- I9 ^7 b
2020090915482431.png

' I% Q% F7 C) v; ~1 o
7 z, t" c3 ]$ ~, {& ^/ @( @" A, m
2020090915483789.png

; `* O5 k4 H: r0 G0 @0 ^+ s
% ~" R; m# I1 K1 n因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:  z% h; D# k( c& {0 `8 S

! T. ^( |' q8 z5 g2 [+ R: f" {Asynchronous Predivider value :127
6 p8 T+ e3 s; Z) m* [) l( w, vSynchronous Predivider value :249
) \& L3 M" M6 N4 D
( K& o$ A7 V" G( M, e5 p5 G2 Y8 M(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
' b# O, N7 u; t  k1 ]' o二、STM32CubeMX配置生成的HAL库如下:4 r" ]- ]/ b$ {! |! H8 }5 b( J
  1. /**
    - {; Y- Z+ L, W: h# O8 R' ~
  2.   ******************************************************************************
    2 g* b8 F& I4 R3 a" U
  3.   * File Name          : RTC.c* G" g" m$ E' V: W/ v3 Y* D& |
  4.   * Description        : This file provides code for the configuration
    4 m& P. s0 w5 W6 `2 B) c5 P
  5.   *                      of the RTC instances.9 U( l7 g8 k  P7 M- G2 I, O2 f6 M
  6.   ******************************************************************************
    & N+ ?; M9 k, ^. m1 N
  7.   * @attention
    . j8 ]; P7 T2 e5 D1 f8 M
  8.   *
    ) ~, \! a, p5 C" N7 y8 B
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.
    ' o0 e/ j, ]; B4 @# ]# X" Z& }7 S# P
  10.   * All rights reserved.</center></h2>5 g' r( ~4 g7 M8 A, p
  11.   *2 J: N- r$ r7 S4 B( I/ j
  12.   * This software component is licensed by ST under BSD 3-Clause license,; X* X3 I7 ~! C
  13.   * the "License"; You may not use this file except in compliance with the2 Z. u0 e, n8 Q6 d; f4 e
  14.   * License. You may obtain a copy of the License at:
    ( w- ~' {% t" J/ m
  15.   *                        opensource.org/licenses/BSD-3-Clause7 d* M6 I2 c4 h+ N' K& x2 ]
  16.   *
    / _5 [3 s3 K2 X2 g( m+ C* g' D( E+ R
  17.   ******************************************************************************
    % t) e" J1 j7 \4 T; `4 P* _4 z
  18.   */
    ' ~: e1 A. L; }, v$ s- a, n
  19. 5 T* l9 z* X6 Q  w  K" S" I
  20. /* Includes ------------------------------------------------------------------*/+ ?4 b# k6 ?8 r8 K) a! \& }0 e
  21. #include "rtc.h"
    ; ]$ p7 X, A, g6 w. g/ l+ b

  22. - G9 [! n! K- ?- _3 R5 s
  23. /* USER CODE BEGIN 0 */
    , _7 {6 |0 o! S0 r) g; h  H9 F
  24. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä+ I/ \* }% }1 b( s4 e
  25. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ' Z- C1 k, `5 i7 c: p
  26. uint8_t RTC_READ_Flag;- Q9 b4 W: E5 N/ U; Q, b/ I
  27. /* USER CODE END 0 */8 U2 v# _8 u% ^9 d  e3 {1 E

  28. 3 K8 c! q, y. \' A% _* e
  29. RTC_HandleTypeDef hrtc;
    ! P: _& M' p$ J& }0 W6 R& c

  30. 4 D1 I/ P4 w/ V' `( W/ P
  31. /* RTC init function */
    * \) {( ^! f2 a# q3 U8 T
  32. void MX_RTC_Init(void)" f, ~; j5 y, {9 ^. [, D( q( A3 a
  33. {( p' w8 c+ @! j
  34.   RTC_TimeTypeDef sTime = {0};
    3 X) U7 L" W3 H# w3 l" @+ ~
  35.   RTC_DateTypeDef sDate = {0};
    5 y1 |4 L2 V7 ^8 ^* w
  36. - W! X4 d% ~" g
  37.   /** Initialize RTC Only
    2 V* ^6 e3 c0 \+ _+ D/ i+ K# w2 D
  38.   */
    8 v. n- g- [5 y* g
  39.   hrtc.Instance = RTC;
    3 I0 J7 ]. h  j& p7 x) s
  40.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;2 Y+ [* u' Z* ^5 T9 V5 c
  41.   hrtc.Init.AsynchPrediv = 127;
    7 q. t& j4 A( I  V5 ^
  42.   hrtc.Init.SynchPrediv = 249;0 ?& |4 a+ w& v: J8 Y
  43.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    2 M; d/ t! a9 E8 |8 s8 Y. y" C
  44.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;: [4 a2 F/ G7 A1 }& @! S. |4 h
  45.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    , N2 v( w; A3 n$ i# }: |
  46.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;$ P% @% h0 x! }; _8 [/ V5 X' G
  47.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;  d: s' P- y! _* N, Q
  48.   if (HAL_RTC_Init(&hrtc) != HAL_OK)9 t5 W' S8 g. g( b
  49.   {7 P0 `, k- x6 H
  50.     Error_Handler();
    ) y; N4 o! z0 R4 Q2 X8 n; E: }
  51.   }
    # ~+ J" S9 G7 {3 Y
  52. % ~. s/ ]1 I) F2 Q
  53.   /* USER CODE BEGIN Check_RTC_BKUP */
    % E9 r/ z/ n& J4 H9 E5 b, v: }

  54. # Q6 f* r# M; I% K5 e/ v
  55.   /* USER CODE END Check_RTC_BKUP */  F( S/ @6 G0 [' p) c; c6 L9 H  C: f
  56. - H8 T3 m% r7 {& @
  57.   /** Initialize RTC and set the Time and Date ; v( g4 Z  h2 j: Z
  58.   */+ O0 o/ y- d( O' ~* L* Q: R7 j0 L
  59.   sTime.Hours = 19;, L8 I8 ^# B# i
  60.   sTime.Minutes = 07;
    ( f. n. K6 y7 f, O  f) v6 v/ ^
  61.   sTime.Seconds = 00;7 {2 A. w% R) i3 |
  62.   sTime.SubSeconds = 0;
    ' k1 }$ s1 P  o* i3 Q
  63.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    & G' T& X" a- n7 t0 i' S
  64.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    $ M0 H6 i3 i' q3 k$ _
  65.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)/ c0 E$ j$ t0 m% ~0 L
  66.   {
    4 p( Q; L# p( R4 |. C; q" K( M5 k
  67.     Error_Handler();& ^1 x' a) e' M9 z" l7 D+ O  L- c
  68.   }) O; V$ a, i/ H/ v4 F0 m# p2 d( j& n
  69.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;1 y6 |1 F' ^$ L5 U$ ~. B) {
  70.   sDate.Month = RTC_MONTH_SEPTEMBER;/ L% l  X! t3 C: Q
  71.   sDate.Date = 8;* {- f* k: f- A2 k( [1 {. _% G
  72.   sDate.Year = 50;' ]; C; L; o5 i  i
  73. - ^! K; |1 j8 a6 z. T1 n$ K
  74.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)- o0 e% x; n8 B, [) \) l( A
  75.   {" F" t7 Y' ~5 m3 o
  76.     Error_Handler();% `" l1 I/ H5 m+ [
  77.   }- Z" t3 L% G- |9 z, k. x; n, u+ o
  78. : U& ?& \  P/ C. h5 V' R, S
  79. }
    : w9 a/ K$ z( m& y
  80. 9 Y8 T3 E$ k! e; y9 S% g8 O
  81. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle), o8 c9 f5 L! ^# p! C, w$ Q
  82. {
    6 Z  }  y! @- J  ]
  83. 1 D8 T. k! c+ b9 x# H( Q& t
  84.   if(rtcHandle->Instance==RTC)
    & v  b, {6 S& S) r
  85.   {
    & T. U6 z& K$ R- ~" K
  86.   /* USER CODE BEGIN RTC_MspInit 0 */
    * a/ R: D6 b$ J2 o) ?+ ?
  87. ; \+ A4 b- e& }3 O
  88.   /* USER CODE END RTC_MspInit 0 */
    + X0 {2 f: F5 L* w5 H' W$ ^# Y4 }
  89.     /* RTC clock enable */: k0 a+ |  v/ E0 c* t1 K
  90.     __HAL_RCC_RTC_ENABLE();
    % x! S! ]+ b# P
  91.     __HAL_RCC_RTCAPB_CLK_ENABLE();
    7 P" t4 {8 u) X  X! }
  92.   /* USER CODE BEGIN RTC_MspInit 1 */
    0 k0 H1 x0 v* x0 o
  93. ( j9 p& [1 G, A* o) g
  94.   /* USER CODE END RTC_MspInit 1 */  |. u# M) `9 ^4 P4 q/ b% H  e
  95.   }
    ; N' P5 C3 y( i8 t4 D  H6 @" g
  96. }. m4 S# `7 A# F% p8 G. s
  97. # c4 `1 I- o2 r; n1 d1 _4 [( D
  98. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)% Z3 h" h$ M. t) z4 W
  99. {
      r, i' ?) P) U7 _) [- \
  100. 2 ?7 ~8 k$ g! l* y
  101.   if(rtcHandle->Instance==RTC)
    7 S7 Z' h) [5 o: i. y4 ?. A% V, o
  102.   {- n9 s. v" j* k
  103.   /* USER CODE BEGIN RTC_MspDeInit 0 */
    7 D' {$ ~% o( ]8 ]: j6 W

  104. - l8 b) c9 g3 F0 \: H
  105.   /* USER CODE END RTC_MspDeInit 0 */- D- F: b  t8 `+ v: F: R9 Z
  106.     /* Peripheral clock disable */! u" h0 v/ H& J* C+ g, W
  107.     __HAL_RCC_RTC_DISABLE();
    1 y# i6 q/ p% y% l/ Q; t/ D
  108.     __HAL_RCC_RTCAPB_CLK_DISABLE();  |$ P% Y; z- e$ n
  109.   /* USER CODE BEGIN RTC_MspDeInit 1 */
    ! B$ {- B- Q; _

  110. * W. b+ o% h5 u8 F* _# N/ F
  111.   /* USER CODE END RTC_MspDeInit 1 */  Q/ b3 ^; B3 X+ |' B
  112.   }
    3 I2 S- M0 y& w, D8 G0 h
  113. }
复制代码

1 y9 p6 F4 p  ?* y3 T) T0 i) q 9 Y; q* q: N( i3 Q% I% P4 L
三、时间日期获取设置等:$ m9 y0 x. `& q7 S5 U9 |+ b
1、自己重绘一个设置time的函数:
- k% t9 ?9 I- h0 }# Y
  1. /* USER CODE BEGIN 1 */' r) [4 E( H* k, \  D$ m% b
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second). ]$ b% O6 T: M3 \! |6 S4 }
  3. {
    , z8 |' u5 d" {3 c' _0 b5 E+ ?! F
  4.   /*##-2- Configure the Time #################################################*/
    3 G) ^9 U* m7 d: Q/ y. t$ A% }
  5.   GetTime.Hours = hour;  }1 N: @' {5 v  u! ~* N0 @1 o
  6.   GetTime.Minutes = minute;7 O8 S: N0 E. \2 W
  7.   GetTime.Seconds = second;
    ( O  }/ f% [( s/ P* @% K
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
    1 e! U! X. u4 Y1 n3 V
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;1 z1 `2 E9 |7 x$ ]' v+ R' q
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;$ ?8 k0 R& k+ n, X$ c7 }

  11. - H$ ]9 N; V0 O5 r
  12.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
    : Q' i/ P& E# y% y
  13.   {
    & J" d; f) w; H1 Q& Q, {

  14. ' d" q$ Z" M/ u0 f$ R; {
  15.   }( p9 c" Q$ Y/ P4 \9 a' b# q$ x
  16. }; W4 i2 d, w. @# a5 a1 F2 w  n
  17. /* USER CODE END 1 */
复制代码

! ^, u1 t+ C. n& F* M& H% V3 u2、调用函数实现RTC:
) ~2 i% |6 Y5 I1.首先初始化RTC时钟:
  B8 I* R0 ?1 E( G; ]) u
  1. MX_RTC_Init();
复制代码

% ~1 y2 z* a6 T; G2.接着设置time时间:: ]. Y: \& b5 U% @
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码
2 f9 I) d2 F; {4 Z# W  g
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
7 _8 G' E1 `8 b/ S
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
    9 a2 o5 S% f6 H3 E0 y* V1 D/ D
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间
    0 K3 T- V# d$ o! p; I8 Z3 C0 Q
复制代码

; H( C$ ?) A- v
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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