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

STM32中的时钟系统

[复制链接]
STMCU小助手 发布时间:2022-12-27 18:00
STM32中的时钟系统概述5 q3 Y8 {8 h' k' D5 f

3 d) h. a. n( }
1dfa787f80984cc0a9a3743540fba491.png
+ @: ~% m; n$ R, m' p8 \/ i* H' D8 Q6 \8 T% N
5个蓝色背景的是时钟源6 l; G1 A# P; `  N* e
& U6 C& y/ |2 P# L+ {( c
SYSCLK是系统时钟,最重要的时钟,可以看到其他的外设的时钟都来源于系统时钟/ B# a' s6 h* E9 |' c

! t" C2 a$ o. Y& [# n0 YHSI RC高速内部4 O; ^9 [7 o7 K5 |
约为8MHz,但不太稳定,可以作为系统时钟,灰色背景的梯形表示选择器
+ B5 A! H  J* A6 h0 V

* p% R  P0 k2 ~HSE Os高速外部
- X* e+ J5 b% z8 `- R接晶振,例如8MHz,其可以直接作为选择器的输入,也可以分频后作为选择器输入,PLL表示锁相环,用于倍频,可以选择2-16,通过锁相环寄存器配置,产生的时钟为PLL_CLK
6 z% d/ C( @" G# Z% u
# ?% C% X) ^, E8 |% X
CSS时钟监控系统
* z8 l  @( W6 p一旦HSE失效,则自动切换到SYSCLK=HSI
5 p3 F! O* P; o7 `
  \0 u  z3 r# `% vLSE Os低速的外部时钟/ @0 W4 f1 [. J& l$ B4 \- B5 A& a
通过外接晶振产生,一般为32.768kHz,用于RTCCLK5 I/ z$ W$ Z0 ]
" B; G) s6 L, P( E* k
RTCCLK还可以来自于HSE的128分频
: E$ ]) f" `' a9 p& l
/ L5 X6 a& i8 v$ Q/ S
LSI RC低速内部
. J" ^; R% a+ p- A由内部的RC振荡器产生,约为40kHz0 J5 E2 _4 x! W( v) h! A4 A
) V* A! \) p# b- J, p) v! T. T
主要是用于STM32的独立watch dog提供时钟
7 }! @/ o& \6 F% S5 X- G
' @4 {+ e2 ?- C( s7 V+ @& K) g
; C; k0 f. T6 w) G6 x. Z
MCO输出内部时钟引脚PA8- ]2 n8 B! b. c/ t- R' i3 Y0 M
可以来自于系统时钟SYSCLK% i0 N. C: o1 ^& ]' t: G

- x4 c7 [5 n" E( |- r可以来自于HSI- S3 ~2 }2 n7 {2 p8 K0 Q5 C+ c
1 i$ \2 o7 q+ B6 Y0 t- d, C3 H4 L
可以来自于HSE
" z6 s# E8 q3 G9 x7 ?6 N/ I

  g5 ]  H0 q$ O; `$ o可以来自于PLLCLK的2分频3 U, n* ]9 f2 `, O

1 S+ n4 ]! P& f7 dUSB时钟
  f& M$ t: U7 \5 @48MHz,可以来自于PLL时钟经过USB分频器,除以1或者1.5; p& i' i- o; Y4 `6 I- `1 N/ ^4 J

4 d$ c. O% [, h7 ~3 S72MHz和48MHz之间的倍数就是1.5
: j- O3 F$ Y, B0 ]* x$ i- ^: I) p: h2 e4 i* G+ Z# P
AHB Prescaler AHB预分频器9 K- W4 c- Y# o0 o0 m7 q
AHB预分频器的分频因子有9种选择:8 z+ |6 _5 s3 p  X/ Z/ X. E
1,2,4,8,16,64,128,256,512
' y0 c/ X. N  O4 ]! ^# g1 {6 b; Y5 {* E) {' U: F: Y' L% o1 r
分频后产生HCLK这个时钟最高可以到72MHz/ Z" a0 i- u: F
! ~0 B5 ?5 l/ S) o3 B- r, j
APB1 Prescale APB1预分频器" X; B* [6 s5 p, x2 m7 Q, p( }6 W
产生PCLK1,用于挂低速外设,例如通用定时器; ?0 C. r7 m# Q* r9 X$ y
. V2 V% ~- ?  i" _8 I
APB2 Prescale APB2预分频器
  H# f/ a: G  Z8 n产生PCLK2,可以供对于时钟要求高的外设/ u% X* _5 [9 f, W0 `% K1 N
7 s* T# j6 M' R9 `; F  k
注意:任何一个外设使用前,必须首先使能其相应的时钟; ~% ]* Z% z% i' Y- m- W

  m7 d$ t/ F1 v3 P3 T, o0 h  w
0 ~, w7 c) t5 y$ |
stm32中的时钟配置RCC
' v" L6 [- Q) B" D4 e如下图所示,为STM32工程中对于时钟的配置文件6 G6 Z+ ~- m) @/ N0 m1 m

/ \0 {# @+ n. Z
99851e60f018412a8651f4f8bf598a39.png
; ?9 V1 C( F7 {0 z2 k% N6 S: ?
* g: x2 b8 C, A3 _首先打开寄存器地址名称映射头文件0 D1 ^1 D- j8 L1 x6 a
# H* f9 S* A6 u/ u
这个头文件中对于大部分寄存器的映射都会在这里通过一个结构体来定义
: a! u" Z$ D# c" K# a5 x
7 Q; p: W& s0 t8 x2 D/ W
4671e13f8dbe4c0e8c1f459c856b6370.png
, A  Y' u: Z2 x8 m  U4 F& {% T/ a* x; z$ s8 d" ?- f
如下图所示,这个结构体中的成员变量映射了对应的寄存器
8 a1 _( k% A; ^$ s& W) x6 `7 D, K; [+ u. ~+ U& g( U9 s- p
78e1d7015a7848bd8b34505eba25d43a.png
; o( }: Y& u. A

4 U. X" @; U2 j$ @( d 对于RCC寄存器的详细描述,可以参考STM32中文参考手册
4 e' U2 a; \) N0 S4 y, H& y8 D; ?3 M$ v8 E
4a26bce9037041b787657de7edb60174.png
6 F4 s1 L% R& e0 j! {% Q  `( |4 a4 y8 w/ b
" m" x) x4 s  [7 D5 B( g, q
RCC时钟控制寄存器
% s2 f/ |/ v3 I5 |, @HSI,HSE,LSI,LSE,PLL这5个时钟源,使用前需要使能,使能后还不稳定,稳定后会产生稳定标志位
3 d5 O. y! ~( Q* Y1 z
# l1 [) x. G4 x
30131992d96f4ed9b02432ba835e7ba4.png
8 m9 q, W$ H8 f! Z  N" q1 z# ^# O" m9 L; m* ~

/ A5 G" ~+ t$ o- SRCC时钟配置寄存CFGR
0 t. E/ f$ D0 Z' p4 a) b% `2 g
配置选择器,PLL倍频系数,Scaler的分频系数  K- f) R+ m! K7 C1 Y% J

+ L% k1 m' p! m& j0 x* F
32dfbfb4fe0941ce94851a80f25423a0.png
1 H! S  x$ O! O0 N' M' j- e7 ~2 b: i& m/ ~3 ?7 S1 B' O
# F& b0 d! `( C; ~
35598cb4ab344e148de79574e53e755a.png
- g! ~; O; F: P1 n
7 s3 F1 R6 h: o
RCC外设时钟使能寄存器
6 L7 f1 g# a) w5 a  t, lAHBENR AHB外设时钟使能寄存器
# H' S) v; J( j+ w$ f# w包括SDIO,FSMC,CRC,FLITF,SRAM,DMA1,DMA2" W+ k* i4 S  x6 J2 [0 ?6 Z

% K$ n& s1 K2 [% S1 W8 ?2 ^4 s9 Q
6bc5947e2ade4e11a3932fa655659f4a.png 3 k% P) a$ W  s5 V* I1 B
3 X2 q- S1 P- U$ G3 B0 z0 O6 |
2e3c85c1ad1c4c129962e4eede3a4e2c.png
' h& b' |. K3 `1 \
' b% N  \/ M0 y% j
APB2ENR APB2外设时钟使能寄存器
9 `0 X5 [; M% ~6 T 包括ADC3,USART1,TIM8,SIP1,TIM1,ADC2,ADC1,IO ABCDEFG等7 R2 d1 C% S7 ]8 I0 Y
' q: f. b2 {+ @3 @* d- q1 t1 S
cda89437598745288343d4382b0d3eaf.png
7 R4 t0 x+ R7 Y
4 L5 T1 K' O8 j! Q, w+ V
d2308d5111c447f5874938378a6f5fb8.png 0 M+ E0 X0 M- Y

7 [4 s4 H9 N) _* z

% N- \5 b8 e* K' h' S 0768d25641454a7382bbf06dd145f662.png
& o" f; q! m* e
% [( ~/ H- a; t& P% G; R
APB1ENR APB1外设时钟使能寄存器* m8 }+ N6 }( T
包括DAC接口,电源接口,备份接口,CAN时钟,USB时钟,I2C时钟,UART2345时钟,SPI23时钟,看门狗时钟,Timer 234567时钟等
% g: \- O7 f% g; E4 R$ O! q8 [  P, r! C! d1 i7 x. g
56a3d818a8794e08bb27a85a72e85844.png 4 q, p; h: @. V1 o: ~9 i3 w
! D2 {: A. T- u2 V$ s
021834f2395b48cbae24197de9f8abe0.png   z5 i0 M' I" E2 m- J
( M; x( e( o6 q5 N
bd0a2909dca1438496c594a3f183171e.png
/ ]* K- T' C8 f' R) X: Q8 \ 0 x# T/ y  g$ n
72949a1987ba4e1cb28c4ee51e46b116.png 0 y) \/ H5 M, e5 s+ \0 Q

( O( g! L1 P7 X+ [" r4 I0 nRCC寄存器的操作8 K( v3 l' N, Q+ J2 \
可以通过相关的库函数,对于这些RCC寄存器进行操作
9 O6 Q' \2 S& J+ m5 ]2 C4 a
: R$ k, ^& R( y' _
b5a3ccb26dce4dd796b258f4d6b8c43d.png
( C4 l; G6 Q0 P; C0 g% v
% w2 [, c; I/ j这些库函数可以分为以下几类:
; `& H/ l5 ^0 |& z9 W1 m/ [/ G6 a1 g1 {7 O

( W7 z7 f+ P/ C5 I时钟使能配置* i- M. P# v8 ]5 u9 N2 h

/ y# M9 `; y1 [% @* R  J) Uvoid RCC_LSEConfig(uint8_t RCC_LSE);
$ T+ M& e, W0 u  b! r9 w1 r  q( U! s  ^
void RCC_HCLKConfig(uint32_t RCC_SYSCLK);/ x% J7 i% Z: g' g+ X- C6 [

# N' P& e. F& V6 I. ?void RCC_HSEConfig(uint32_t RCC_HSE);
) Y6 y3 ]( ~! o; B: s
6 W9 {( l; n$ C9 o$ ]/ ~3 t( z+ i. I
void RCC_HSICmd(FunctionalState NewState);
1 g& B/ L/ K1 N; r
2 N) E9 i4 F! ]7 @" S. c  ~' hvoid RCC_LSICmd(FunctionalState NewState);
$ X; G4 ^2 ~7 o/ u0 s; e0 q% h7 V" f5 C, ]
...9 |3 X- ]& W- n. f. E% ^
" [; C; y& l1 P' R' x9 @
$ a* O( P% q& ?) I" v! G
时钟来源配置- c4 A& E7 P7 [4 c- V( G5 w

) {9 C# i* y2 z  u  pvoid RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul);2 e4 H1 K) p6 d6 P

' ?& S1 D8 S4 j1 m" c/ Cvoid RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource);
; X" ~7 V$ a- q6 h7 n

1 F: H8 m- k1 h& z- ^8 @: \void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
# C! L. Z; m$ W! T* l# B
! {3 K" C) F) y! t4 n2 i5 _
分频系数选择配置
3 K8 f) \5 H4 i' h4 |

) g* h' s, @/ `9 [$ I+ Bvoid RCC_HCLKConfig(uint32_t RCC_SYSCLK);$ U! j( Z  `! [( {3 d7 W9 j. x. U) S
. m5 B$ b* m- [& j& P+ f
void RCC_PCLK1Config(uint32_t RCC_HCLK);
/ \, ]3 R4 }$ U( Y
# w  D" K( d* K9 h, a% n1 ]/ i
void RCC_PCLK2Config(uint32_t RCC_HCLK);3 p5 `6 E) R* T# t& e4 A/ E, K

4 M$ m$ C& [- M2 Z' r
) m# ~9 J, s7 \' y9 Q8 ^3 T7 O
外设时钟使能4 S1 R6 {: T# c4 I9 V5 q& {
4 {! h3 u1 ~% Y, A& M. z
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);6 s, C( b7 u. @" @
8 i$ V- n- q; O' \) t
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
* w6 z9 O5 i; y& I
# M: b* d- F( E/ K1 h6 S! tvoid RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);1 [0 v/ h) Y  ]2 f8 T

, S8 n2 [$ G9 ~$ l; E, t9 H8 S# Y其他外设时钟配置
7 w$ [2 x8 }: R* _& v
6 j7 U' [) z3 }- {9 N; T$ ?
void RCC_USBCLKConfig(uint32_t RCC_USBCLKSource);
5 E; N( e. w3 F! Y* |0 z/ X' Y/ K8 F" C7 v& I  l
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
6 @2 S2 E: S4 i+ v* a/ [# I6 K
3 P  ~5 _/ c" c4 s+ K
状态参数获取
( j) N: o% W: P" _- a3 I, d7 \6 C
/ ~3 R+ @, Z! @- @+ [7 K- ~8 Cvoid RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks);! b2 k! T0 w+ `! G6 w/ _
2 A9 W2 a" [1 t$ V# j# c" p# @
uint8_t RCC_GetSYSCLKSource(void);
7 y: u$ ~0 a) m
/ r9 `. _1 N4 _+ ?; B! i- SFlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
' K( U' W" ]! P$ h- ^0 Z3 \" _; Y) T
RCC中断/ A, ~9 i( q: s0 Y8 ]0 V5 b9 r
' @3 A& M5 [# n8 p$ }" x
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState);, S$ m$ b( B+ j

7 b7 [% E7 z5 ]ITStatus RCC_GetITStatus(uint8_t RCC_IT);
0 x( n3 `' s1 f$ @! U
; q7 A! H" G+ K, f: R- r# s9 x
void RCC_ClearITPendingBit(uint8_t RCC_IT);
  N( X; j- d$ P————————————————
4 R' u* S7 D; J+ V+ d# ^; f版权声明:CodeForCoffee
8 V4 z. K! c' |1 W3 m8 }' }% b. P* q1 p& U1 E7 ]2 Y
收藏 评论0 发布时间:2022-12-27 18:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版