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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:
7 p' C3 r, B) d# j4 I- X通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。8 a" h% J7 ?- ]

( ?8 c9 w5 P$ w# L; f  q2 N. r一、STM32CubeMX配置如下:
% ~! S- A& `4 Z# F4 X1.时钟树配置:
' s; l9 f& O% D2 j因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:
2 ^4 |1 H+ h& Y1 v  d: K
0 W1 n5 ?/ \6 N, X- S+ d7 V
2020090915425866.png

2 \$ {4 k2 z* G- Y3 g  A8 ?+ i: _: a6 h4 G- `* {
2.RTC配置:
; c) l! P  o* b# M5 g
3 v. ?2 [  ]1 o
20201217151841576.png

0 q8 ^7 r* ]2 l0 m7 h0 z# j- A, x4 M& g4 w; F0 i6 F+ b7 b
(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:, {: Q! ?( B. n; `

- }! f' G, q# a8 z
2020090915482431.png
& D8 D9 j' Y8 {2 p' n1 Z
1 \* F: L4 F  K1 S
2020090915483789.png
/ j# N7 Q  S* c

/ u: P9 V$ W0 G( j3 S因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:
2 `4 L: o! }& {0 U6 B. d+ N+ g+ y" H% ~7 x3 e
Asynchronous Predivider value :127% ^# {  M& d% @; F
Synchronous Predivider value :2492 n7 c4 V6 P+ m7 z

' P: E+ [- s) ^6 g8 R(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。8 z/ Q1 |1 g, k( }9 ~7 O
二、STM32CubeMX配置生成的HAL库如下:
# x% k' b4 q0 ^9 |' [. S. \
  1. /**1 ?$ V& ]+ f; u5 |( ~! `3 K0 j* M
  2.   ******************************************************************************
    $ d* [" d& H& s+ F6 |0 k0 C
  3.   * File Name          : RTC.c3 ]1 B! w9 k- r* L; j! h
  4.   * Description        : This file provides code for the configuration
    # S; b: Y( U) G; R( d
  5.   *                      of the RTC instances.
    1 u1 T3 U" r7 E: @4 w
  6.   ******************************************************************************
    0 o8 V7 I/ s( `1 {9 }
  7.   * @attention
    & Z0 f$ D! {" S/ G& A% n
  8.   *
    : E) C" w" B" ~# s* ^! K: z# H
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.
    1 O7 @: A$ Z- O8 h
  10.   * All rights reserved.</center></h2>
    9 r5 I2 }0 r5 {* |( a( ^
  11.   *% c; r& }+ ]+ X, i
  12.   * This software component is licensed by ST under BSD 3-Clause license,1 v4 f( s+ y/ T! P8 t$ a
  13.   * the "License"; You may not use this file except in compliance with the
    . V, H" g+ T, _8 x' ^/ W% ^, n
  14.   * License. You may obtain a copy of the License at:8 G3 |# R, t# m( ~9 i; e/ O& g
  15.   *                        opensource.org/licenses/BSD-3-Clause
      K8 R2 ]1 l& Z- n5 h+ U6 X4 e; I) x
  16.   *
      V- o" \) U2 I
  17.   ******************************************************************************: f; w8 T- l8 k6 g9 @: b' `
  18.   */) D, M3 g( o4 V/ v
  19. / F5 ?* K3 M# y* a
  20. /* Includes ------------------------------------------------------------------*/
    # [  q* v( N4 ?# T" n
  21. #include "rtc.h"% G& U* r9 k2 U9 b' R) a" A
  22. 1 _0 |' V( C$ {2 d
  23. /* USER CODE BEGIN 0 */4 s3 m. L/ [/ C: e$ y
  24. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
    ; _7 N: e$ k) i& B
  25. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ
    : z3 F/ ^% R3 i5 N$ J' [
  26. uint8_t RTC_READ_Flag;- U* t0 ~) j1 T! M$ i1 V/ v9 t
  27. /* USER CODE END 0 */
    # z8 i( i* _; `. D+ i4 v
  28. ; I0 u) k: I2 w0 h, u
  29. RTC_HandleTypeDef hrtc;& p$ I! k9 S* t) L) w) J, K

  30. ! i& h- G6 Z8 ^/ i
  31. /* RTC init function */
    ! n6 }$ h) H8 ?! |1 \
  32. void MX_RTC_Init(void)
    ; V+ A3 @4 q1 W% [) n: V5 ]
  33. {5 i6 g# i: v0 K! r* L2 `+ x) R
  34.   RTC_TimeTypeDef sTime = {0};
    1 d+ _( R' H. U; j1 F! j+ r5 Y
  35.   RTC_DateTypeDef sDate = {0};
    , d# y% [& N! {

  36. 6 d: p8 T/ i# B; A3 _
  37.   /** Initialize RTC Only 7 ]7 `. y. X; g  x* a( ]
  38.   */
    + Q' x  q; |: Q; b* P" H
  39.   hrtc.Instance = RTC;
    ' {0 \' J" n; }' p5 w# E# J
  40.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    5 {  d) ?- G1 b# K. \, S* P) Y
  41.   hrtc.Init.AsynchPrediv = 127;4 P1 h3 v4 I  ~  }, _
  42.   hrtc.Init.SynchPrediv = 249;
    6 q7 Q  A6 B( z1 S( f+ t, a
  43.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    ' I4 l# j: j6 o) z9 K& Y  h# |
  44.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    " i% w0 ], S: \
  45.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;- m( `  C2 k; u
  46.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;5 O1 k2 w+ e+ r- ~6 W6 J6 V
  47.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;1 b* q# S5 I* t# c
  48.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    ! d9 n* g0 \+ c/ G/ g: Y
  49.   {
    ! }; s: U1 C* ~% o
  50.     Error_Handler();3 D% [# B  d7 l  H$ m& U7 A
  51.   }
    # @# D$ z0 I' i, ?( }
  52.   ]; z# A/ }1 f$ y9 {8 w* x% `
  53.   /* USER CODE BEGIN Check_RTC_BKUP */  b# O' E2 f/ I! H" I
  54. 7 g# U5 m4 l% B" v3 B* i
  55.   /* USER CODE END Check_RTC_BKUP */6 B7 B2 E' z' z6 Y; _, Z+ |
  56. $ B2 A$ w1 P7 h0 V( k! L
  57.   /** Initialize RTC and set the Time and Date
    4 W4 u6 U/ R  _5 b5 k, P* D, K
  58.   */% f9 o) B% V1 Q; F6 h  ]- [
  59.   sTime.Hours = 19;, @! d) m" T' T
  60.   sTime.Minutes = 07;  \! N3 l% t1 N& m. X
  61.   sTime.Seconds = 00;
    $ A' g, x$ i, {; y3 A# S; p! p
  62.   sTime.SubSeconds = 0;
    : k9 X, h. U0 |9 y6 K
  63.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    . z: W2 e; f6 @" I
  64.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;6 m2 h  k7 s, R7 I
  65.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK); o+ ^- e& [5 |$ }
  66.   {  S9 W5 d8 n$ O
  67.     Error_Handler();
    4 {" B1 E/ l) n# t
  68.   }
    ! h* q/ _  o8 [
  69.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;9 K- Z' p2 J- d, T" h- E
  70.   sDate.Month = RTC_MONTH_SEPTEMBER;
    1 _; _6 k" f( l# j/ Y4 q6 K3 f
  71.   sDate.Date = 8;
      I/ j+ b& n3 a. k% F% i( x
  72.   sDate.Year = 50;/ _# X/ C" T4 `9 W2 p/ O
  73. ' h1 D3 p4 L& i- z
  74.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    & ~# V: l7 F! R  U9 z
  75.   {* V: d% z# I+ J
  76.     Error_Handler();
    * M' {. ^2 k: T0 }8 Q* O
  77.   }
    6 M; B' j& {% l4 J2 a8 g2 Y

  78. 7 Y8 c& x, C5 ?  I8 r; k, @9 f
  79. }
    ( P" Z1 D" U$ N4 S' @0 S+ B

  80. 4 P7 `0 z2 @0 c0 z
  81. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
    5 c1 Q6 B. X. ]& R7 D
  82. {
    : D# U' Z. c8 e; v2 G
  83. 5 ]2 ^5 b" d2 `6 v( R
  84.   if(rtcHandle->Instance==RTC)- a# c- f/ G9 }! T3 m" i2 F
  85.   {6 Q; A& M6 r4 n5 M: k( p
  86.   /* USER CODE BEGIN RTC_MspInit 0 */- O9 ^+ {5 z- Q& N# s# t: e; M- E2 P

  87. " b7 x8 w: m8 y7 n4 W# ]3 \! ~- O
  88.   /* USER CODE END RTC_MspInit 0 */
    # t$ q; v7 N6 G8 J) B* J: i
  89.     /* RTC clock enable */
    7 _' ~6 C0 b- E1 G5 ]
  90.     __HAL_RCC_RTC_ENABLE();1 u9 L% x$ c" _+ T
  91.     __HAL_RCC_RTCAPB_CLK_ENABLE();3 m# C) _. U6 L
  92.   /* USER CODE BEGIN RTC_MspInit 1 */
    5 S: _2 N  o. y0 R" B* M
  93. 3 ^9 Y9 s0 j4 b% c  W! S
  94.   /* USER CODE END RTC_MspInit 1 */4 Z6 A& U. f# R1 \+ x/ l! @
  95.   }7 S8 L, d: E2 k
  96. }) ^) y7 r6 |" `  ^

  97. 9 Q: E" H  U' g# ^
  98. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)6 f% U0 Z( ]6 Z/ [  X- T9 `% f) w% |
  99. {
    + z! }; l. W# c9 }

  100. * p# ^6 d9 t! k( m5 K
  101.   if(rtcHandle->Instance==RTC). x+ p3 n, T5 p# H' ~9 ^9 _
  102.   {
    : j1 U# B1 [% S0 L" ]& u8 k( a' @. q
  103.   /* USER CODE BEGIN RTC_MspDeInit 0 */* J1 Z4 y& }) s7 j

  104. ; B3 ^/ M4 v' r1 S
  105.   /* USER CODE END RTC_MspDeInit 0 */. w# e6 Q0 x8 \- q# s
  106.     /* Peripheral clock disable */. p2 N: [1 q; t9 a
  107.     __HAL_RCC_RTC_DISABLE();
    7 D9 d* y- e" r2 _! P9 [
  108.     __HAL_RCC_RTCAPB_CLK_DISABLE();
    9 Y2 X/ Z0 y' U  R- Q8 b
  109.   /* USER CODE BEGIN RTC_MspDeInit 1 */0 A! Z/ e$ n. p% k/ Q% T
  110. $ S" U$ d) {! \! n5 L" d, f1 h- w9 c: z
  111.   /* USER CODE END RTC_MspDeInit 1 */% y; _) z* N2 \( C  ^7 g
  112.   }  A3 H' `( q' _! N, E" k4 i
  113. }
复制代码

, O. X& ^1 C9 \9 I" K* L% o) u 5 Z  U  [5 x$ o: ~) g" n1 E
三、时间日期获取设置等:2 p, X! P; F# }& W$ {  ?) @
1、自己重绘一个设置time的函数:
. F& p! |# ?0 D$ T- Z  B3 A
  1. /* USER CODE BEGIN 1 */) {% y' P/ |. u& ]% {
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second)2 m1 _; k+ B; E8 u9 ?$ S% n
  3. {
    3 }+ M9 N1 t2 ?5 g- `
  4.   /*##-2- Configure the Time #################################################*/
    / v( d5 [5 S: _2 X
  5.   GetTime.Hours = hour;4 d( B5 G6 p" v5 ?, ^& }' N
  6.   GetTime.Minutes = minute;
    + Z  X! m8 S( V  \! N
  7.   GetTime.Seconds = second;
    . c) c4 W6 B8 {! i  S
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
    5 B& u; ?, v% {# d2 X
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    2 h, D/ o: `9 V1 W) k
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;
    $ L/ v% }' j( m% n7 m
  11. / W" i/ c3 Y+ z) R7 L# _
  12.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)/ _0 T- D% I) \+ b
  13.   {
    ; y5 ^, [- P. p" l* o5 H7 O
  14. / [8 G* M0 r' u% L' W' H9 Z* ]
  15.   }, r9 G: y3 n: q/ r& p4 r2 p
  16. }
    1 w7 B# U' j8 B7 W% x
  17. /* USER CODE END 1 */
复制代码
) I' Z$ C- D2 _* r
2、调用函数实现RTC:. j8 O9 {5 \" A& S
1.首先初始化RTC时钟:& G/ Q2 O: }, M( u9 ?# V! n
  1. MX_RTC_Init();
复制代码

. ~% S! ]0 t3 u1 J& O- n4 N2.接着设置time时间:( z1 H7 g. G2 b( l6 J* d2 n
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码

, L$ V6 K+ f$ Q3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
: {: k2 p# [' J+ E
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期% E. F- a1 U( n+ n
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间: Q# h: Z3 k  Q, |# H# o
复制代码
4 _# _" T6 d2 S3 I* G" K: z5 t& o* b
赞 收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版