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

STM32中的时钟系统

[复制链接]
STMCU小助手 发布时间:2022-12-27 18:00
STM32中的时钟系统概述6 S% q. y6 j: {% {. p6 C

; P+ O% q( Y; w- `' `
1dfa787f80984cc0a9a3743540fba491.png 2 d# T- a2 t* b. Q; c3 G
% K+ ^0 A9 A0 A* `0 @" O- `, W
5个蓝色背景的是时钟源
! s* ?+ O* W8 o9 v6 }: m+ i- p
( U9 _; a) L4 P3 e! R7 QSYSCLK是系统时钟,最重要的时钟,可以看到其他的外设的时钟都来源于系统时钟
# l! }5 W$ q8 V7 d* V. Q. T" X. Z& Y5 \. \9 U( I9 I6 N1 E
HSI RC高速内部( _3 w# B  ]+ |, g" v2 ]
约为8MHz,但不太稳定,可以作为系统时钟,灰色背景的梯形表示选择器: z' I; I: Y2 z% [$ F

% m3 F# e( j9 BHSE Os高速外部: r# z  `2 q7 u
接晶振,例如8MHz,其可以直接作为选择器的输入,也可以分频后作为选择器输入,PLL表示锁相环,用于倍频,可以选择2-16,通过锁相环寄存器配置,产生的时钟为PLL_CLK1 {8 ~, R6 }5 M# k8 A

8 _6 h0 U7 a/ ]5 C, D8 r( jCSS时钟监控系统4 b6 j& @# l; B; i
一旦HSE失效,则自动切换到SYSCLK=HSI
4 M; ~1 _: {( p7 [: |2 C. P: v- R* M- m- Z& P( \
LSE Os低速的外部时钟+ l! n9 i. Q- j. E5 ^  {, |+ x
通过外接晶振产生,一般为32.768kHz,用于RTCCLK' }/ z( J. u; x7 h% i) X& F

/ V/ p4 R4 D$ l' S0 Z" v5 N: sRTCCLK还可以来自于HSE的128分频
. C4 Z. _/ |+ M

2 f9 I0 E7 R; h; u; X! `' {5 jLSI RC低速内部" O( p: L5 d: t' H& T( e
由内部的RC振荡器产生,约为40kHz
* D% _- U0 \3 g, b
. ~5 M# `4 ]& k) b1 z3 c  b' O主要是用于STM32的独立watch dog提供时钟
' ^$ j0 [2 ^! f2 C! V" d
6 ^6 J0 a- j/ L
4 u4 {3 N" w# `9 n+ i
MCO输出内部时钟引脚PA8
1 D# x4 \/ I1 i' h2 y+ \5 [9 h* M可以来自于系统时钟SYSCLK4 Q. C$ ]3 i6 I

/ @  q! o8 p5 J6 Q可以来自于HSI
2 q( V6 w7 L8 B! d7 A1 d

0 S6 R! A" B  ]6 N可以来自于HSE
* y* t- C) v/ c
! @& {' o' {3 q) H5 s  T# w; p  X
可以来自于PLLCLK的2分频
: {/ L" t4 ?4 w/ l' U8 u- X/ r0 ^5 x: Y- W
USB时钟
, V6 d1 B: F5 c* a/ Y9 z0 K/ ^48MHz,可以来自于PLL时钟经过USB分频器,除以1或者1.5
; S# j- r7 O% ^9 Q- |6 a( N
6 X; m' w' R6 Q# u. |72MHz和48MHz之间的倍数就是1.54 ^1 D$ B. d4 u/ q) C6 ~0 \( k; x

3 w8 k, o$ a& m: V1 gAHB Prescaler AHB预分频器
& L+ }" N! Y9 x( X) g6 T6 i1 DAHB预分频器的分频因子有9种选择:
6 t6 m$ G0 |+ [0 J/ G3 A  g
1,2,4,8,16,64,128,256,512
# ^9 v6 t% ?; }! z$ o. G+ _' r5 H! M, g) z/ x* J0 W
分频后产生HCLK这个时钟最高可以到72MHz
: R, N) q0 z5 |% `9 i  |
1 v  \6 n9 N' K) n  @2 }) R
APB1 Prescale APB1预分频器
! i  ~: N" U, J! L产生PCLK1,用于挂低速外设,例如通用定时器& ^2 W! m% j) o, |2 d

, ^5 J! g! Z1 T  D* p* ZAPB2 Prescale APB2预分频器
2 E& v4 p; m8 O3 `  Y! [* ]+ ?8 D产生PCLK2,可以供对于时钟要求高的外设
& T1 J. c: k2 E5 {6 U8 K1 F8 E
8 N- ]9 J& w* e& H& Q
注意:任何一个外设使用前,必须首先使能其相应的时钟
. }, |7 S* u. Y. a! _
% j# o* b3 r% ~

+ J" ]7 |7 Y/ ystm32中的时钟配置RCC
) z  o8 k. Y2 s如下图所示,为STM32工程中对于时钟的配置文件5 Y6 x% C# a1 R& V, @/ c, k. |

; O- w( T  T) C# ?9 A: D& e
99851e60f018412a8651f4f8bf598a39.png
3 k3 J! j7 A- N  @
2 y$ h% o( D3 l& R. r* H首先打开寄存器地址名称映射头文件; n, d( a* B! R' {8 f

- R; ?. L- z/ O- A# C6 ^+ }这个头文件中对于大部分寄存器的映射都会在这里通过一个结构体来定义: G" C  C  @+ T8 T; T
% u; A( O; k8 {& G
4671e13f8dbe4c0e8c1f459c856b6370.png - p# ^$ e$ ]0 r: H+ P

3 G# e9 U; m/ |: D* b* h 如下图所示,这个结构体中的成员变量映射了对应的寄存器
0 \3 o0 E" s: e6 R
+ @6 k8 {9 x6 e, X0 y, `
78e1d7015a7848bd8b34505eba25d43a.png
  N1 \* v) @' k4 K  v
, c2 ~  X8 R5 D# Z3 Q: J6 }
对于RCC寄存器的详细描述,可以参考STM32中文参考手册- ^/ ?, t0 j/ f5 j4 c" M2 e
8 v. M: l5 S5 R5 Q+ B
4a26bce9037041b787657de7edb60174.png
$ d/ q5 Z: Y" e( b5 s6 k. F6 a
2 U; U' R8 L! x- O
- l& K- W0 t) D0 r( [. \9 e  Q6 _
RCC时钟控制寄存器
; A7 F3 z6 K7 J2 {1 f1 qHSI,HSE,LSI,LSE,PLL这5个时钟源,使用前需要使能,使能后还不稳定,稳定后会产生稳定标志位
& D/ k; o3 x/ R% v+ H6 |! a6 n) M, z- T; z! P, x( l. F
30131992d96f4ed9b02432ba835e7ba4.png
2 v2 o" S. _5 D4 D. p; [$ @% n
1 T& o% d3 X, ]3 Y0 N

( Y4 e7 F  O& N  dRCC时钟配置寄存CFGR
$ J* d( l9 A: `; ?7 p
配置选择器,PLL倍频系数,Scaler的分频系数  c. k# U$ g4 Z0 g

9 I- n- d! }4 m, H. [* w7 w' B* j5 L9 C
32dfbfb4fe0941ce94851a80f25423a0.png
' J$ R+ h, x: v2 C2 J" ~6 V; g/ x1 s% P

5 R. a6 H1 `: ?/ ^4 Y5 } 35598cb4ab344e148de79574e53e755a.png $ \. q$ J% u% l9 I8 [
% s5 k4 y6 l& B; M
RCC外设时钟使能寄存器
! J2 U9 j5 `6 _% E. |AHBENR AHB外设时钟使能寄存器7 U3 L8 z' p- a0 r5 `% o
包括SDIO,FSMC,CRC,FLITF,SRAM,DMA1,DMA22 U& E3 s! P+ |; v  t4 N

) f( d9 A8 k" g8 Z. O4 z5 W
6bc5947e2ade4e11a3932fa655659f4a.png ) ~, S1 B; ]* S

0 v, A+ r$ M6 x5 X8 b" g$ c, i
2e3c85c1ad1c4c129962e4eede3a4e2c.png / F7 d, @. ]9 D) J3 B6 e
2 I# p* y; w9 o, j
APB2ENR APB2外设时钟使能寄存器" ^3 z4 q3 \. W4 E1 M1 L% }
包括ADC3,USART1,TIM8,SIP1,TIM1,ADC2,ADC1,IO ABCDEFG等
& w% U+ N3 r! y
* Z* ]" H- S- O8 F+ A. H
cda89437598745288343d4382b0d3eaf.png 6 B2 z' K. v/ k1 F" `

9 W: `& o- a" A1 g2 i( h' @
d2308d5111c447f5874938378a6f5fb8.png / G# z0 X, v4 i$ D& A' H
! P. {6 O. F- r- W4 U7 V; k" ?' p( |
( i0 j% p* u  |8 K
0768d25641454a7382bbf06dd145f662.png
& Y% w% h1 K, n9 ~: ~/ r+ U
( N& p! |$ k- U! w5 C) G2 d
APB1ENR APB1外设时钟使能寄存器* w5 J, ]( Q3 u/ e( }+ F
包括DAC接口,电源接口,备份接口,CAN时钟,USB时钟,I2C时钟,UART2345时钟,SPI23时钟,看门狗时钟,Timer 234567时钟等
  A5 J2 s* f: e' d& n2 |/ D. P$ [( O" a# E
56a3d818a8794e08bb27a85a72e85844.png
4 y- N% g  s4 L/ T
6 P, Q/ c: N; Z
021834f2395b48cbae24197de9f8abe0.png
$ I( n* O7 m6 R& _9 i+ Q2 N! M0 v6 l0 D9 c5 q
bd0a2909dca1438496c594a3f183171e.png
9 V/ ^: A2 J9 M  l5 e ; }# i. w9 s: Q7 s7 W' e2 v2 x
72949a1987ba4e1cb28c4ee51e46b116.png . ~2 M6 q) @) @
8 e  {5 B: @8 b  ]0 p
RCC寄存器的操作
6 h7 u7 ~9 `  O( B  D# |7 |可以通过相关的库函数,对于这些RCC寄存器进行操作1 I3 N* O8 m$ {0 c+ \4 p- t( f

) P8 M8 h' ^. F
b5a3ccb26dce4dd796b258f4d6b8c43d.png 8 U# A, a  ]5 N
5 T5 a7 P* ]3 f+ s
这些库函数可以分为以下几类:; Q) y! R* o$ D4 w

4 t# v" t- |! V: R
* s6 S& Z. _& h; V9 x6 L
时钟使能配置0 B) l: W& E; F4 q& y

1 q* P, ~# \0 `void RCC_LSEConfig(uint8_t RCC_LSE);: M) J4 }/ X- i2 H) U+ x' ?% D

+ ]3 g( o1 z, N% D# W+ f% tvoid RCC_HCLKConfig(uint32_t RCC_SYSCLK);
1 g. e9 W: v/ q/ n) Q' h: g

5 v1 E0 O$ E/ Q5 ^8 wvoid RCC_HSEConfig(uint32_t RCC_HSE);# P8 y* b. G: O" B

( E( Z* c" t* c4 jvoid RCC_HSICmd(FunctionalState NewState);
2 n' t: r6 {4 R! m: q: u( j& c/ X7 x$ c4 @
void RCC_LSICmd(FunctionalState NewState);# N, L& |2 t* U& ], @* e
8 f  b) q. ~5 U$ @6 E2 o
...* K+ D8 R' Y8 n. p9 J

$ x7 I1 Z% p% T" I

$ q9 P& L+ U  `' P: c时钟来源配置8 y( L. `7 h9 j  e$ }
* Q2 ?7 o9 ^& Q  P- s6 j* p
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);& D; |& s0 a9 a% y2 Q

. C. F+ ]) K. g- A6 p3 ~void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);9 }+ {$ [' K' Y: x# x
' l+ p4 m; Y! ^* x
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
9 G2 D: ~3 ]  g/ S

+ v0 R: `! h4 A. E7 H# @+ l分频系数选择配置
# H! \; s3 T: x0 g' }. Z
( b: @$ {3 @+ H4 Z8 A  r/ p' j
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
9 a- S$ Y/ u# j. l& i% W# I( g$ p' u
/ ^  A( x0 I5 M4 ^' J7 ^
void RCC_PCLK1Config(uint32_t RCC_HCLK);
# ], n, J3 M/ g+ y* Y
) d1 ]* o! o3 `
void RCC_PCLK2Config(uint32_t RCC_HCLK);
& k# N7 V) i8 o6 Y  V- _
/ `6 o  E$ R: k- _& r
9 m! D4 Q! v% r2 K; @+ e3 N
外设时钟使能
: ]8 A5 S0 d1 t
) q9 }! J" Y' s. B0 ^+ J* s
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
+ s  K- \- n1 G0 H2 H; c

% K, M# Q0 D: Y: H& L* J# g1 y5 S' Nvoid RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
6 R' \( p! g( N4 J! H
! f& `& y$ ?# |" G9 d" zvoid RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);6 s  Z8 L7 l0 o
  R4 g) k2 q: F. ?4 H
其他外设时钟配置
$ i7 K$ W4 s  {; `( T  ~) B

  T1 l  ^- @1 N% @# xvoid RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
- k; x: M# s+ m3 {
( t9 d) i) q- c3 avoid RCC_ADCCLKConfig(uint32_t RCC_PCLK2);; W4 Z/ x8 B0 T7 P( Q

6 \8 G5 `- m, g! A" f状态参数获取
0 ]: h! X" b8 d6 n1 p: k1 ~; @% f% J7 o8 m( E
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);
# H8 D" z7 G  F# p5 h! x; U
  P$ O5 A& A' R% o0 [& E- f* r6 c9 A1 M2 Y
uint8_t RCC_GetSYSCLKSource(void);
/ }4 I- W3 n9 P6 C2 R  p4 L: }$ v2 s
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);: T2 P+ g  V8 [* e
. k! O3 s. L: Z
RCC中断
% @, F' k3 `/ ~6 }' H
7 R8 s$ s1 E; V+ j$ X% fvoid RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);
* U  X9 y! U6 y+ `
/ B, e" k1 o. c$ M, v  u7 W
ITStatus RCC_GetITStatus(uint8_t RCC_IT);& U! d# H* |0 e# s

' z" p7 b3 T) n! U3 `) qvoid RCC_ClearITPendingBit(uint8_t RCC_IT);
3 w! ]2 i; j' Y6 L( ~. U————————————————
$ ?4 u+ Z8 s# q2 Q! E版权声明:CodeForCoffee
, w7 R6 Z, E& [  I6 H0 ~
/ L( a. H& a0 {' t" j& g
收藏 评论0 发布时间:2022-12-27 18:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版