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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:
( L) \6 m3 U, N( O. c, S通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。
! A7 F# m; F+ S2 D
1 u: n; K5 K  J4 \, I& d0 V一、STM32CubeMX配置如下:# I6 x4 V1 Q! K) o7 |* y
1.时钟树配置:% g& v, C; ~; W! Q: b) N' n# m: V+ C
因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:3 q! e* [% s/ N  ~+ ~, l

" b8 K$ J$ W2 C; d
2020090915425866.png

7 k) Y- b5 J0 T* A5 }
8 Y0 V$ E* F! l7 e$ O* F4 T7 U2.RTC配置:( W/ Q  ]% z# h5 `3 o, I' P+ S2 @

7 y1 |( X: q( X* v" b4 ^0 m8 p: G9 n
20201217151841576.png
2 {  z: x0 i, F$ K2 W* c8 {

) s' N3 g5 f& @, |4 `1 d' R- h0 a. N(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:+ M' a1 ~7 c: I, q7 H+ x2 D3 P/ _; \
# [. y5 R) h- ]9 [; X7 g  S
2020090915482431.png
, }% e0 E$ H. W* E( e' |

% m' Q* U2 Y2 i
2020090915483789.png
3 a8 n/ i# h) |
5 M* Z. S. h/ X) O6 |2 N' ]- y. m
因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:
, u9 i. x2 D8 j2 d& ?7 g4 B1 i/ n5 w) e  S/ S% m* {0 e
Asynchronous Predivider value :127
: Z" R) ~) w. I( cSynchronous Predivider value :249
! h: x1 o# U2 C* ~9 F
6 t- x; N6 b# \0 l8 d(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。( W1 M8 |. T9 m5 o% F: q. l, w- o
二、STM32CubeMX配置生成的HAL库如下:" K# s- n: w) f7 O
  1. /*** [% H! e8 e' J4 Z' o
  2.   ******************************************************************************8 \5 a6 W! z! l$ V1 X8 x
  3.   * File Name          : RTC.c
    * ?$ h3 u: J# J" H) X0 _, w. m! Z
  4.   * Description        : This file provides code for the configuration
    3 v% ^+ \  j+ x7 u) a- J, w
  5.   *                      of the RTC instances.: M# h9 e& B: j( ?
  6.   ******************************************************************************
    8 ^- y& n& Z" O- C: d. s5 X8 j
  7.   * @attention
    - l7 \' @+ l& K3 m
  8.   *: z" _7 r5 U; {: \" k+ @6 [: ]
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.. v; i9 ]# _& |* r
  10.   * All rights reserved.</center></h2>
    . \) _# O- x1 c! X. T( @
  11.   *
    " K: @. ~/ b' g, h! ]- s
  12.   * This software component is licensed by ST under BSD 3-Clause license,4 l- H" ]0 f. N* Z: v
  13.   * the "License"; You may not use this file except in compliance with the
    7 v) M; J- A& _& |
  14.   * License. You may obtain a copy of the License at:9 c) W. U* Z, v. g* _! H  |4 C7 t
  15.   *                        opensource.org/licenses/BSD-3-Clause/ _# L" l# `) h  x) \4 o# t; _
  16.   *
    7 a9 i; H4 H- I% C' l
  17.   ******************************************************************************
    4 J: m1 }- L( \8 f
  18.   */
    ; a+ G+ T9 ~8 \: o" o6 w! a
  19. # x, B3 c" S- v: w" W% G
  20. /* Includes ------------------------------------------------------------------*/
    . U. M& [9 R2 F1 R3 x4 P
  21. #include "rtc.h"* f( G" G0 o8 W* H6 Q$ \3 ]
  22. 7 j) q0 p! B. [+ P
  23. /* USER CODE BEGIN 0 */
    & A( B' C$ p' F7 n% i% |. ?% \
  24. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
    : u. Z. ]/ D# R0 x
  25. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ
      K$ t2 ~* y: {8 l
  26. uint8_t RTC_READ_Flag;' n5 N) m: n6 ^$ Q- S1 D
  27. /* USER CODE END 0 */% f! U  o' c) H+ I6 c! {

  28. 9 ]& Y" _' F0 a, u7 F
  29. RTC_HandleTypeDef hrtc;
    5 A$ k4 G- l1 [& x" b* G9 X

  30. ; N: m! x- F9 N/ q7 B1 y
  31. /* RTC init function */+ j) a/ a# p3 L" v' W0 ]
  32. void MX_RTC_Init(void)
    0 ?+ z. ]5 }4 r, |* |, {& B" N
  33. {# y3 G0 a9 Q+ |0 b4 m' B
  34.   RTC_TimeTypeDef sTime = {0};
    4 }% b. _; b5 c' |3 O0 S. X
  35.   RTC_DateTypeDef sDate = {0};# Z2 P# f8 d) {3 ?

  36.   v' t+ Q9 T0 M; m1 ~* @8 ~( M
  37.   /** Initialize RTC Only
    2 }" D% w7 m3 L' f
  38.   */+ F" ^# C( _' C1 q# J/ _0 S: ~" V. N
  39.   hrtc.Instance = RTC;
    * W! O0 b/ T" ?* J) a
  40.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    , _3 i9 F& c) T* z) t  m& |) t
  41.   hrtc.Init.AsynchPrediv = 127;  j6 s" ~# ?3 Z* y' }2 S, a6 w5 A4 ?
  42.   hrtc.Init.SynchPrediv = 249;
    % R. ]6 U: _$ d2 [
  43.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
    7 ~# w4 G& i3 k0 G
  44.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    8 t. }7 y$ u, i. @+ [3 M. B# k
  45.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    , q$ J7 P* z: l  w$ V. `9 J7 Z6 M
  46.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;) [, F& n9 V, Y# A4 K
  47.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;4 d7 Y2 C" ?& b# S+ _
  48.   if (HAL_RTC_Init(&hrtc) != HAL_OK)" ]0 H: s9 G, N. y) b' s
  49.   {
    2 }9 n* j2 x; e
  50.     Error_Handler();. P, Z: z! D3 Z8 S' i
  51.   }
    ' y7 Y7 J# Z0 F7 v5 Y" G! x
  52. 0 A; H1 q  N+ S7 |
  53.   /* USER CODE BEGIN Check_RTC_BKUP *// _/ p0 I$ |, g/ w( d( o* ^
  54. 7 o3 g' w8 Y# b) d8 Y2 {2 _
  55.   /* USER CODE END Check_RTC_BKUP */
    + y; m. R! g9 q: T# @. x
  56. + q& S- {5 K* V$ m3 k
  57.   /** Initialize RTC and set the Time and Date & d0 K1 z6 U* B- L
  58.   */1 j) K9 y$ H3 Q0 f/ @, U- B; q
  59.   sTime.Hours = 19;$ p$ G  l, r0 x2 g  @6 }
  60.   sTime.Minutes = 07;" z* B1 H2 p5 |! V8 I, ?- H" W) j
  61.   sTime.Seconds = 00;
    2 s% s, I' a2 K  @/ X, c
  62.   sTime.SubSeconds = 0;
    : t' C/ h9 X, o6 Z
  63.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;+ m$ w# J4 R9 t; S( T' ^% K1 D$ V/ @
  64.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
    5 a6 C5 Y% @. o& O
  65.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)! m! ~% L4 X4 W& v; o6 M
  66.   {
    7 P4 p) x. n* ^9 g. [( ~
  67.     Error_Handler();* l1 P9 R7 h  {& z7 z3 d
  68.   }
    ! y( a! F& Y2 D% N) e$ d
  69.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
    6 n0 I( h# P, _5 ]* \
  70.   sDate.Month = RTC_MONTH_SEPTEMBER;; Q* J! i. m. x
  71.   sDate.Date = 8;1 r  }. ?# V1 H/ s( O0 A
  72.   sDate.Year = 50;0 N: g7 N( b. b0 y7 K. R
  73. " T3 i' O; C7 o4 T+ k
  74.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
    : _* ~! k5 ?8 `8 W0 U, ~$ t
  75.   {
    ) R9 X4 S/ _# p7 S! Y& i
  76.     Error_Handler();
    ( Q6 L1 T! m" A7 Q" `" F
  77.   }
    % p% j2 D2 I) n( Z$ @
  78. " }* [4 V+ |' d6 G! n$ d# m
  79. }
    + ?0 o( Y! M. }1 w% z" m3 {# x
  80. : ~+ t& N/ N+ L# g0 [$ u7 W3 h# o# v
  81. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
    ) g# O8 A& o' k& v7 `
  82. {, E# Y& ~0 J/ U# f; b, C# u

  83. 7 M- ], I: I7 c9 N7 @. [6 U" `9 s
  84.   if(rtcHandle->Instance==RTC)
    9 j& r, ~' l. z  P) |- {- y
  85.   {
    " G6 g: g1 i( l) x2 q4 Y# q
  86.   /* USER CODE BEGIN RTC_MspInit 0 */& B. k6 ?7 Z( x( ~1 J' Q

  87. ) z+ k4 J0 m- b+ x( }
  88.   /* USER CODE END RTC_MspInit 0 */
    ) F6 e8 m  s# a3 T, j
  89.     /* RTC clock enable */' e0 a7 M  A' O0 t2 T! T
  90.     __HAL_RCC_RTC_ENABLE();0 X8 ?. T4 J- E' t, c
  91.     __HAL_RCC_RTCAPB_CLK_ENABLE();; x) u1 W6 v+ c/ T! Z' Z- K3 U6 Y
  92.   /* USER CODE BEGIN RTC_MspInit 1 */) K+ V0 K0 l2 r, y
  93. 0 v0 a* ~# `: [3 [
  94.   /* USER CODE END RTC_MspInit 1 */
    * D- a+ [  K7 i4 D+ f
  95.   }
    ) {' L, a- H3 _; T- g- G# o
  96. }1 w6 `& Q+ n4 b3 b
  97. 8 ~4 B; |4 |3 B) ~: a: i" G( {
  98. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
    : g8 C- L. S# J; U
  99. {. ^) E) P5 L2 i9 n: p

  100. 9 W- n) V, o6 w) c3 G2 _: x6 }
  101.   if(rtcHandle->Instance==RTC)
    % o3 J7 _, j# ]1 m7 q
  102.   {' Q$ [4 \/ L) y7 c( g% [( u
  103.   /* USER CODE BEGIN RTC_MspDeInit 0 */, T. O0 R7 l  v3 M: K" L; ~
  104. , n$ @% }2 d3 R1 _, `  W- P
  105.   /* USER CODE END RTC_MspDeInit 0 */
    9 ]* `+ F. W/ D  i% z9 M- A
  106.     /* Peripheral clock disable */
    , I; y2 u/ i( U4 S% ?( }7 p
  107.     __HAL_RCC_RTC_DISABLE();
    / ^- G- r, q) x2 C' }
  108.     __HAL_RCC_RTCAPB_CLK_DISABLE();
    $ u" N% b  Q) O* S# `2 ?0 c
  109.   /* USER CODE BEGIN RTC_MspDeInit 1 */5 U7 Q/ I& d4 w
  110. , v0 C: J* H& N2 D- `
  111.   /* USER CODE END RTC_MspDeInit 1 */
    6 w: D( m, Z5 |6 s4 `( W$ [" I
  112.   }. o3 p; l( h: Z( c- s- Y
  113. }
复制代码
) ?8 c' d6 w" n( V5 A7 y  L
' `4 ?/ u- [5 _; N: L4 w) a
三、时间日期获取设置等:* U, y2 N; N4 ]8 s: p9 \5 l, J
1、自己重绘一个设置time的函数:; l1 F: @1 _- U/ x
  1. /* USER CODE BEGIN 1 */
    6 E! f( @( S3 {2 ?
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second)
    4 h! [, n& b8 n$ w1 P9 z
  3. {- }9 A) u0 M* E" S% Z
  4.   /*##-2- Configure the Time #################################################*/
    & t3 F8 T+ o3 c
  5.   GetTime.Hours = hour;. ^" c' F4 c' L2 |; W9 D; r0 @
  6.   GetTime.Minutes = minute;
    + M5 J& }: C# w  b) j1 C' O# N
  7.   GetTime.Seconds = second;
    4 @2 y5 \# n+ `& ^3 d
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;) P% m% q1 i: C0 F
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    1 [6 V7 P$ f. a
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;; R) k2 z) v4 b2 q! s3 }
  11. 3 ^! L. S& Y, j, l  E
  12.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK); Z: |2 T+ v# q0 |  n
  13.   {
    5 H; l. I9 o! Q6 O

  14. 7 Q$ x. Q3 ~. D& w/ W! f
  15.   }8 _6 l" B1 n8 i  X, e, b
  16. }  \* ?. x! s; N- K  v- E& s
  17. /* USER CODE END 1 */
复制代码

+ o, @' R/ z1 V, W9 p) q( a' L) e2、调用函数实现RTC:
, v# Q6 F, O5 d& @; t. J6 z1.首先初始化RTC时钟:! h/ B$ A& S6 |# S, c/ M
  1. MX_RTC_Init();
复制代码
4 p5 r4 _8 i9 m' _8 A2 g4 U
2.接着设置time时间:
9 h) `& V! L! U, i& n2 q* \& [* @
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码
/ w/ P: M" p8 o3 I% {7 D
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:2 G, N: _8 G! ?5 ]1 ]" O
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期  h$ ~6 J, g" o! }" p2 I
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间
    7 t, M+ F; F$ F, G
复制代码

# G; T& H  b; b
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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