STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 此外RTC 还有自动唤醒单元,RTC还可以补偿闰年闰月等等,还有备份区域(BKP)写保护,这些这里不细说了。 + L/ o8 h F$ {0 M
RTC 的简化框图
: `; l" U6 g0 P* H- a; R5 a! i: j0 I3 q) s
1 G& b) u, z7 K
6 p. s- p/ `8 D- Q' j
时钟和分频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 秒,可以得到更加精确的时间数据。 3 o$ @* U- O6 Q% O
STM32CubeIDE 配置默认情况下是如图 ' p: B& V& ~- u5 g8 ^# H1 t4 {
j/ w/ o7 h1 g* { x# O
5 Y, _) S9 Y7 ~" X. M2 _一般情况下使用LSE,这里我们需要在RCC使能
; p! M$ G4 q, B' _' _6 D
& f$ _4 T, V& R+ A0 z
% ?( r$ A; U: g; F2 @然后在RTCC中使能时钟源,如果需要日历闹钟功能的可以在这里也使能上。
- W( n2 M: v& [4 m6 K/ v0 u5 F" _" h+ f- `4 {, C2 u2 S
7 m$ Y2 e5 m; W2 B
5 C6 m/ W0 D" V4 h9 p1 t N5 C* E
+ T2 Q. V+ ~1 m6 v: A, r公式如下: RTC时钟频率 = RTC时钟源 / ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1))= 1Hz,也就是1秒 之后到时钟配置里面可以看到已经使能了 # P9 H! U) V( m5 K
3 z; g1 D! @' |4 W* V9 s3 R8 f% a( ]" L6 i. z! H3 S# h& e" {! z& G
初始化 - static void MX_RTC_Init(void)3 }) O0 E8 E8 v& j& M
- {5 l) j$ k2 q7 l- F! A( `4 |* T! R
' |; f9 x* C$ N* z- /* USER CODE BEGIN RTC_Init 0 */2 E" t; }4 l2 i6 N0 ?
4 r3 t4 }6 v. l9 c+ `( i2 W# g+ r- /* USER CODE END RTC_Init 0 */
6 ?4 N2 i2 c1 N/ G, u5 O# C
9 n6 x: z% `7 p+ w5 h. l, A- /* USER CODE BEGIN RTC_Init 1 */( D6 s) ?& Y, c4 V* m: s' z
- : F% E d8 M9 |' ~* z! S
- /* USER CODE END RTC_Init 1 */
+ O4 l; S" k. B. T9 d# A - /** Initialize RTC Only, A+ R" m: T5 E
- */* I# l# {9 K, j5 f- H* m% r. k2 M
- hrtc.Instance = RTC;8 F7 w# w0 b- m. u& d0 {! `% x
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
7 j4 s2 v% u; N3 ?% v# R - hrtc.Init.AsynchPrediv = 127;
# T! Y$ [: w( c- F1 F% T - hrtc.Init.SynchPrediv = 255;
8 u: p8 t$ d& O - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
# v) G$ u* U1 A, f7 I( v, @ - hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
2 Y5 p7 E3 I/ S9 ^/ c& z - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;8 x" j9 r3 L q W1 U
- hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;: u+ E! S: ?# `& r8 q5 e
- if (HAL_RTC_Init(&hrtc) != HAL_OK)
* r5 Z; T- N; T& X8 O - {
' o( \0 a% m& R& F) D! i& I( ]' r - Error_Handler();
% s1 `# v8 h/ {- O4 M" v - }
+ [0 l% X1 G" _, z3 z7 T1 E; \ - /* USER CODE BEGIN RTC_Init 2 */6 n' t! b4 s# V, u6 c6 Q
- ]' N g. `$ P5 C/ A3 }
- /* USER CODE END RTC_Init 2 */
( f7 n0 a3 X: \6 s' {3 M f - 7 m. K* o/ E* A
- }
复制代码 . \' `2 L/ v$ w3 c$ Z, x- J
0 j, A/ f; y0 ]6 @5 i) C
可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了 / Z7 y7 o* m3 \3 D
* }' ?( R8 o; `2 v) u& ?
5 ?1 _( q8 O7 y6 mThis function configures the hardware resources used in this example - void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)$ l1 G- P. [' {- T8 w9 W* v% h7 c
- {
5 t+ ]" S, w2 |6 r& Y! i3 E. X - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};# X2 {) C5 t9 H8 Y
- if(hrtc->Instance==RTC)
# ?3 m) \' z( p- S - {
$ }& l/ o+ w4 |- {# R - /* USER CODE BEGIN RTC_MspInit 0 */) d# s- l; h F- g7 M+ u5 y. w
* o4 L4 v# k9 f1 E- /* USER CODE END RTC_MspInit 0 */
2 \, i$ r2 E* s6 H. ^5 u - /** Initializes the peripherals clock0 o W- ^3 @7 ^
- */
3 s* M' @8 l1 _ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
$ L F& k$ C; W j6 h. Q, A- g - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;6 G1 l8 M3 Y+ |% Q% `* m1 R
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)3 A/ z5 u9 O0 ^" U2 T% \
- {
8 o; _3 o0 C5 g& q7 O5 B" h - Error_Handler();* D9 \: X+ N3 j3 {2 Z; B `
- }6 c5 K; s& W( }# v5 O5 N
- 8 O8 I& t5 e% m: I2 a3 v' x
- /* Peripheral clock enable */( M" U# S" {4 g* j$ d; H
- __HAL_RCC_RTC_ENABLE(); v( p* q+ p$ X2 h: p F
- /* USER CODE BEGIN RTC_MspInit 1 */- H% U3 j. T7 L Q! w$ h3 W
$ Y/ |+ ?* S" i! X! _# x- /* USER CODE END RTC_MspInit 1 */6 Z& ~' b* ?6 T( }
- }0 a+ t6 C+ H+ a' \, _7 ?! j& i
; m2 ~# l/ o/ m, Q$ m* `% Y* g- }
复制代码 最后,可以按需定制自己的实现方式,RTC是特别实用的一个模块了。
9 S# _! u9 R: B) s3 H
) P: G; L2 }3 q1 v3 z8 c7 U& t+ C4 j- D8 [3 Q+ f' E+ a3 ~1 \" J5 o/ `
O/ l7 b0 U: S8 b. X作者:李肖遥
! A. B9 B3 ?$ e |