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
' 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
, l& x2 P. {# p% q& k" }; o9 T# M1 [# Y9 j5 `
一般情况下使用LSE,这里我们需要在RCC使能 ' |7 z( ^9 a! y, A' k( o5 K% z# T
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 `
, 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
* X8 Y* L/ G( ?+ G
( ?, p4 D' H4 G初始化 - static void MX_RTC_Init(void)
/ `1 i* e( u4 M6 K/ W - {
" H4 n! l/ s( P& V$ w
) P2 K5 s) Y. u: f, u. a- /* USER CODE BEGIN RTC_Init 0 */
7 j% ]! X3 p3 Z; C# i* u6 K3 c" s - ! p* u8 B' h, m+ w K' f# y
- /* USER CODE END RTC_Init 0 *// r4 Y" r& O I/ m0 j2 x: p- F/ d/ f
- " T+ x& V, q& ~2 J
- /* USER CODE BEGIN RTC_Init 1 */
& V2 f4 }. e8 A - / V+ i* f, R" Q0 [ n& R! G. q! a
- /* USER CODE END RTC_Init 1 */" J/ g- D. Z% N- ~3 I6 t; R
- /** Initialize RTC Only
( y C1 \8 a; z" l% Y* Q - */
% O' f# W8 j1 [) X! W* L - hrtc.Instance = RTC;8 j9 g2 N% x+ n4 E
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
. @+ u% b, P, W U4 z - hrtc.Init.AsynchPrediv = 127;
$ u$ I$ o5 P2 E9 {% @) W: f - hrtc.Init.SynchPrediv = 255;
# K. y; T, a1 C0 `' g# B - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;; c, z9 `6 v0 ^
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;8 z6 ]5 |1 F8 }8 I4 x' M
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
/ @- Y% J2 {4 j* _7 R - hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
, M9 S4 X- u5 b - if (HAL_RTC_Init(&hrtc) != HAL_OK)2 R/ R9 s# R' s) |; P* s
- {! d0 T4 P0 ^, u$ D+ T
- Error_Handler();
& ]" ?' W5 l9 o+ b! P - }
- T0 o$ w) O T - /* USER CODE BEGIN RTC_Init 2 */7 x8 s$ \+ m6 T N% ^
5 c# x3 z, G9 y: O4 f+ m- /* USER CODE END RTC_Init 2 */
3 l) g2 {7 G6 I( {' T# X! | - F7 z& F) U% n1 i2 L) A* Q
- }
复制代码
/ X7 p. @& h9 v+ t7 v' z
8 X, C* V- `- ]- w/ k可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了
5 @5 L( b" Y; z# k7 f4 V
5 S9 ?: t7 f9 r/ T
9 }9 D4 P( q3 l% S: ?
This function configures the hardware resources used in this example - void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
; y* |$ ~2 G. }1 N( m0 ?% n; z - {
& R! R& v% s: W4 _0 v5 `) ^ - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};- }8 y5 r4 w% X3 N8 T; ^5 A
- if(hrtc->Instance==RTC), N8 ~/ T$ s1 r, u
- {6 R4 [3 f& N2 @) @1 r5 p6 h
- /* USER CODE BEGIN RTC_MspInit 0 */9 Z7 t, t7 G! Y
+ v/ v$ |% c' C# ^0 |- /* USER CODE END RTC_MspInit 0 */( M5 T+ [0 ]: b8 b: j
- /** Initializes the peripherals clock* B) P8 p3 N5 p8 N' a/ C
- */; \' p N0 Q' p4 S+ B# ?
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;/ d8 `" j; X% Q+ b1 f: G
- PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
# S# H! j3 K% B - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
9 o2 X0 d/ t6 `: p/ P - {
* I3 X& M+ y/ q! }9 v+ \- m - Error_Handler();
1 J- W7 E3 s3 V* ~$ c - }$ t% u& [2 h9 O3 Z6 {
8 q& d1 [, `0 r- /* Peripheral clock enable */
P# L9 j! E5 F; R& @/ `& _; B0 D% d - __HAL_RCC_RTC_ENABLE();, x0 r/ u6 h) n- s
- /* USER CODE BEGIN RTC_MspInit 1 */
) i1 V% z- l0 j+ O7 B9 T" N. B& N - l: D2 i! `, N5 x0 |: f) m, _0 \& ]
- /* USER CODE END RTC_MspInit 1 */# g* ~6 P1 [ |
- }
, z* G# B7 g$ r* x2 u* I( t - ; a4 n; M4 {* `- v# C' L
- }
复制代码 最后,可以按需定制自己的实现方式,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
|