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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:! g  S  S1 z, j4 c) F2 H1 i
通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。
4 _6 g& z% E8 |" y: K3 P0 ^) i
- H0 E6 n" |' y# t一、STM32CubeMX配置如下:
* `( J1 B( V* u% D2 G0 V1 l( e1 z8 m1.时钟树配置:9 G" ]# g( a7 ?1 P
因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:! A4 s0 |4 g0 \' }

0 p6 |1 t4 z2 M  D+ i# A1 `
2020090915425866.png
/ X+ A5 o7 r- U6 d. j  R
$ C. d' J% f2 C8 o& j5 B& g
2.RTC配置:* g9 o8 M2 z% C
9 {7 D9 e6 s1 `& s! K2 _  x; M5 Y
20201217151841576.png

( ^+ v0 c6 K8 @
- l: c5 k) C- d% s7 y4 O8 H(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:& q  S0 b2 L% w& I% \$ N  u

# u( h) [( b" H5 \0 `% S  P4 a
2020090915482431.png

& h2 A1 ]8 V* [% \" A7 I7 o8 l/ {0 }% b" c
2020090915483789.png

; G5 [; c$ T5 \6 O' S8 H: P) G% ~/ G* d' m
因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:- W$ Y5 P7 m8 n

) s$ ]! h: C0 VAsynchronous Predivider value :127
+ B% [9 l0 @6 }! y3 T& SSynchronous Predivider value :249
+ ]  G; _( H5 r6 v4 o
* q6 A" D/ |2 ]8 O% Y(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
! j# t$ {1 R2 V; i' o二、STM32CubeMX配置生成的HAL库如下:
$ r3 K* u# r6 y% Q8 V8 l) t
  1. /**4 ^" F8 I/ I4 F, M0 \
  2.   ******************************************************************************) q" k" y" k  N( S
  3.   * File Name          : RTC.c$ D5 r5 A0 ^' w: R$ N. T' _. [8 q
  4.   * Description        : This file provides code for the configuration5 V+ ^. p7 [9 _1 ~
  5.   *                      of the RTC instances.$ c- @6 G) c( h- k
  6.   ******************************************************************************
    2 `. b& X& p9 F6 l
  7.   * @attention
    5 g! g+ u& V( _, |7 d
  8.   *
    : }+ u) H; t' L6 w& \! L8 L( F7 J
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.3 E) m  g" Z+ Q& j! u
  10.   * All rights reserved.</center></h2>
    / n6 v3 n+ [: K
  11.   *' T. Y; A4 W1 d7 |/ L
  12.   * This software component is licensed by ST under BSD 3-Clause license,
    3 r, j' ~0 x) k8 ~& M( }
  13.   * the "License"; You may not use this file except in compliance with the
    3 U( l; r' j2 L% v& h2 X2 R7 `$ n
  14.   * License. You may obtain a copy of the License at:
    / o# @/ G% D. \( n5 d/ O1 l
  15.   *                        opensource.org/licenses/BSD-3-Clause
    7 X6 ]5 Y. b7 W7 i0 d
  16.   *
    : ~/ c; E1 V+ j7 ?
  17.   ******************************************************************************6 Y- U( X7 ~6 O- b  ?! r# S
  18.   */
    / c# A. c3 I' i" e& @8 q

  19. / J- E2 B8 C7 u: |. N" e
  20. /* Includes ------------------------------------------------------------------*/
    8 Z5 v0 n  \$ u7 F( W) F3 u
  21. #include "rtc.h"
    % B8 H' a4 ?# @0 _" ?7 R# e

  22. 6 G  x5 j! l% F1 B$ R0 ^3 T/ W1 Y
  23. /* USER CODE BEGIN 0 */- e' N1 m/ U! Z  R
  24. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
    * _% A  y6 `" L" c( U' _
  25. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ0 R! G) w( N( Y  S8 t4 X8 |! G# [# m
  26. uint8_t RTC_READ_Flag;5 }6 x4 N8 a5 |" M' J
  27. /* USER CODE END 0 */5 F& I2 r" Z+ s1 B2 {3 x
  28. ! r* ^0 e, Y' g0 `* y
  29. RTC_HandleTypeDef hrtc;
    - n  G8 }2 j& n

  30. % ^1 q- U" U7 u. H& h
  31. /* RTC init function */% r' m5 y+ n; I, o; Y
  32. void MX_RTC_Init(void)8 H- p$ }3 c1 C2 k8 [
  33. {; K# Y: n& h  A$ ~; g0 e
  34.   RTC_TimeTypeDef sTime = {0};* ~6 o* s3 A' \% t
  35.   RTC_DateTypeDef sDate = {0};
    1 i/ z8 ~9 J2 j6 L9 g& [( @
  36. # j. I4 n$ }# u( O0 u/ k
  37.   /** Initialize RTC Only
    / r# l9 I) a1 x! @# C. u
  38.   */
    - n2 V# F9 T) m: H
  39.   hrtc.Instance = RTC;4 s5 Y+ c9 B9 n  f2 e( b/ u
  40.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;  @4 F% p2 u& }. `# I8 w
  41.   hrtc.Init.AsynchPrediv = 127;
    1 w) i' e6 ?/ a# N/ o
  42.   hrtc.Init.SynchPrediv = 249;) ]& }2 ^& S& c* g8 b' z' S
  43.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;# q" A# x2 x  l$ w# A
  44.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;+ C: A2 r, Q% i
  45.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    . ^/ n! O+ A. p! W% d% v8 m
  46.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;: e9 W( ]& S3 v) s1 j6 m8 t; [! J
  47.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    ( n" X0 J9 ]: R$ X, u
  48.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    7 F. S2 c" b/ z$ I0 t
  49.   {+ ?* K5 j2 t8 S7 v6 }5 `
  50.     Error_Handler();) F+ A6 W$ m, }& d
  51.   }
    5 U- [* H1 S/ A

  52. 4 \. ~, s# C9 G5 _+ k* x
  53.   /* USER CODE BEGIN Check_RTC_BKUP */# {/ C! J& \$ A3 y
  54. 5 H6 w" d5 d2 G, b5 H
  55.   /* USER CODE END Check_RTC_BKUP */
    / J- b& K. T: O. o2 ^( x7 C" z! C

  56. * U! Y) ^1 n" f  [
  57.   /** Initialize RTC and set the Time and Date $ ?9 O; w4 S6 E! L* U" M
  58.   */$ c+ E5 q1 V$ X2 @* g; Q& }
  59.   sTime.Hours = 19;
    & Y6 x9 |  I3 k+ U  k* Z
  60.   sTime.Minutes = 07;: t# B+ @6 E/ D# b. f
  61.   sTime.Seconds = 00;3 Q  X  Q$ J* V1 W# g8 s
  62.   sTime.SubSeconds = 0;
    5 k9 d+ p! C$ S# j
  63.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;8 L4 G+ N3 |. m( e0 V
  64.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;- [$ Q/ Y4 W9 b) j3 k' M
  65.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK), b1 b0 m/ W$ B+ k. u  A7 c( k
  66.   {
    1 n& c5 [  D; E; j' N$ _
  67.     Error_Handler();
    7 k* _" r; o5 j1 x/ S$ G
  68.   }/ V* a' V: N5 W- j. Z3 F1 H# E' K
  69.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
    4 I0 I9 p$ P4 T; C, K6 }0 M  e
  70.   sDate.Month = RTC_MONTH_SEPTEMBER;
    , K5 Q% z2 C" j, [6 c' G- }1 S
  71.   sDate.Date = 8;
    + N- c9 G: K+ b' W3 H: Z
  72.   sDate.Year = 50;
    ( `$ b6 V) c3 J; f( B
  73. # v" v: s! A+ a5 |* R
  74.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    ! H$ ~$ ?0 d+ C( I6 z
  75.   {& W# J% c" n. C1 P. n/ M
  76.     Error_Handler();
    % A/ `. L; }; `0 \
  77.   }
    ' X4 q3 z! O3 H# O  C* y$ a. `8 ?
  78. # r0 I% k5 B8 g- \- ^: a- j- x
  79. }
    ' t  H. i3 B) b& r+ G
  80. * L% q% B! l$ I$ c5 |# R3 U
  81. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
    2 M' K0 ?5 b% q
  82. {
    " l+ q: m, G, r6 g
  83. ' W: Z& y1 _: P1 b
  84.   if(rtcHandle->Instance==RTC)* J  f- J; Y4 q7 G6 v9 S
  85.   {( Q/ T9 _* o3 Y
  86.   /* USER CODE BEGIN RTC_MspInit 0 */
    ( U+ x6 E; L: Y4 i

  87. 2 ]  m0 [* {, a( M% q: m
  88.   /* USER CODE END RTC_MspInit 0 */" O, T0 k* h6 p- I6 H9 j* ^) D
  89.     /* RTC clock enable */
    7 q& h7 I, k3 S
  90.     __HAL_RCC_RTC_ENABLE();
    2 V0 `+ z5 Z5 I& @, g6 D2 p
  91.     __HAL_RCC_RTCAPB_CLK_ENABLE();
    * @) X9 O  c' d, a+ W5 O: Y2 l. @
  92.   /* USER CODE BEGIN RTC_MspInit 1 */$ Z( u/ }1 {0 ^, _2 p
  93. 6 ^" c: S$ t9 n3 \) C+ _
  94.   /* USER CODE END RTC_MspInit 1 */
      c5 q' a; H9 Q& E, E5 M% Y
  95.   }/ f4 i) t! e2 i
  96. }
    ; l' r1 C- b/ @
  97. + a$ q  ]7 I, h! U
  98. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
    , d# Q. B6 U& `! P0 m
  99. {
    4 g6 S( D% A; _

  100. 5 }# m# c6 r! O, K' K3 p
  101.   if(rtcHandle->Instance==RTC)
    1 f. u: g' Y! R9 g
  102.   {' \5 Z1 I; \% w) H  L
  103.   /* USER CODE BEGIN RTC_MspDeInit 0 */6 v, D" k' r4 E) ?: Q1 k2 {

  104. & R/ R* s( M, U
  105.   /* USER CODE END RTC_MspDeInit 0 */
    , g, B2 D& k+ d5 R% |
  106.     /* Peripheral clock disable */! {9 b# Q( l  n( x5 \7 h& z! [9 f" A" e
  107.     __HAL_RCC_RTC_DISABLE();
    . B; S  j  p: ?- _
  108.     __HAL_RCC_RTCAPB_CLK_DISABLE();8 N) z1 w; t& j7 w8 O
  109.   /* USER CODE BEGIN RTC_MspDeInit 1 */9 Z5 ~; B2 c/ D* L. Z# `

  110. % {4 q9 e. Q" `
  111.   /* USER CODE END RTC_MspDeInit 1 */
    ( [) X# ?  J; }" I) @/ X
  112.   }" X4 b3 S, l8 }" U) q
  113. }
复制代码

. P, a% [3 T# D
0 c( g" z( o6 u; l! ?) g三、时间日期获取设置等:8 [6 v$ i) H; \
1、自己重绘一个设置time的函数:/ y8 F. m) ^( ~. F( K! v' ~6 [1 b/ o+ x
  1. /* USER CODE BEGIN 1 */( {% o: d/ @" H- t& J, D1 f
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second)
    8 A$ w: B# M' O2 {
  3. {
    - u( |" W" C2 L* g2 r( P, a
  4.   /*##-2- Configure the Time #################################################*/2 N5 F; A9 n% w' Y  F* |$ c8 X
  5.   GetTime.Hours = hour;
    * z- `. a! U7 s$ s5 m% }7 }! _
  6.   GetTime.Minutes = minute;* o- I1 J3 Z5 R" Q, f9 |" p2 W8 T
  7.   GetTime.Seconds = second;
    8 c: ?. ?8 F$ g7 q0 w& j
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;$ B1 H$ M, ^" G" t- r: J4 P
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;$ e1 T6 d7 A$ S" a
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;
    9 p) [5 S9 u' ?# s3 o! D" K
  11. ( m( R, {0 p7 [7 O5 d! E+ \
  12.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
    ( \" T) b+ @: o
  13.   {2 r! m( J* p1 N6 P2 @1 ~: j

  14. 7 }/ s/ W/ X4 c  H$ ~+ f
  15.   }
    - n) m, @; s  Y1 H5 M
  16. }
    9 g0 U% R3 \+ u% N$ _# M" o/ r8 e7 }
  17. /* USER CODE END 1 */
复制代码
9 q4 I& I5 o  @5 K
2、调用函数实现RTC:& ?. t7 h) B! F- o
1.首先初始化RTC时钟:" o6 }3 D! h4 i$ \# R5 i: x; N
  1. MX_RTC_Init();
复制代码
4 \# k% ~% O/ D0 r$ u
2.接着设置time时间:9 z3 W2 W. j# R) q
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码
( E* d- `7 [! G) o1 D- M) Z0 m
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:) x. Y9 Y% S: Z* U7 P2 z; Y
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
    % |3 ?2 u  k! p; A
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间: P& O- q# t9 z" H
复制代码

0 x2 L0 T" ?  ?( l/ B- A6 K) P
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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