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

STM32H750中RTC简介及使用方法

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

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

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


( A. f/ \/ u1 P  x

RTC 的简化框图+ `/ D' T% I% v) J; X3 b/ t" e$ _
, V9 n' f) n* k
微信图片_20221211151650.png 6 o4 H; ]/ W6 {. a0 o) z. y9 H

- E( W$ t0 G# o- R时钟和分频

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 秒,可以得到更加精确的时间数据。


" Y; F3 {0 w* [5 D% ~# p

STM32CubeIDE 配置

默认情况下是如图


* h; O" O/ D+ e. W

微信图片_20221211151647.png
) B* Y9 r! q& {# Z1 E5 n
$ Z, U. t( d+ Y. ?0 O# h. x0 x

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


$ T9 T/ k. Q/ b# o

微信图片_20221211151643.png

: W8 U# h! U; N: a  t. R

% B" F  D' H0 ^# w& z+ S然后在RTCC中使能时钟源,如果需要日历闹钟功能的可以在这里也使能上。

4 w' |$ z3 \) v/ f0 o3 g! l7 M5 a( M, z; R
$ ~9 [4 B7 T5 P" A5 _  H" b0 g4 N+ b
微信图片_20221211151640.png . p% x" X5 m# b. d* q

% I9 p/ |& G% G& y

公式如下:

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

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

4 e" N/ d! N: a# r

微信图片_20221211151636.png
2 K$ J) a) E" s: B/ {$ o$ H8 b% g

初始化

  1. static void MX_RTC_Init(void): H& b9 {" a# Z+ S8 L+ |: P( M
  2. {
    . E9 L0 f5 o1 `+ f

  3. ; a9 e! \+ T* J. q; K% G
  4.   /* USER CODE BEGIN RTC_Init 0 */
    ! a  v: ^6 U+ [( o  p; z- ]$ s& G
  5. 2 R7 ^! d) S' f9 ^8 L/ `$ U
  6.   /* USER CODE END RTC_Init 0 */
    6 {; H5 d# A! _) Q
  7. / K) [/ G$ k; A$ w8 c9 ]; ^
  8.   /* USER CODE BEGIN RTC_Init 1 */+ A4 R4 S( D; J6 J  C3 m/ c
  9. " t3 A) q. E  [* p6 k
  10.   /* USER CODE END RTC_Init 1 */+ U8 L7 ^/ t0 j) k! w( n! i$ T
  11.   /** Initialize RTC Only* l. N# R  v4 T
  12.   */" n1 S% z& g6 F# H+ j' q- z8 f
  13.   hrtc.Instance = RTC;8 a) x% ]8 e/ z% `
  14.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
    * I+ \1 U+ p. L! q( o- W
  15.   hrtc.Init.AsynchPrediv = 127;: g/ j5 C0 v: w5 @! r1 T! \
  16.   hrtc.Init.SynchPrediv = 255;: m/ q1 v$ M8 Y7 P. D; U0 S& e
  17.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;1 [# m% T6 Q  i0 u4 `% B9 p* D2 ]
  18.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    % K& y( f/ L1 ~8 F
  19.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;. c/ V- O7 A! J  `9 a7 Q
  20.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
    3 w3 B. w7 J: t! u$ M1 f  h# o! F
  21.   if (HAL_RTC_Init(&hrtc) != HAL_OK)/ b( m- U* f! Z* V, g2 Q
  22.   {
    , A5 {" h* n7 y' l, }# G# ^
  23.     Error_Handler();8 y+ z. R1 G3 s$ \
  24.   }* O9 {6 _/ ^; H: q
  25.   /* USER CODE BEGIN RTC_Init 2 */
    0 j# v! A, D+ H7 A3 c: G) ~0 q
  26. : e9 l4 J: W3 b4 u* w& v" d
  27.   /* USER CODE END RTC_Init 2 */. r9 d/ s5 Y% t. O. \

  28. . M2 R# p) W* b$ Y7 g6 A2 ^
  29. }
复制代码

+ z+ f! s8 o1 c# Z: ~7 \( Y& F/ X" g, p9 f$ I

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

  I1 {) q6 Y- x5 G/ s

微信图片_20221211151530.png : U5 g  e- r7 L

6 [  @& a8 N8 S. W/ @2 c

This function configures the hardware resources used in this example

  1. void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)4 t* t+ o/ n% B% r9 ?! y6 M
  2. {
      u; b8 [; I7 Y# H% c5 k
  3.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    1 q/ l" P( Q- e
  4.   if(hrtc->Instance==RTC)
    * H/ {( d+ X4 r4 \3 e
  5.   {
    ' E1 C) I3 O* x: k- }
  6.   /* USER CODE BEGIN RTC_MspInit 0 */
    ( d  q6 `+ h: F$ R
  7. 3 L% D" F% R, S8 h% C) p2 t
  8.   /* USER CODE END RTC_MspInit 0 */
    9 ^3 k8 Z& F3 X" z$ D4 Q! w
  9.   /** Initializes the peripherals clock9 j* R/ k( i: {. s" b3 F
  10.   */
    . L  X0 e6 ]2 V3 o* z
  11.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
    ! @, _+ b' L3 _! [
  12.     PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
    9 L" m0 \, \/ ?" l' l1 m  [7 @
  13.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    + {' p4 G9 u0 s
  14.     {
    / R' ~  {+ s: Q% P
  15.       Error_Handler();
    3 n8 J* X8 m8 H& p# G! b, n1 R2 |
  16.     }# m) x7 v( J* c7 S

  17. 0 d8 l/ E" @3 U6 m* K* w4 [
  18.     /* Peripheral clock enable */
    ! u3 |0 l0 k1 _5 \2 `# Y, e: O
  19.     __HAL_RCC_RTC_ENABLE();
      f3 i' I6 u3 R1 Y6 e
  20.   /* USER CODE BEGIN RTC_MspInit 1 */
    0 u: A* ?4 z7 Z! s7 }2 i" H

  21. ) ^4 a7 ^; S2 p) C" a" w
  22.   /* USER CODE END RTC_MspInit 1 */
      v# s+ Y6 L7 U) J6 H! }
  23.   }
    % ]* l5 A# T8 M& N- j
  24. 2 q5 j4 u4 n. N* H$ j( f
  25. }
复制代码
最后,可以按需定制自己的实现方式,RTC是特别实用的一个模块了。# d: ?' i# \6 o3 j8 e
8 O4 T( S/ i' O: ~9 E# i6 B. V/ ?
( E  ]  Z: m4 ?& [

" A1 `! O, \8 p$ u9 }8 R( n4 o作者:李肖遥+ h* w$ T( E" X4 t5 y. r3 b! S
收藏 评论0 发布时间:2022-12-12 15:00

举报

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