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

STM32 RCC详解

[复制链接]
STMCU小助手 发布时间:2022-12-28 16:00
STM32 RCC理解学习/ @+ W- n9 e/ e3 G1 f8 B7 x. E2 a
最近看了一下STM32的启动代码,在system_init函数中找到了RCC部分初始化的流程,有许多不解,查了一下资料,基本上搞清楚了RCC的原理。
9 u" }4 z" I0 I5 A  rRCC主要是管理系统复位和时钟控制的,系统复位这里不讨论,主要讲系统时钟。' [0 @! X% o/ t. e
3 p9 W$ L6 o! T- F0 a& l

2 d2 ^7 P3 `/ A1 q: c时钟
/ z7 [5 w  J$ MSTM32可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK):
1 h' o+ c; g$ z. k● HSI 振荡器时钟
6 B! W0 [5 a/ v● HSE 振荡器时钟
8 h% c6 y' a" L. W& S1 Q6 n● 主 PLL (PLL) 时钟
' d& l8 `6 C" K# E8 ]9 h器件具有以下两个次级时钟源:
8 y3 a2 b1 F2 m  i7 d● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。
& j5 j3 J" Q. U& V$ }8 L) c● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)
. Q/ S' V# @: G6 ^7 P0 f' d+ Q) `: K6 P1 P- R
下面先看看STM32的时钟树:
, q8 s* F4 ?- q- A8 s" ]% ]$ R: n. K, N' h
317796a11d764d88b1d7589ff69d07d0.png " i3 d% E" }; z: `2 n/ |# Z
& ^4 x" r  p. Y; \
我们一般会使用外部无源晶振作为芯片的输入时钟,外部晶振稳定和精确性都比较高,时钟走向如图中箭头所示。  x& \6 z- @. s2 ~3 X
STM32F4系列的单片机内部sysclk可以到168MHZ,所以想要达到这么高速时钟的要求,肯定是需要使用PLL来倍频的。/ n* M1 @) x/ N% e
假设我们的外部晶振源是25M HZ,如箭头所示,进来后先需要分频,这里我们设置分频系数为25,那么vco的输入频率就是25MHZ/25 = 1MHZ。
6 c. \# ?" A! t5 @3 g: I0 ~- N" A- u
18bdd13e75a842e5b1d26a0db809a305.png ' Q6 {$ N9 n/ r  V& V# j0 |1 \. O

8 F: X  F/ }  r+ R7 o2 wN用来设置倍频系数:8 E+ N7 V7 x0 s, t2 c
VCO输入频率的值乘倍频系数(这里假设N为400)得到VCO输出频率:1MHZ*400 = 400MHZ
) S0 d( L2 ?6 W
1 ~2 G% p, ]& U0 c0 a* E% F
65af530a2eac4ca5abd9cacd7cd898c3.png
; Y8 @9 Q/ c7 e  y- z' C
) T6 X7 W6 L3 ^
而后还要再经过P分频才能得到SYSCLK的值:& |0 ^6 ?9 x0 N* X
P设置为4' ~4 X" A" t/ F2 q& Z( z+ B* Y
PLL输出频率= VCO输出频率/4 = 400MHZ/4 = 100MHZ
! M6 l! @" i, K9 y- J5 d
9 {0 w% \7 O9 V" f! R
7a042114033142d9a04092cde8e58467.png
# Z% w4 L8 y1 [, x2 P( Z

% z3 f! Q1 Z1 Q: q/ [我使用的是STM32F411系列的单片机,SYSCLK为100MHZ。
3 `6 @3 `% P* z6 M0 }$ `AHB这里不做分频,AHB也是100Mhz,APB2也不分频,APB2也是100mhz,APB1做2分频,为50MHZ% C, Z1 B! F5 w/ u6 w
这些分频数值需要根据实际需要的频率去计算出来。* V( r  M- o, ~

/ v0 Y" g7 M2 m
# c. `3 r! W: v1 A4 L% {; ~: }8 ]
注意:
0 t% |6 U3 C5 B. S8 N# JHSE 外部时钟的值是在stm32f4xx.h中定义的:" ]/ l. P) k+ G+ d* d, r4 e" `
  1. #if !defined  (HSE_VALUE)
    - a7 E- J# w: B3 I4 v
  2.   #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
    9 {/ m4 I" Q6 n7 q/ `
  3.   
      I0 k: |, b- P0 O
  4. #endif /* HSE_VALUE */
    " B1 F/ S7 u; R* r) s( s( e& q
复制代码

8 g; ?7 i% X" C9 l  [这里一定要改成外部晶振的值,否则标准库在使用它的时候会出现问题。
; B- v% b: s) E————————————————, V) v9 E, X" r# V& p
版权声明:tony++
9 V8 i' |9 w) L/ x: E# a) Z: P
1 z' E0 I: f3 h, d
赞 收藏 评论0 发布时间:2022-12-28 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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