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

STM32 RCC详解

[复制链接]
STMCU小助手 发布时间:2022-12-29 18:00
最近看了一下STM32的启动代码,在system_init函数中找到了RCC部分初始化的流程,有许多不解,查了一下资料,基本上搞清楚了RCC的原理。
) V# J* j' @( eRCC主要是管理系统复位和时钟控制的,系统复位这里不讨论,主要讲系统时钟。6 m% T+ o- `2 @: b! [$ R

1 [% q* r6 i' X* `时钟

2 g1 M2 w, I* Q: D: W0 YSTM32可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK):
+ |1 b0 E7 e# `# Q, L● HSI 振荡器时钟8 ?) K. T. S0 p) Q. y: v) i3 W
● HSE 振荡器时钟
7 a! {$ k  |( z" Z( R0 t9 H2 e● 主 PLL (PLL) 时钟7 A, n4 Z5 P% X6 u% z& ]' P
器件具有以下两个次级时钟源:
. @# J1 Q* s5 _9 A6 S5 `0 R$ m● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用
0 K3 v3 g  L9 h$ `0 e/ s9 m于停机/待机模式下的自动唤醒。
- |5 b. a, U7 u" w; V: [● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)
0 T) B( s7 |# M6 Q7 A; D* }: I; x6 m6 R. |; G5 o
下面先看看STM32的时钟树:
. C( v9 i' n9 v. ~0 o: y" k6 W" z) V& d4 J
317796a11d764d88b1d7589ff69d07d0.png # C5 Z% ~1 b) \5 n+ X

+ u+ T: ?5 X! O! \* A6 i5 x我们一般会使用外部无源晶振作为芯片的输入时钟,外部晶振稳定和精确性都比较高,时钟走向如图中箭头所示。5 ~1 k8 B- C* g
STM32F4系列的单片机内部sysclk可以到168MHZ,所以想要达到这么高速时钟的要求,肯定是需要使用PLL来倍频的。
& \7 }  Z0 i/ R, i# I+ v& }2 ^7 F假设我们的外部晶振源是25M HZ,如箭头所示,进来后先需要分频,这里我们设置分频系数为25,那么vco的输入频率就是25MHZ/25 = 1MHZ。
( V5 q$ n; r' C3 S& O. G1 S0 m
( R. g8 E& _3 x. e$ G
18bdd13e75a842e5b1d26a0db809a305.png
, H5 Q. m3 m' {: |! v. m/ C) y
. ~  r& W0 u' L. u* B7 c9 K
N用来设置倍频系数:6 b2 A7 w1 Z. b5 Z2 [, I, J5 P
VCO输入频率的值乘倍频系数(这里假设N为400)得到VCO输出频率:1MHZ*400 = 400MHZ
1 O7 i9 o: G% T/ w: E; K2 o
5 T& K! ]2 Y- Q3 p  ~) n  Y- K7 R
65af530a2eac4ca5abd9cacd7cd898c3.png
! c* g* H: G2 }

" [/ d5 _$ s, w5 C, w而后还要再经过P分频才能得到SYSCLK的值:
) |  F2 y2 c* b: EP设置为45 `1 \$ x# V2 p! B2 v
PLL输出频率= VCO输出频率/4 = 400MHZ/4 = 100MHZ2 X+ u' P4 H" [

7 r' U: q; d0 X) j, G
7a042114033142d9a04092cde8e58467.png $ ?5 d+ E6 W) V9 j, n! [3 @

2 z3 q% U5 v5 b# c' {- |$ x2 L我使用的是STM32F411系列的单片机,SYSCLK为100MHZ。
- r1 r4 ]/ c7 c: H( ^AHB这里不做分频,AHB也是100Mhz,APB2也不分频,APB2也是100mhz,APB1做2分频,为50MHZ
$ f5 Y1 y5 \; j: Y8 F这些分频数值需要根据实际需要的频率去计算出来。
: l4 T) o8 I# Z8 {' |: [7 h/ K
! h3 S, w- _; A6 b0 S
注意:
  @# ~" X/ I2 E3 `! J# A; [HSE 外部时钟的值是在stm32f4xx.h中定义的:! H7 W& n3 w* W' U( o# V0 c% O# D

. B2 W% V" g6 c' U  f, Y1 Y9 R, {
  1. #if !defined  (HSE_VALUE) 9 s* {7 A- A6 y. `
  2.   #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
    ) C# y* j6 d5 @, h' i3 Q
  3.   
    3 [! v0 X4 r& e
  4. #endif /* HSE_VALUE */& {  z8 L7 e: l  l8 Q: O, f7 C- |
复制代码

6 U' m4 b9 p; L2 ^" y这里一定要改成外部晶振的值,否则标准库在使用它的时候会出现问题。) l$ S% i' h: e/ ]- ~
————————————————) E5 i1 _# _  i  P& H& w9 I
版权声明:tony++. c* X0 F  g! S

" a" ?& @( i9 J, b+ B* z( M* g* Q: \" `4 Z4 x
赞 收藏 评论0 发布时间:2022-12-29 18:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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