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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:
& {4 ?7 k; \. M1 ]通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。0 |# I- e' a; D9 ^6 z8 V3 J
3 ], X6 T- F' W( ]
一、STM32CubeMX配置如下:
  @7 v1 `& q5 Z8 f' U9 J1.时钟树配置:5 ]% V0 f4 U8 m, w' W2 l! ~3 p
因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:
3 J1 I' P) |* o) o& Y5 C( }0 E2 U+ D( W7 U: J
2020090915425866.png
7 V/ p# O) s3 S: \- u3 L
4 e$ ]& K+ _1 H' A$ i' z
2.RTC配置:" F. c2 z! ?/ V9 ]' s2 j

: x* D) R5 r9 a7 y+ r8 Z. w
20201217151841576.png

, ^. ^, Z: p* M6 ], t
" J2 B. [( L: ^(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:1 D: J! H. G6 z; o: a, C& L

5 {* J# _$ @/ \7 G/ Z3 b( ~5 ~
2020090915482431.png
& o* S/ C4 p4 r" I% w' d2 J) ~/ J

( N7 a# T3 H# Q
2020090915483789.png
5 {8 S* M% C+ [2 V: Y

: o, ]6 L7 I/ O4 L% g5 h因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:
" n$ S& [' g0 l8 t9 h4 o& a) g, o+ R% G0 D, K
Asynchronous Predivider value :127* x& M& c. d( s2 y
Synchronous Predivider value :249# w! |6 a  E; C  r' M: z1 h: C

8 _' e) |( \( z2 H- ~, i(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
/ ^+ Y& ^# b$ M' ~) J二、STM32CubeMX配置生成的HAL库如下:& ?2 F4 a$ _/ L7 S! W! m
  1. /**- p( `2 \4 e; m# `/ m
  2.   ******************************************************************************
    % W) p0 O5 ]$ P! ?: o& t! ^
  3.   * File Name          : RTC.c
    * g& i: I& `  A! Z( ?
  4.   * Description        : This file provides code for the configuration& K* h: [3 W: W0 `
  5.   *                      of the RTC instances." C+ {& @/ R4 p7 k
  6.   ******************************************************************************! F+ c% T: ?( ]
  7.   * @attention
    0 \& Y9 I) m1 {( S5 P7 w8 t" U
  8.   *2 o: |& \3 y( g
  9.   * <h2><center>© Copyright (c) 2020 STMicroelectronics.$ O+ k* J3 z9 V: y7 I8 o
  10.   * All rights reserved.</center></h2>7 \1 W4 e0 u, a) N2 B4 \
  11.   *
    " r7 U+ p, y/ R, z
  12.   * This software component is licensed by ST under BSD 3-Clause license,
    ' C' g0 p% l: @2 b
  13.   * the "License"; You may not use this file except in compliance with the- e6 L# h: Q* p2 o  }3 c
  14.   * License. You may obtain a copy of the License at:5 b, C. F6 \3 r* G* Q8 q& Y
  15.   *                        opensource.org/licenses/BSD-3-Clause+ i& g' Z) `5 _: R- z
  16.   *- e0 @( h8 k8 ^9 y1 y( I
  17.   ******************************************************************************
    % D# V, J0 ^& `9 j' o
  18.   */
    2 G( Z: B! z/ p
  19. ! c' T$ l8 r, z8 Q# P9 j
  20. /* Includes ------------------------------------------------------------------*/  u5 R- A+ I. I; k' Q9 E+ r% F6 z$ o2 ]
  21. #include "rtc.h"2 ^2 q8 y% J# |) U- K3 H" Z' l6 n
  22. / A3 q7 I- O% |5 v5 d& X
  23. /* USER CODE BEGIN 0 */( P# s$ Y! m% s0 {8 M: s
  24. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
    , N: Q" p2 ~( Y
  25. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ
    ! j' }, p. O4 M7 W, {
  26. uint8_t RTC_READ_Flag;/ P0 e# A2 S8 S4 m0 c$ c& M, P$ Z+ `- K
  27. /* USER CODE END 0 */
    5 B; K8 g/ L. ^7 N! `4 s

  28. % q7 q) y% ^5 q: O' k
  29. RTC_HandleTypeDef hrtc;/ T7 w9 W5 r0 M9 m; O; v
  30. : P! \% G, B/ L# p6 I
  31. /* RTC init function */
    4 R5 i+ Y, w$ ?* {2 k- c
  32. void MX_RTC_Init(void)
    . G" I2 ]% h. Q# @+ p# Q9 ]
  33. {
    8 N" S( \5 a+ ^% s9 U* S3 ~
  34.   RTC_TimeTypeDef sTime = {0};
    , x! Z) g% s0 g# X: H/ y
  35.   RTC_DateTypeDef sDate = {0};9 R7 d: _3 N2 v! o
  36. . `2 ?: b. w- n9 U
  37.   /** Initialize RTC Only ! k; I3 p" N5 S  x  f5 f* L
  38.   */3 i: Z6 ^& B+ V* a7 y( D
  39.   hrtc.Instance = RTC;* |! D! f, k6 [: H
  40.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    " y0 c; z" `8 A- D/ t
  41.   hrtc.Init.AsynchPrediv = 127;
    ) L. J5 h5 f* y
  42.   hrtc.Init.SynchPrediv = 249;
    ; u% _- B1 G$ m
  43.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;" r* D7 E# W2 O. A0 b& g& I0 x
  44.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    ; x  c5 M0 b% s  z
  45.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;8 X- y1 s/ `) o0 `( `
  46.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    / [8 d' f) k) A$ U6 M, J
  47.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
    0 R" ?+ q* H- w8 Y% ~
  48.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    4 M! r( o3 y+ j) j$ U* q) H
  49.   {# E6 M& y5 {: F! U
  50.     Error_Handler();) x) d. C. O3 g% A
  51.   }8 [6 I9 G$ V2 n5 M  Y' I+ z( B

  52. & l( p) t) D$ L9 P) [
  53.   /* USER CODE BEGIN Check_RTC_BKUP */
    * O/ O" U" D0 l" V5 h0 v% }
  54. 4 A# ?/ x2 P' M7 w2 q  ~5 X
  55.   /* USER CODE END Check_RTC_BKUP */( c( F, I# W/ H- z
  56. 3 }; c/ V  g" s
  57.   /** Initialize RTC and set the Time and Date
    9 D. k- r5 R2 |: B& S: X, G
  58.   */4 t* h' D- e5 ~+ C
  59.   sTime.Hours = 19;& c2 |+ E  @& x; u3 r
  60.   sTime.Minutes = 07;
    " l9 P1 h# n( d5 C. N# `
  61.   sTime.Seconds = 00;
    & {! X$ I$ U, C2 _" X+ p5 ?5 H
  62.   sTime.SubSeconds = 0;
    ! H& z/ ]/ R4 N* T5 W
  63.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    ( Q8 I* @+ R; B7 D& M' ^9 |4 M
  64.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;" |% L3 \+ g% V& p1 J/ |% x, q
  65.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
    5 e4 n' k6 q2 X
  66.   {2 M* B0 g1 o. l" ^3 I, K7 K
  67.     Error_Handler();' X- X! X) s! I  P
  68.   }
    % P# O$ M0 G) i
  69.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;* |& C/ M$ `% _2 |5 R+ I
  70.   sDate.Month = RTC_MONTH_SEPTEMBER;5 U, P9 S  @$ ~& R, P
  71.   sDate.Date = 8;$ D) u& K0 E7 U
  72.   sDate.Year = 50;( Q& c$ x  J% J/ _8 |

  73. 7 |& m; P* G3 G) M9 g, y7 c* o
  74.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)9 [* G( {. u; ]$ a" [8 l
  75.   {
    ! E4 r; t, W! e
  76.     Error_Handler();; H2 d$ L6 Z; y2 J2 x
  77.   }* v; J1 H/ K( p, P& W4 A! R

  78. . `" v0 M5 W  @' B! I& H) Q1 [
  79. }
    ( K0 D& X' J+ r' |4 x  v
  80. % B( c/ H5 o+ X2 H
  81. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)- v* C( f9 h& G% {/ E/ {
  82. {
    & }$ o/ j+ U) `* n( l

  83. : r; `+ u" V- b( q/ y. N5 o
  84.   if(rtcHandle->Instance==RTC)) L# @' Z. i6 b0 ~6 F3 D
  85.   {( p; I& Z7 P, b8 ~4 n9 e0 {$ Y
  86.   /* USER CODE BEGIN RTC_MspInit 0 */
    9 u. j3 G2 E! [! }

  87. : i2 L7 K: v$ l. e  G
  88.   /* USER CODE END RTC_MspInit 0 */
    " i- l" C' Y* h1 v) Z7 \8 r, F! e
  89.     /* RTC clock enable */
    0 C& T5 p) r: s% P* F& L
  90.     __HAL_RCC_RTC_ENABLE();
    0 w  V4 R: q3 |1 t) G+ c; _
  91.     __HAL_RCC_RTCAPB_CLK_ENABLE();
    7 Q; j5 _' ?; e, q" y# H% h* X
  92.   /* USER CODE BEGIN RTC_MspInit 1 */, X& ^4 O! l8 ^. {. D4 }% w  c
  93. 1 V2 \7 V1 T, B/ \  h' i! \* G
  94.   /* USER CODE END RTC_MspInit 1 */- i' a2 ~7 R( G5 @' e: J1 O
  95.   }8 I: ~/ T6 p% D( Y1 g" G. a
  96. }
    " u, m3 \9 _4 T: ~9 K0 z8 T

  97. . f0 W" U, Z7 D
  98. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)+ \9 ]: Y2 G( j9 `) \
  99. {1 V6 {  p5 x1 G$ ~# S) L4 L, H& T7 y

  100. 5 k* r) q& m7 A1 u
  101.   if(rtcHandle->Instance==RTC)
    9 d5 q5 s1 G* a
  102.   {+ g$ _5 q0 R$ w- ~
  103.   /* USER CODE BEGIN RTC_MspDeInit 0 */
    4 ?8 O3 ?$ _3 t% Q' L" H
  104. $ X8 S8 k+ n9 `( J3 i
  105.   /* USER CODE END RTC_MspDeInit 0 */
    * f4 ]5 y, l' J2 q" O/ }9 [. F
  106.     /* Peripheral clock disable */
    6 ~" V+ `9 h) h, X2 ]& H
  107.     __HAL_RCC_RTC_DISABLE();. k# O  {3 q3 C. d* b
  108.     __HAL_RCC_RTCAPB_CLK_DISABLE();: `0 t4 }- w, F
  109.   /* USER CODE BEGIN RTC_MspDeInit 1 */
    ( {( z4 t5 ^6 s7 P  Y* m! c% m3 e

  110. % r7 m% s5 ~- ]# }2 ~0 M$ {" a" e
  111.   /* USER CODE END RTC_MspDeInit 1 */
      i0 c, x* C& h9 |9 Y8 S# d) ~
  112.   }) K6 i: H# V5 ?/ n
  113. }
复制代码
0 H3 Z% K) m! r
7 |+ x! W3 M) e1 e/ r
三、时间日期获取设置等:
1 y5 U+ ^0 R/ W; F  @% b+ Z: x6 x1、自己重绘一个设置time的函数:
" `1 G- {+ |6 `% u3 m+ s
  1. /* USER CODE BEGIN 1 */
    * G/ Z% e2 d" X" r
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second)8 W& W9 l; H, y, ~. V4 R
  3. {7 S- j( z4 q' _2 {1 P
  4.   /*##-2- Configure the Time #################################################*/' s! h/ i! p7 k- v$ w
  5.   GetTime.Hours = hour;
    # B( I0 X# I' h
  6.   GetTime.Minutes = minute;6 v/ D7 p- Z! ~4 G1 P+ p
  7.   GetTime.Seconds = second;5 V. ~# m+ K! e' V
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
    " f- w* K! t5 P! N
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    2 P8 V1 x8 K. P4 Q
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;
    2 r: m. X4 J* l' a) O9 v
  11. # v  l7 h4 T/ d2 g
  12.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)" R# c" H7 t3 @6 L  G- ^& C
  13.   {
    ! D0 M5 T- X( ]" m6 E0 b
  14. * U6 Y0 c4 a. G* P8 }# \1 ^( ~1 T' H
  15.   }
    . u3 b5 P* G. W$ x9 J5 i7 a
  16. }
    7 f3 x/ X" L! H5 B  z
  17. /* USER CODE END 1 */
复制代码

7 O" D+ G+ ?3 ]% P7 u  J' @2、调用函数实现RTC:5 K4 V6 t3 x7 A' G  `/ D
1.首先初始化RTC时钟:. L& E% O4 ?( f9 h& y  V0 L
  1. MX_RTC_Init();
复制代码

  V: Z3 f) E! V, r# A# q' y2.接着设置time时间:
6 Z& o; S; O8 j/ E% G) I# d' U
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码
" G& V. N8 Q* R# K" |8 I
3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
. y* n# r$ _1 W% t. W7 s# u
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期2 m7 Q( R8 N/ d. x: L( }: F" P
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间* U$ B+ z! e; f! W
复制代码

! l  K; k3 b: x1 G; `; n6 y4 s' o; N
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

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