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
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
) 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
: 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
. 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
2 K$ J) a) E" s: B/ {$ o$ H8 b% g
初始化 - static void MX_RTC_Init(void): H& b9 {" a# Z+ S8 L+ |: P( M
- {
. E9 L0 f5 o1 `+ f
; a9 e! \+ T* J. q; K% G- /* USER CODE BEGIN RTC_Init 0 */
! a v: ^6 U+ [( o p; z- ]$ s& G - 2 R7 ^! d) S' f9 ^8 L/ `$ U
- /* USER CODE END RTC_Init 0 */
6 {; H5 d# A! _) Q - / K) [/ G$ k; A$ w8 c9 ]; ^
- /* USER CODE BEGIN RTC_Init 1 */+ A4 R4 S( D; J6 J C3 m/ c
- " t3 A) q. E [* p6 k
- /* USER CODE END RTC_Init 1 */+ U8 L7 ^/ t0 j) k! w( n! i$ T
- /** Initialize RTC Only* l. N# R v4 T
- */" n1 S% z& g6 F# H+ j' q- z8 f
- hrtc.Instance = RTC;8 a) x% ]8 e/ z% `
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
* I+ \1 U+ p. L! q( o- W - hrtc.Init.AsynchPrediv = 127;: g/ j5 C0 v: w5 @! r1 T! \
- hrtc.Init.SynchPrediv = 255;: m/ q1 v$ M8 Y7 P. D; U0 S& e
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;1 [# m% T6 Q i0 u4 `% B9 p* D2 ]
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
% K& y( f/ L1 ~8 F - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;. c/ V- O7 A! J `9 a7 Q
- hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
3 w3 B. w7 J: t! u$ M1 f h# o! F - if (HAL_RTC_Init(&hrtc) != HAL_OK)/ b( m- U* f! Z* V, g2 Q
- {
, A5 {" h* n7 y' l, }# G# ^ - Error_Handler();8 y+ z. R1 G3 s$ \
- }* O9 {6 _/ ^; H: q
- /* USER CODE BEGIN RTC_Init 2 */
0 j# v! A, D+ H7 A3 c: G) ~0 q - : e9 l4 J: W3 b4 u* w& v" d
- /* USER CODE END RTC_Init 2 */. r9 d/ s5 Y% t. O. \
. M2 R# p) W* b$ Y7 g6 A2 ^- }
复制代码
+ z+ f! s8 o1 c# Z: ~7 \( Y& F/ X" g, p9 f$ I
可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了 I1 {) q6 Y- x5 G/ s
: U5 g e- r7 L
6 [ @& a8 N8 S. W/ @2 cThis function configures the hardware resources used in this example - void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)4 t* t+ o/ n% B% r9 ?! y6 M
- {
u; b8 [; I7 Y# H% c5 k - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
1 q/ l" P( Q- e - if(hrtc->Instance==RTC)
* H/ {( d+ X4 r4 \3 e - {
' E1 C) I3 O* x: k- } - /* USER CODE BEGIN RTC_MspInit 0 */
( d q6 `+ h: F$ R - 3 L% D" F% R, S8 h% C) p2 t
- /* USER CODE END RTC_MspInit 0 */
9 ^3 k8 Z& F3 X" z$ D4 Q! w - /** Initializes the peripherals clock9 j* R/ k( i: {. s" b3 F
- */
. L X0 e6 ]2 V3 o* z - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
! @, _+ b' L3 _! [ - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
9 L" m0 \, \/ ?" l' l1 m [7 @ - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {' p4 G9 u0 s - {
/ R' ~ {+ s: Q% P - Error_Handler();
3 n8 J* X8 m8 H& p# G! b, n1 R2 | - }# m) x7 v( J* c7 S
0 d8 l/ E" @3 U6 m* K* w4 [- /* Peripheral clock enable */
! u3 |0 l0 k1 _5 \2 `# Y, e: O - __HAL_RCC_RTC_ENABLE();
f3 i' I6 u3 R1 Y6 e - /* USER CODE BEGIN RTC_MspInit 1 */
0 u: A* ?4 z7 Z! s7 }2 i" H
) ^4 a7 ^; S2 p) C" a" w- /* USER CODE END RTC_MspInit 1 */
v# s+ Y6 L7 U) J6 H! } - }
% ]* l5 A# T8 M& N- j - 2 q5 j4 u4 n. N* H$ j( f
- }
复制代码 最后,可以按需定制自己的实现方式,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
|