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

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

[复制链接]
STMCU小助手 发布时间:2021-12-4 20:04
记录一下,方便以后翻阅~
& P( [2 p( I1 Q7 r6 |1 f' f主要内容:
9 I4 `$ g/ \- w, ]1) 时钟系统框图解读;
" J- g2 K7 J2 `$ j7 v, T/ t2) 时钟系统配置相关函数解读。
( c9 k7 ?! B  K官方资料:《STM32中文参考手册V10》第六章 复位和时钟控制 RCC
1 m7 W# A0 c8 A1. 为什么 STM32 要有多个时钟源呢?1 K& [/ E( \- U; Q
因为STM32非常复杂,外设多,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗及RTC只需要几十k的时钟即可。同一电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般采取多时钟源的方法来解决这些问题。
0 r% g! y- y* T, M) i5 b6 f0 Y2. 时钟系统框图解读) n; c! g2 l2 p0 u4 O
0 r8 K5 n2 z; x1 L3 S+ Y% h  b
20200331141029586.png

4 V. p0 a9 x) G- O1) STM32 有5个时钟源:HIS(High Speed Internal)、HSE(High Speed External)、LSI(Low Speed Internal)、LSE(Low Speed External)、PLL:+ U0 Y( q# V, G
1.1 HSI是高速内部时钟,RC振荡器,频率大约为8MHz,精度不高,可作为系统时钟;% b* U) \1 u% P' `- x' j* h
1.2 HSE是高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,频率范围为4MHz~16MHz;
. L( [& \; A  I: b% \7 t* p6 _1.3 LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。独立看门狗的时钟源只能是LSI,同时LSI还可以作为RTC的时钟源;+ Z' t+ |: W- y0 x2 m; B
1.4 LSE是低速外部时钟,接频率为32.768kHz的石英晶体,主要作为RTC的时钟源;7 S3 z* L5 b- |7 e
1.5 PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。
% D2 R% W8 w; Q% G2) MCO是STM32的一个时钟输出IO(接在PA8引脚上),可选择一个时钟信号输出,(如PLL输出的2分频、HSI、HSE、或者系统时钟),这个时钟可用来给外部其他系统提供时钟源;7 s8 Z+ v+ p- R6 i5 \0 U
3) RTC时钟源可选择LSI,LSE,及HSE的128分频;
% ^  K. t) I' f4) USB的时钟来自PLL时钟源,STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL输出端获取,可选为1.5分频或1分频,即当需要使用USB模块时,PLL必须使能,且时钟频率配置为48MHz或72MHz;
4 j, B0 P) n- z+ P) U5) 系统时钟SYSCLK供STM32中绝大部分部件工作的时钟源。系统时钟SYSCLK可选为PLL输出、HSI或HSE。最大频率为72MHz;& v0 ~/ i) i! g9 U; h
6) 其他外设的时钟来源都是SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用,包括:
1 V9 W  }% y3 H# K& T' E8 Q6.1 AHB总线、内核、内存和DMA使用的HCLK时钟;$ ]+ G1 e3 u7 T* C- A  a
6.2 通过8分频后送给Cortex的系统定时器时钟,即systick;
" y% B4 X- ~% E+ j# k6.3 直接送给Cortex的空闲运行时钟FCLK;% W! V& B# y2 h4 O4 j$ B
6.4 送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用;
! L% {2 |7 y  f: j. k1 o& y6.5 送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。3 H  z! n  N2 [4 e6 \0 f) C
7) APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等等,APB2上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能IO口等;
! U7 K9 v. J! n5 j! v8) CSS时钟监视系统,一旦HSE失效,自动切换至SYSCLK=HIS;
3 c9 n4 Q  m$ j8 ]0 {7 [$ W9) 任何一个外设在使用之前,必须首先使能其相应的时钟;& }' F" L+ e& Y, b$ z
10) 5个主要的时钟:, n, p/ F; ?2 @' P7 F( O9 r8 v3 I0 q
10.1 SYSCLK(系统时钟);8 `( ]% p1 [9 U0 V% E5 E9 F/ o
10.2 AHB总线时钟;
9 J4 K1 x/ e* r  n1 H, N10.3 APB1总线时钟(低速): 速度最高36MHz;
7 e+ H6 U: L$ x5 {2 E10.4 APB2总线时钟(高速): 速度最高72MHz;
: p( q7 T/ W1 S7 d; a10.5 PLL时钟。7 N$ ^+ @" y/ _2 b% i
3. 时钟相关配置寄存器! V9 ~, E# u1 o+ [/ s
  1. typedef struct! I. Z7 O# D) B! [* O' F
  2. {
    % V6 D2 P3 p* D! u0 t. X7 Y. `
  3.   __IO uint32_t CR;                //HSI,HSE,CSS,PLL等的使能和就绪标志位 ( X' |- b6 H& Y: f2 U
  4.   __IO uint32_t CFGR;             //PLL等的时钟源选择,分频系数设定( }. ~( d* E( `$ N# U- B# D
  5.   __IO uint32_t CIR;               // 清除/使能 时钟就绪中断
    % w; @1 v7 s3 [( s
  6.   __IO uint32_t APB2RSTR;        //APB2线上外设复位寄存器/ C3 ]* z0 q, i# Y! X: O, ]
  7.   __IO uint32_t APB1RSTR;        //APB1线上外设复位寄存器
    " A2 L: K6 C/ @4 |$ [
  8.   __IO uint32_t AHBENR;          //DMA,SDIO等时钟使能 . |6 M! J5 J2 d0 ?8 s: X+ ?
  9.   __IO uint32_t APB2ENR;         //APB2线上外设时钟使能
    * P4 S5 A7 c- p3 _) a4 o( C  N) C, ^7 U/ v2 ]
  10.   __IO uint32_t APB1ENR;         //APB1线上外设时钟使能4 l1 N  v; M- T1 j
  11.   __IO uint32_t BDCR;            //备份域控制寄存器
    . u; k9 L3 z9 b- a
  12.   __IO uint32_t CSR;             //控制状态寄存器
    $ Z- T2 {8 [2 l9 U
  13. } RCC_TypeDef;
复制代码
4. RCC相关头文件和固件库源文件
- Y! J' y, @4 e! x. c0 L* U3 {8 B8 k4.1 时钟使能配置:
4 j9 ~# D5 f. A0 u$ |RCC_LSEConfig() 、RCC_HSEConfig()、RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……  V$ H- R; s* \  ]- N. J" C
4.2 时钟源相关配置:
9 i: Z5 d1 I4 Z6 S& L* S9 W: _% R- c, nRCC_PLLConfig ()、 RCC_SYSCLKConfig() 、RCC_RTCCLKConfig() …. n9 S7 \/ l. g# u* e
4.3 分频系数选择配置:" ?& W$ I: w2 H& P
RCC_HCLKConfig()
' R3 d3 X5 p% _* r' R! z& m) [、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…
5 a+ A3 `  m# j3 h" c+ g9 S+ {4.4 外设时钟使能:- O! o6 V/ c: l4 _8 L3 T
  1. RCC_APB1PeriphClockCmd();    //APB1线上外设时钟使能
    / O: o# m& [2 X$ h7 y, F# s/ E
  2. RCC_APB2PeriphClockCmd();    //APB2线上外设时钟使能/ ]! L/ P  e3 |2 F& E' x' A' g6 G! J
  3. RCC_AHBPeriphClockCmd();     //AHB线上外设时钟使能
复制代码

$ Y4 K% t( I3 I3 X. m4.5 其他外设时钟配置:. ~) S6 e6 r+ H+ p2 S& E+ n
RCC_ADCCLKConfig()、RCC_RTCCLKConfig();6 a! r# w" T+ o5 E5 C. }; v& O
4.6 状态参数获取参数:; A) y6 I& u9 C) [
RCC_GetClocksFreq()、RCC_GetSYSCLKSource()、RCC_GetFlagStatus();8 c) r6 W! t6 _% {, T7 Q4 a% x
4.7 RCC中断相关函数:
$ c0 x4 O; Q- V, t8 [RCC_ITConfig()、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…
$ O! j5 C- Z$ s- M
3 B& m. _  h, E0 W, \  b2 I2 {
3 ?$ V9 n3 H3 L- ?( }0 P, _" n
% o* R' n4 \+ L8 \: v9 z
赞 收藏 评论0 发布时间:2021-12-4 20:04

举报

0个回答

所属标签

相似技术帖

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