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

【经验分享】STM32学习心得七:STM32时钟系统框图及相关函数解读

[复制链接]
STMCU小助手 发布时间:2021-12-4 20:04
记录一下,方便以后翻阅~
: A- ]8 {% n& }0 Q: Y8 J- w6 ^主要内容:
7 m# p( _8 k4 o0 g8 `1) 时钟系统框图解读;& ~# h. ~1 E* s
2) 时钟系统配置相关函数解读。# Z0 E5 ^. g+ c2 ]
官方资料:《STM32中文参考手册V10》第六章 复位和时钟控制 RCC
3 W' `; z9 W& e8 H1. 为什么 STM32 要有多个时钟源呢?% o+ P* a, ~: x
因为STM32非常复杂,外设多,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗及RTC只需要几十k的时钟即可。同一电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般采取多时钟源的方法来解决这些问题。
) b" _$ a* G  y, t4 L1 h2. 时钟系统框图解读
$ h6 i" L! \. ]  [2 g$ z  d
- B; C3 ]5 _% W; p( u
20200331141029586.png

/ d" T0 c) O1 [. [9 m1) STM32 有5个时钟源:HIS(High Speed Internal)、HSE(High Speed External)、LSI(Low Speed Internal)、LSE(Low Speed External)、PLL:/ w2 t) W& x8 P
1.1 HSI是高速内部时钟,RC振荡器,频率大约为8MHz,精度不高,可作为系统时钟;
1 K' i& G+ P' ~8 ~+ L( F1.2 HSE是高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,频率范围为4MHz~16MHz;* w+ W& N; ], z* y9 v
1.3 LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。独立看门狗的时钟源只能是LSI,同时LSI还可以作为RTC的时钟源;
$ C+ l; v, M+ ]1.4 LSE是低速外部时钟,接频率为32.768kHz的石英晶体,主要作为RTC的时钟源;& [6 \1 r3 \4 S4 ~$ p; v, l( G
1.5 PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。( J: Z* A+ B3 I! ?0 M
2) MCO是STM32的一个时钟输出IO(接在PA8引脚上),可选择一个时钟信号输出,(如PLL输出的2分频、HSI、HSE、或者系统时钟),这个时钟可用来给外部其他系统提供时钟源;1 U8 s4 ]2 a) Z: B4 ~2 r* |
3) RTC时钟源可选择LSI,LSE,及HSE的128分频;7 P- m1 {& k9 [: Z
4) USB的时钟来自PLL时钟源,STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL输出端获取,可选为1.5分频或1分频,即当需要使用USB模块时,PLL必须使能,且时钟频率配置为48MHz或72MHz;
* e" u8 ^1 W+ c5) 系统时钟SYSCLK供STM32中绝大部分部件工作的时钟源。系统时钟SYSCLK可选为PLL输出、HSI或HSE。最大频率为72MHz;6 F6 U. ~- ^7 h0 I& D1 J0 j
6) 其他外设的时钟来源都是SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用,包括:
3 n, L2 P, u9 t  F+ F8 y, U& e( ?6.1 AHB总线、内核、内存和DMA使用的HCLK时钟;
, g3 O  s( @* X1 X, N( F$ V$ z6.2 通过8分频后送给Cortex的系统定时器时钟,即systick;
0 t, w9 R7 U% K0 Q5 U6.3 直接送给Cortex的空闲运行时钟FCLK;# R; p, \+ h) C# m% s
6.4 送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用;
% z8 `; u! \8 z3 D/ y2 X6.5 送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。9 ?5 f4 I+ ^! }6 p
7) APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等等,APB2上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能IO口等;' l: y# i- P  A' [- A
8) CSS时钟监视系统,一旦HSE失效,自动切换至SYSCLK=HIS;
: s1 ]% H# x6 v- u9) 任何一个外设在使用之前,必须首先使能其相应的时钟;4 e( I1 H3 K! O( l8 k8 \% X2 t. M, i
10) 5个主要的时钟:
/ x+ Y1 X" q8 N9 j) p. p8 |! c10.1 SYSCLK(系统时钟);# o, D5 g7 V- ^$ t7 Q
10.2 AHB总线时钟;
4 c3 H9 a, w* ]# ?# A. `/ N10.3 APB1总线时钟(低速): 速度最高36MHz;
) r9 a* C" g8 H- H) \$ M! E; S10.4 APB2总线时钟(高速): 速度最高72MHz;
+ F- J5 B1 a" d6 ^7 t& H10.5 PLL时钟。1 X# D& [$ I1 U# c4 Y
3. 时钟相关配置寄存器
2 b3 ]- M1 ~) F5 L
  1. typedef struct
    5 k" O! B1 b" y5 N; z5 d
  2. {
    ( o+ d0 z: [; s8 L1 J5 q7 R8 g0 X
  3.   __IO uint32_t CR;                //HSI,HSE,CSS,PLL等的使能和就绪标志位 : U  Y5 g$ I$ R6 P) B; V$ r7 u
  4.   __IO uint32_t CFGR;             //PLL等的时钟源选择,分频系数设定) J" R+ b! Y  C9 d+ O. d: W/ U
  5.   __IO uint32_t CIR;               // 清除/使能 时钟就绪中断
    2 d) y/ E3 {3 \% ]
  6.   __IO uint32_t APB2RSTR;        //APB2线上外设复位寄存器6 D' g* E' s% Z! k" W; ~
  7.   __IO uint32_t APB1RSTR;        //APB1线上外设复位寄存器
    % W5 f0 C9 ?! P
  8.   __IO uint32_t AHBENR;          //DMA,SDIO等时钟使能 3 k$ \" i0 }2 c  [# \2 v
  9.   __IO uint32_t APB2ENR;         //APB2线上外设时钟使能
    0 `# T; S' F) t) H8 X
  10.   __IO uint32_t APB1ENR;         //APB1线上外设时钟使能# N1 j9 g$ c. I
  11.   __IO uint32_t BDCR;            //备份域控制寄存器
    $ d+ {( |7 ]3 ?+ w- }2 [5 M% b
  12.   __IO uint32_t CSR;             //控制状态寄存器
    ; c: T4 \3 ]! C3 B
  13. } RCC_TypeDef;
复制代码
4. RCC相关头文件和固件库源文件
0 n$ V, B& r; n& M3 M4 N4.1 时钟使能配置:
+ P- n* u- K, qRCC_LSEConfig() 、RCC_HSEConfig()、RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……  c' F! W- k' G: a3 M! W
4.2 时钟源相关配置:
8 s' f; e  n3 }; g8 s9 NRCC_PLLConfig ()、 RCC_SYSCLKConfig() 、RCC_RTCCLKConfig() …
& S* K. o& F8 |6 e4.3 分频系数选择配置:9 ~1 R/ G/ X0 W- B8 E' n
RCC_HCLKConfig()
0 P( V) X( `" Y2 K, Q、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…- P  G  Q7 L. h$ F
4.4 外设时钟使能:0 B6 q! P3 Y& S  p
  1. RCC_APB1PeriphClockCmd();    //APB1线上外设时钟使能
    ' W. V: {0 T) z. P% K) ~+ I- L
  2. RCC_APB2PeriphClockCmd();    //APB2线上外设时钟使能
    & }7 B. p/ ]: T2 z; ^, ~
  3. RCC_AHBPeriphClockCmd();     //AHB线上外设时钟使能
复制代码
/ \3 T# a% p' G9 k' v  k; v
4.5 其他外设时钟配置:
9 C4 S+ e* v6 k) ^+ S/ ^# a3 pRCC_ADCCLKConfig()、RCC_RTCCLKConfig();, c! z: ~+ @$ F9 Z
4.6 状态参数获取参数:0 \* f1 }5 [! i3 w8 p  W4 @
RCC_GetClocksFreq()、RCC_GetSYSCLKSource()、RCC_GetFlagStatus();
/ p# v  {% j6 m& H' D4.7 RCC中断相关函数:; s3 X: D: |2 V8 M2 Q7 {, t9 ^
RCC_ITConfig()、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…1 b9 u8 a) D1 d$ q" h
& K% S( v. G# d6 X+ K# i" K
2 r. n. D- M0 J* ^/ j! S& l$ P; H

2 T; J8 \1 ]/ K4 _* a  b6 ]  ]5 v
赞 收藏 评论0 发布时间:2021-12-4 20:04

举报

0个回答

所属标签

相似技术帖

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