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

STM32H750中RTC简介及使用方法

[复制链接]
STMCU小助手 发布时间:2022-12-12 15:00

STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。

此外RTC 还有自动唤醒单元,RTC还可以补偿闰年闰月等等,还有备份区域(BKP)写保护,这些这里不细说了。

5 [8 P' P5 b2 U* N+ v! `

RTC 的简化框图# r! s8 R) r. z( Q7 W1 p2 E7 v# w
8 z' x2 |) ]! |- k  ~/ l, b/ i
微信图片_20221211151650.png ' E8 F: B: q; ~

7 u6 a6 W) i1 D1 W8 r: e7 B时钟和分频

STM32H750 的 RTC 时钟源(RTCCLK)通过时钟控制器,可以从 LSE、LSI、HSE 时钟三选一,如图所示,有两个预分频器RTC_PRER

ck_spre 的时钟可由如下计算公式计算:

Fck_spre = Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)]

图中,ck_apre 也可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟。

Fck_apre的计算公式如下:

Fck_apre=Frtcclk/( PREDIV_A+1)

当 RTC_SSR 寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S,得到亚秒时间的精度是:1/256 秒,可以得到更加精确的时间数据。


4 w/ j& E- A  ~4 m) Y( Q* e

STM32CubeIDE 配置

默认情况下是如图

$ Q, _9 f" N" p5 \% c

微信图片_20221211151647.png
, l& x2 P. {# p% q& k" }; o9 T# M1 [# Y9 j5 `

一般情况下使用LSE,这里我们需要在RCC使能

' |7 z( ^9 a! y, A' k( o5 K% z# T

微信图片_20221211151643.png


5 [3 J) n9 j9 o3 `; u% V( A4 L' e
% g  z8 o, ?& F/ @1 z/ W) m) X! ?然后在RTCC中使能时钟源,如果需要日历闹钟功能的可以在这里也使能上。

- _+ J2 ~) z/ g0 J$ d5 z0 ~4 C6 ~- k1 _  ^2 w) m* G, X

+ q. }; I) T) b7 ` 微信图片_20221211151640.png
, B# P  F/ f2 {9 G4 B  z) Y8 z" F; N

公式如下:

RTC时钟频率 = RTC时钟源 / ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1))= 1Hz,也就是1秒

之后到时钟配置里面可以看到已经使能了


) v) s0 S3 Q/ D" G( M

微信图片_20221211151636.png * X8 Y* L/ G( ?+ G

( ?, p4 D' H4 G

初始化

  1. static void MX_RTC_Init(void)
    / `1 i* e( u4 M6 K/ W
  2. {
    " H4 n! l/ s( P& V$ w

  3. ) P2 K5 s) Y. u: f, u. a
  4.   /* USER CODE BEGIN RTC_Init 0 */
    7 j% ]! X3 p3 Z; C# i* u6 K3 c" s
  5. ! p* u8 B' h, m+ w  K' f# y
  6.   /* USER CODE END RTC_Init 0 *// r4 Y" r& O  I/ m0 j2 x: p- F/ d/ f
  7. " T+ x& V, q& ~2 J
  8.   /* USER CODE BEGIN RTC_Init 1 */
    & V2 f4 }. e8 A
  9. / V+ i* f, R" Q0 [  n& R! G. q! a
  10.   /* USER CODE END RTC_Init 1 */" J/ g- D. Z% N- ~3 I6 t; R
  11.   /** Initialize RTC Only
    ( y  C1 \8 a; z" l% Y* Q
  12.   */
    % O' f# W8 j1 [) X! W* L
  13.   hrtc.Instance = RTC;8 j9 g2 N% x+ n4 E
  14.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    . @+ u% b, P, W  U4 z
  15.   hrtc.Init.AsynchPrediv = 127;
    $ u$ I$ o5 P2 E9 {% @) W: f
  16.   hrtc.Init.SynchPrediv = 255;
    # K. y; T, a1 C0 `' g# B
  17.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;; c, z9 `6 v0 ^
  18.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;8 z6 ]5 |1 F8 }8 I4 x' M
  19.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    / @- Y% J2 {4 j* _7 R
  20.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    , M9 S4 X- u5 b
  21.   if (HAL_RTC_Init(&hrtc) != HAL_OK)2 R/ R9 s# R' s) |; P* s
  22.   {! d0 T4 P0 ^, u$ D+ T
  23.     Error_Handler();
    & ]" ?' W5 l9 o+ b! P
  24.   }
    - T0 o$ w) O  T
  25.   /* USER CODE BEGIN RTC_Init 2 */7 x8 s$ \+ m6 T  N% ^

  26. 5 c# x3 z, G9 y: O4 f+ m
  27.   /* USER CODE END RTC_Init 2 */
    3 l) g2 {7 G6 I( {' T# X! |
  28.   F7 z& F) U% n1 i2 L) A* Q
  29. }
复制代码

/ X7 p. @& h9 v+ t7 v' z
8 X, C* V- `- ]- w/ k

可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了


5 @5 L( b" Y; z# k7 f4 V

微信图片_20221211151530.png 5 S9 ?: t7 f9 r/ T
9 }9 D4 P( q3 l% S: ?

This function configures the hardware resources used in this example

  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
    ; y* |$ ~2 G. }1 N( m0 ?% n; z
  2. {
    & R! R& v% s: W4 _0 v5 `) ^
  3.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};- }8 y5 r4 w% X3 N8 T; ^5 A
  4.   if(hrtc->Instance==RTC), N8 ~/ T$ s1 r, u
  5.   {6 R4 [3 f& N2 @) @1 r5 p6 h
  6.   /* USER CODE BEGIN RTC_MspInit 0 */9 Z7 t, t7 G! Y

  7. + v/ v$ |% c' C# ^0 |
  8.   /* USER CODE END RTC_MspInit 0 */( M5 T+ [0 ]: b8 b: j
  9.   /** Initializes the peripherals clock* B) P8 p3 N5 p8 N' a/ C
  10.   */; \' p  N0 Q' p4 S+ B# ?
  11.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;/ d8 `" j; X% Q+ b1 f: G
  12.     PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
    # S# H! j3 K% B
  13.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    9 o2 X0 d/ t6 `: p/ P
  14.     {
    * I3 X& M+ y/ q! }9 v+ \- m
  15.       Error_Handler();
    1 J- W7 E3 s3 V* ~$ c
  16.     }$ t% u& [2 h9 O3 Z6 {

  17. 8 q& d1 [, `0 r
  18.     /* Peripheral clock enable */
      P# L9 j! E5 F; R& @/ `& _; B0 D% d
  19.     __HAL_RCC_RTC_ENABLE();, x0 r/ u6 h) n- s
  20.   /* USER CODE BEGIN RTC_MspInit 1 */
    ) i1 V% z- l0 j+ O7 B9 T" N. B& N
  21.   l: D2 i! `, N5 x0 |: f) m, _0 \& ]
  22.   /* USER CODE END RTC_MspInit 1 */# g* ~6 P1 [  |
  23.   }
    , z* G# B7 g$ r* x2 u* I( t
  24. ; a4 n; M4 {* `- v# C' L
  25. }
复制代码
最后,可以按需定制自己的实现方式,RTC是特别实用的一个模块了。" S/ P* w% D# _

0 N- x5 d* O9 ^/ Z/ d) M% [& X
5 v. X) l6 o5 E* G$ q( }
4 ]0 V/ z* O0 ?# J3 B6 }
作者:李肖遥# ?0 a8 o% o  [# ~5 t/ K& z$ H
收藏 评论0 发布时间:2022-12-12 15:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版