STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 此外RTC 还有自动唤醒单元,RTC还可以补偿闰年闰月等等,还有备份区域(BKP)写保护,这些这里不细说了。
! z4 u2 p" j. m! w. f) @+ _/ y RTC 的简化框图% n; [& ]6 O# j5 G7 x
; ]5 F7 q3 y2 o9 h$ t; s9 ]* y" V/ ]
% U/ R: |3 y* @ j
+ y8 i0 G7 V* Y9 l0 v$ i
时钟和分频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 秒,可以得到更加精确的时间数据。 9 }" E' y, y; k8 w: T B/ M
STM32CubeIDE 配置默认情况下是如图 9 N2 b+ \9 s5 O0 H; Y" L; w
! x N: d- l. y( n2 o- y, v3 p
4 |( p1 T) ~- U+ C2 h' W( _9 b2 d一般情况下使用LSE,这里我们需要在RCC使能
$ O" Y: `8 ?& D1 J. u& P+ h: ?
5 C, q( {& }0 H( }- l2 T
! Z8 B1 K7 l. P; Q. M( q7 \
然后在RTCC中使能时钟源,如果需要日历闹钟功能的可以在这里也使能上。& {# f$ } h! |
8 U; ~6 r7 h' }3 T# {0 ~5 z
5 K% p9 c6 _& l4 N7 u1 z, R
6 V- b0 L( \8 B/ ~7 a5 H
5 r; }" @' e$ I- x$ b+ v5 T公式如下: RTC时钟频率 = RTC时钟源 / ((Asynchronous Predivider value + 1) * (Synchronous Predivider value + 1))= 1Hz,也就是1秒 之后到时钟配置里面可以看到已经使能了
3 w" z$ L( x, z* Q
; j* V9 k# j( k( T/ ?$ i" r- ]) o9 y. j* O
初始化 - static void MX_RTC_Init(void)! r% t+ R7 l% x7 k; _5 o
- {
- P; }( S! _1 B" s8 p% [0 E
/ y m- K9 W6 K4 u/ N6 G4 |3 ~5 C5 @- /* USER CODE BEGIN RTC_Init 0 */
: N8 e/ {2 x8 W$ d7 r. _0 {2 y4 ~
* Y$ g0 A. s8 C, b2 [- /* USER CODE END RTC_Init 0 */
3 Y7 b7 {: L) R, D8 v" F$ K4 T - 6 l! E/ G m; m' H5 |" N- ~6 g$ D
- /* USER CODE BEGIN RTC_Init 1 */) T, d9 g: r% Q @& @4 n5 O
- # I2 u! J2 F2 e0 Y7 x' m
- /* USER CODE END RTC_Init 1 */
1 f4 N& c/ `* Q* x( @ - /** Initialize RTC Only
L* H& W# p7 ? - */- P4 d$ n/ b/ o- ?% J) @
- hrtc.Instance = RTC;1 G! w( E+ N/ Z$ h$ v6 H
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
# F; Y! \4 R8 \( A$ `& Z - hrtc.Init.AsynchPrediv = 127;
1 j0 _: k& [2 t - hrtc.Init.SynchPrediv = 255;
3 ]9 x. n) |7 S# ~+ Q - hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;+ O# v2 r e5 b7 U8 n$ C4 n: O- @( e4 j
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
8 F$ ~, A+ c$ R9 E" g+ `: I" t - hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;, R& B* a5 \+ Q
- hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;2 p( x1 v3 @2 _) Y
- if (HAL_RTC_Init(&hrtc) != HAL_OK)1 i6 J3 A, q8 u* @1 t$ w
- {+ z' }2 g2 O, c! s) y3 L r
- Error_Handler();
. w2 ^* P% c! }) H0 ] - }
8 @8 D2 w* {2 e - /* USER CODE BEGIN RTC_Init 2 */- @. ^4 a% J) \/ a
- 9 x8 [. s% f9 R# L! h. P
- /* USER CODE END RTC_Init 2 */7 p p5 w: s' N/ E3 P i
! t- o& \4 e8 z* E5 I1 K% y; S- }
复制代码 : V+ n0 N" W0 y* b @- B
7 A u0 i, k( M" M7 f/ F1 O
可以看到outline里面有很多我们需要的函数,那么自己扩展就可以使用了
) E6 p- v' g4 x4 M& _) l! z
: ?8 [# s4 c- Q! a* i a. z# v
; {6 j. k5 m- s0 E
This function configures the hardware resources used in this example - void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)7 T c. a. ]; ]# n5 u6 }0 P
- {& @8 _+ Y0 c% [0 \
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; D8 E! L- L' J
- if(hrtc->Instance==RTC)4 I, A( P; z% d* c4 k0 I
- {
7 g+ X! ]2 E( _& v - /* USER CODE BEGIN RTC_MspInit 0 */
7 M' r: a/ g( x3 N
@# Y5 ?# |$ \- /* USER CODE END RTC_MspInit 0 */
& }1 r( j/ m% ^" _ - /** Initializes the peripherals clock
7 r9 Y( C4 G- L' k. T; O - */
+ r( G5 y2 ]% d. q - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
' k; j+ k7 k- Z. q( s - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
4 N8 l3 C' |: z$ T7 f+ r - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
) R* X- V9 m( z# H - {
1 y; R, Z+ y& r$ n/ R4 _1 q1 g - Error_Handler();3 _* Q- e1 p5 w7 w
- }
$ D( v8 v% r& M3 j% d
) X6 N# X j+ |3 [- /* Peripheral clock enable */7 R# s3 p0 K- A9 l* T; w# E. l
- __HAL_RCC_RTC_ENABLE();
3 I) v4 V$ O4 D/ O; x5 {# | - /* USER CODE BEGIN RTC_MspInit 1 */9 M: U5 F6 S/ E) j
- 6 Z+ {3 e2 j3 b" s( P
- /* USER CODE END RTC_MspInit 1 */
0 y4 x! Z2 B+ V6 o - }/ S4 Y% k) W1 L
- 2 }0 ]1 Y0 M' w& D4 v! @/ h- P- |
- }
复制代码 最后,可以按需定制自己的实现方式,RTC是特别实用的一个模块了。
- N R4 ]" y2 |" \9 Q% @2 \. i" q$ R
; `: \' ^3 p# C ^ V
. M/ E& V3 j6 @- g5 F9 }& Q& r作者:李肖遥4 {9 e; \* \# r
|