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

STM32中的时钟系统

[复制链接]
STMCU小助手 发布时间:2022-12-27 18:00
STM32中的时钟系统概述
8 k( n3 M+ O9 e8 _: o% X
0 N1 q/ l& m% F- M
1dfa787f80984cc0a9a3743540fba491.png * I$ W7 Z2 ~$ Q4 _7 m0 i

& X% S+ f, a% [7 X. z) ^5个蓝色背景的是时钟源
0 w$ v( `  G* @' e# l/ {; L8 D7 \
4 [$ _0 Y, D! i3 NSYSCLK是系统时钟,最重要的时钟,可以看到其他的外设的时钟都来源于系统时钟
& y7 o1 b( F! z8 d" T1 S# U6 a2 k, y/ H2 L
HSI RC高速内部
/ m1 ^- j) d! j/ w) o* N$ X2 Y约为8MHz,但不太稳定,可以作为系统时钟,灰色背景的梯形表示选择器0 d0 u/ [% o( w- J
. |$ w6 C. J# e# c* u! Y( K
HSE Os高速外部. w% x2 P4 f1 {3 _6 \# @
接晶振,例如8MHz,其可以直接作为选择器的输入,也可以分频后作为选择器输入,PLL表示锁相环,用于倍频,可以选择2-16,通过锁相环寄存器配置,产生的时钟为PLL_CLK9 k! W* }4 v$ B, Q* U% p
4 Z% I# ~' |3 M1 \3 \
CSS时钟监控系统% w, l: d+ {0 `
一旦HSE失效,则自动切换到SYSCLK=HSI8 @! `8 z; s7 u3 x  x  v
9 Y# }' O# W( R- `3 b4 W
LSE Os低速的外部时钟% D# b( x8 J6 x' E% }4 @  r
通过外接晶振产生,一般为32.768kHz,用于RTCCLK
% ~6 O1 y# T& {) l1 R. S
) ?+ ~; |( I% U4 _6 v  ]( }! mRTCCLK还可以来自于HSE的128分频
8 \4 l5 z6 f, M& [+ {
* y/ ^. c: v+ L
LSI RC低速内部
7 n8 V( _+ T! B! E由内部的RC振荡器产生,约为40kHz8 }& M* Q1 e4 ~  l1 [) o
8 Q1 P8 m' x5 X8 c7 s' N; }$ n8 D
主要是用于STM32的独立watch dog提供时钟* U! X9 z2 [1 a! f/ N
' g) J0 x3 |  T! Q9 U  z

2 H4 j' b, n  ^8 }9 d$ E; zMCO输出内部时钟引脚PA8/ [. B& k! S7 h1 a6 U/ j
可以来自于系统时钟SYSCLK! O) @2 ~8 g# K4 E$ `

3 D3 |& k* J* {, t可以来自于HSI" i7 a! s% l( N* ?9 l

2 d5 t0 |1 {8 x( N9 l6 J可以来自于HSE$ g! v5 ~) ?( R
' v" c" a  }7 z& @0 U; I
可以来自于PLLCLK的2分频- f  m# U& U; H  g) K, n

% T, n9 b. B! p" R) ?3 Z" uUSB时钟& D! y8 z- G1 @7 j
48MHz,可以来自于PLL时钟经过USB分频器,除以1或者1.58 y7 t5 V# E4 k8 |! V5 H/ n

  z. W3 L& s" z. F0 i2 m72MHz和48MHz之间的倍数就是1.5! z. P/ b3 s# e" ?; I- v+ [

1 M7 w1 N7 B8 E$ t# B6 ~AHB Prescaler AHB预分频器
0 N* E: l1 a8 i( t$ L. qAHB预分频器的分频因子有9种选择:
2 N! Q0 z0 G* Q
1,2,4,8,16,64,128,256,512- I& C; r0 F6 O0 n8 Q9 ~

. ?: i2 [# G" D分频后产生HCLK这个时钟最高可以到72MHz
, F0 v- U: z1 i+ F1 o

# d: f; F( D) ?$ M3 h* J8 p- g2 P5 eAPB1 Prescale APB1预分频器
. F# e" a. ]$ ?+ S' ~4 c- R产生PCLK1,用于挂低速外设,例如通用定时器
; H9 G4 q" v9 i1 d7 u  C. G

+ w. T1 h* J2 ^# P' f' g, ]9 EAPB2 Prescale APB2预分频器6 [4 V" a* z8 ?; t6 n4 |7 f
产生PCLK2,可以供对于时钟要求高的外设
/ [" [& C; r! B* z3 F3 H

/ F; _/ N! I; s" {, n% }7 N/ b注意:任何一个外设使用前,必须首先使能其相应的时钟
* r0 d! s2 i3 e" y7 {
9 ?2 s. q& D9 |2 r5 Z+ z
8 c! h7 s% K& a8 E" L' q
stm32中的时钟配置RCC
1 K5 I  C2 i! T5 _/ l$ X如下图所示,为STM32工程中对于时钟的配置文件
$ X5 Z- D- r+ w  f! O; o, _( ]! K0 d
% W; X  V$ o8 i3 n" X% ^- j
99851e60f018412a8651f4f8bf598a39.png ' w* D1 q/ s, u) ?

8 o$ }* h$ s6 N* K首先打开寄存器地址名称映射头文件
7 S" h; [# Q( v' f0 h- V4 L; a7 v

1 m& O: G0 y  y这个头文件中对于大部分寄存器的映射都会在这里通过一个结构体来定义7 Y% `  v. t# R7 c" W& f' C0 O
( k: d5 L0 `6 j. j4 Y% K9 y7 D- O
4671e13f8dbe4c0e8c1f459c856b6370.png 0 y% r, n& T2 V
9 r+ e( j% Q- z
如下图所示,这个结构体中的成员变量映射了对应的寄存器0 @1 _* r; ?4 k+ A$ B) v0 `
( g$ W. B7 t. e
78e1d7015a7848bd8b34505eba25d43a.png
/ x3 U1 u/ n5 m; L+ c' ?
# ]. j& ?7 U8 ?/ E5 [( W- T- c+ I
对于RCC寄存器的详细描述,可以参考STM32中文参考手册2 m: b8 ^- D! l) H5 Y$ X
! ?: O2 R# @7 t6 |' n' m# C
4a26bce9037041b787657de7edb60174.png 6 v6 V5 H) c, A( v+ B4 [
! D' S% o( \: z. S3 n% w1 Y# _3 r

2 _2 y* C: ], e  e, I3 BRCC时钟控制寄存器# E. q9 a+ b+ M- l5 m0 ?- l: ]
HSI,HSE,LSI,LSE,PLL这5个时钟源,使用前需要使能,使能后还不稳定,稳定后会产生稳定标志位
+ V+ \1 v0 y; m/ s$ Q  U' v. K) n% G8 b
30131992d96f4ed9b02432ba835e7ba4.png % F# q% R  G* ]* {7 I! R

( X! G- A+ G+ ^
' W) T% x+ Y9 p, A
RCC时钟配置寄存CFGR
# ~! e( a7 M8 v7 O
配置选择器,PLL倍频系数,Scaler的分频系数
7 J# m6 s* _9 Z, P% Z# V! i4 J3 v' t. X
32dfbfb4fe0941ce94851a80f25423a0.png # H( t0 h/ R4 }% ~
8 W, L- w- n! I& B. R

6 n, P  m9 Y; \/ R9 D6 ~: K' o 35598cb4ab344e148de79574e53e755a.png
7 y6 r- n0 \7 C- H2 X
& }! `8 S/ H6 w( I6 |. z! y
RCC外设时钟使能寄存器
4 O; Q7 H) s+ o- IAHBENR AHB外设时钟使能寄存器
- ~( {4 w: K: I- u包括SDIO,FSMC,CRC,FLITF,SRAM,DMA1,DMA2" d1 S2 e7 f$ W- P! W$ P- {
8 G% ^0 ~& n; L6 j
6bc5947e2ade4e11a3932fa655659f4a.png ( u6 w1 b( R/ O2 x( s2 @( h% B

7 X# \! }( }9 ?
2e3c85c1ad1c4c129962e4eede3a4e2c.png 2 L% U- K' j8 ?' D
: a6 ^2 C" l, y
APB2ENR APB2外设时钟使能寄存器
- [+ ?& ~2 [7 X! _. q/ ^ 包括ADC3,USART1,TIM8,SIP1,TIM1,ADC2,ADC1,IO ABCDEFG等+ D9 B$ d. @/ ~, s6 B$ V

- i, a3 }( u" V: Q% A
cda89437598745288343d4382b0d3eaf.png ) I- p7 w- J$ r! _

/ i0 w9 a; q$ N; O) Y
d2308d5111c447f5874938378a6f5fb8.png 4 m! r- t6 p: l- L9 M# c. L/ D- \
% q/ t/ G2 R* Z, o0 s% m; U+ k7 U

; t* m  ?. @. @5 t 0768d25641454a7382bbf06dd145f662.png
+ q5 D2 T% f, s

6 L4 u) b6 h3 X- \6 {) N# d APB1ENR APB1外设时钟使能寄存器" {1 s- {6 O7 F" F
包括DAC接口,电源接口,备份接口,CAN时钟,USB时钟,I2C时钟,UART2345时钟,SPI23时钟,看门狗时钟,Timer 234567时钟等
1 d* y3 c' h6 h$ F% b; `9 t* I4 w% E3 N# }  z
56a3d818a8794e08bb27a85a72e85844.png
9 |7 N/ V) j5 t1 K# M
6 q9 X- }8 ?1 G8 E
021834f2395b48cbae24197de9f8abe0.png
' f, z6 R+ B0 X# \  q# n7 i1 G- ^
bd0a2909dca1438496c594a3f183171e.png
/ V- c0 h* s' T/ Q& l$ Y: L: j : `5 D) t. d3 b: N
72949a1987ba4e1cb28c4ee51e46b116.png
# L2 s% M, `3 ]9 B3 S! m

0 S0 {8 k+ s  b6 e* C* sRCC寄存器的操作; i' T" J6 D8 d- {, t1 Q& G
可以通过相关的库函数,对于这些RCC寄存器进行操作' ?- t, ]' [+ i6 G
' b# A9 Z! `# W$ @
b5a3ccb26dce4dd796b258f4d6b8c43d.png
9 n$ K# y( }  M: s" d( F' J: O" E1 P! t$ E5 A. `4 e1 \/ Z; k
这些库函数可以分为以下几类:% T2 K3 r0 O8 e

" F( `+ W% F& v8 s8 f3 @
2 ]9 P% y, P9 n" S  }
时钟使能配置
( m" E5 A* ]4 [9 `, d/ Y* G+ [, x0 B6 z8 ^! y) g. ~% ^! M8 m/ L
void RCC_LSEConfig(uint8_t RCC_LSE);" l  t4 W8 {; ?

" i- _! W- A' e% Jvoid RCC_HCLKConfig(uint32_t RCC_SYSCLK);
# N: X3 x* ]9 W2 z+ t% V* Z+ F" z( F+ n

8 B) m0 b3 c: ]+ f6 Q9 E3 I. evoid RCC_HSEConfig(uint32_t RCC_HSE);: c1 h: h4 M, `. _: x9 A

7 n2 [' u4 c. P# e" i/ O; [void RCC_HSICmd(FunctionalState NewState);
. f/ Y1 f8 e4 e+ c4 i  l2 Y" e% k6 y  Q" N! G
void RCC_LSICmd(FunctionalState NewState);9 B- X4 ~, [% b
4 l  Q, h; p7 W8 p$ C0 y: X/ [- N  B* L
...
4 U( T9 q' U5 O. @. C% L- q& G8 k/ {' ^, s) t+ a
/ V# h! L6 t* J- R( ~
时钟来源配置/ Y/ b6 I8 H3 S* ]/ o6 z0 A% P6 P2 \
+ Y$ h9 J, c% \  D/ M/ M! e/ o
void RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);
/ S3 r" W5 T8 }7 ~4 Z/ W3 j3 i/ _
8 J3 l4 g4 S6 Y0 o# G0 x- W" Wvoid RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);  r, Y" _/ d/ X4 \7 ?9 J' R/ n

( Z  O% m/ ]+ _/ R9 @: B# tvoid RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);# z8 g& q0 t  G1 ]

: R& E: y8 ?5 n6 c9 p5 _( W分频系数选择配置
3 Y- x6 V1 Y1 P* N
4 N% j) `/ f; M- r9 I/ Y8 a- x8 N
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);
1 Z+ a0 ^1 t- e0 R7 j8 [
$ [3 V/ O) G$ L$ `
void RCC_PCLK1Config(uint32_t RCC_HCLK);
5 z* f- Q. I, g
$ Q' D; V- \$ w+ Z7 M) W9 N
void RCC_PCLK2Config(uint32_t RCC_HCLK);
$ f0 U# z# ^4 z- v1 N" ?/ e
0 l! x/ q2 g# l# A3 k
* t7 N: n  [& J) ]+ q9 A& j! v& l4 ~) Z
外设时钟使能; n1 ?* \) I) q* i$ L) }
% E% A6 U$ `( u0 E
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);- x8 [! U2 ~4 j' i2 J( C9 v# a) D" I
6 j4 u* C0 _. R
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
6 M' d& A6 o/ A2 I/ H6 P, r; [  ~% S& @3 X; I2 S1 v  y$ _7 P1 u
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
; Y1 H3 q  j7 F4 A' }" ]1 C, n

  r$ A$ B1 [9 s/ c* D其他外设时钟配置
; N  h3 X5 C' g+ r

, P1 ?) L9 E& K1 Ivoid RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);2 H# `5 l% v8 s. N, R
- G' R- v+ q- `% ], Q3 D% [
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
# }3 C9 J( [7 C8 K3 @, u

# J8 N) _' Z- E6 q$ G状态参数获取
/ x9 {' h4 h+ `% d7 c6 Q  E' B( `$ a
void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);
! }" [- f* c/ J$ Q3 z: n

, @$ ]+ v' b# b6 D6 L- G- K1 Tuint8_t RCC_GetSYSCLKSource(void);
+ ?! Z& d4 i# x0 N# Z7 R& j3 u4 ^' g
+ E* U0 z  o6 W6 T3 v8 q) o+ RFlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
7 ^6 Q& E/ R, O" `0 M! b& Y
; x3 ?1 a; M: S* W3 T$ \) @: vRCC中断
8 p$ y3 I* l1 c1 f" [3 `
2 U  K$ R: Z3 y; V8 Pvoid RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);& M. U) Q2 y" c4 U) Y
8 L+ t5 r1 A( w9 I1 s
ITStatus RCC_GetITStatus(uint8_t RCC_IT);
% n9 a, ^9 b: F/ B& c% V, {) |
- `& H) _+ p) x. x& N2 L
void RCC_ClearITPendingBit(uint8_t RCC_IT);
6 M9 L. J5 B1 f- A1 Y————————————————
+ ^, a$ p9 a1 n' A& U版权声明:CodeForCoffee$ H. \7 p1 W& h0 U
! K  s0 }& q  B) K+ a/ z
赞 收藏 评论0 发布时间:2022-12-27 18:00

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版