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

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

[复制链接]
STMCU小助手 发布时间:2021-12-4 20:04
记录一下,方便以后翻阅~+ H. d2 ?( q# ?  u: r0 Z
主要内容:
; F# t8 ^/ T  c: p7 N1 C; ^9 z1) 时钟系统框图解读;; k& I& K8 X- \+ e* }1 S$ z% s
2) 时钟系统配置相关函数解读。) o  Y  j: N7 d/ a0 B# O1 L
官方资料:《STM32中文参考手册V10》第六章 复位和时钟控制 RCC
, X) I7 U' N! V! V3 ^1. 为什么 STM32 要有多个时钟源呢?
+ T# d. v8 f$ k. ?1 r$ j0 p2 I1 q因为STM32非常复杂,外设多,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗及RTC只需要几十k的时钟即可。同一电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般采取多时钟源的方法来解决这些问题。
9 p  Y6 _4 X# A9 |2. 时钟系统框图解读# h2 d7 {4 E: x
: N1 ^' u" h* b3 K& c' F
20200331141029586.png

3 ~: _: ?8 R5 E, G, ]- r1) STM32 有5个时钟源:HIS(High Speed Internal)、HSE(High Speed External)、LSI(Low Speed Internal)、LSE(Low Speed External)、PLL:, ]: S4 v+ U0 v
1.1 HSI是高速内部时钟,RC振荡器,频率大约为8MHz,精度不高,可作为系统时钟;/ }/ L% A4 H) e, i: n* ?
1.2 HSE是高速外部时钟,可接石英/陶瓷谐振器,或接外部时钟源,频率范围为4MHz~16MHz;
! f8 W: ~% t2 d) w. g; d! \1.3 LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。独立看门狗的时钟源只能是LSI,同时LSI还可以作为RTC的时钟源;
8 F- L4 y! Z7 _+ ]2 m) h1.4 LSE是低速外部时钟,接频率为32.768kHz的石英晶体,主要作为RTC的时钟源;8 d) d7 x# i( U% I1 Z5 x9 V4 t, v
1.5 PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或HSE/2。倍频可选择为2~16倍,但其输出频率最大不得超过72MHz。/ Y/ J' c; V( t+ `3 m$ r2 P# P
2) MCO是STM32的一个时钟输出IO(接在PA8引脚上),可选择一个时钟信号输出,(如PLL输出的2分频、HSI、HSE、或者系统时钟),这个时钟可用来给外部其他系统提供时钟源;
: m! J4 _7 e- m6 O5 u3 Z3) RTC时钟源可选择LSI,LSE,及HSE的128分频;
8 v5 e. m) E4 Y' k$ }* g$ o4) USB的时钟来自PLL时钟源,STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为 48MHz的时钟源。该时钟源只能从PLL输出端获取,可选为1.5分频或1分频,即当需要使用USB模块时,PLL必须使能,且时钟频率配置为48MHz或72MHz;
1 y# [' D, D9 ^3 S9 V' N5) 系统时钟SYSCLK供STM32中绝大部分部件工作的时钟源。系统时钟SYSCLK可选为PLL输出、HSI或HSE。最大频率为72MHz;) N- I" ]0 i8 I' x+ q6 F/ f1 I
6) 其他外设的时钟来源都是SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用,包括:  J3 {$ L) J0 B+ U& H! L: A
6.1 AHB总线、内核、内存和DMA使用的HCLK时钟;, [9 H9 ]7 }4 z( Q+ T
6.2 通过8分频后送给Cortex的系统定时器时钟,即systick;
0 z  x* k" j! f$ j- t" Z4 L  T3 e1 f6.3 直接送给Cortex的空闲运行时钟FCLK;0 h9 |. z# }, g4 c+ }
6.4 送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用;6 ^6 G- r) Q' q' |% I. [
6.5 送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。
5 o- \& _) `+ a7) APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等等,APB2上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能IO口等;8 O/ O$ M% l6 ?6 \. j  ]
8) CSS时钟监视系统,一旦HSE失效,自动切换至SYSCLK=HIS;
$ e( N  L3 ^1 i* l/ e) B; P1 c9) 任何一个外设在使用之前,必须首先使能其相应的时钟;
& ^8 G! J' b% B, P/ |7 @10) 5个主要的时钟:
& d( F8 w: [0 b" r10.1 SYSCLK(系统时钟);
2 P4 j, T. g  a- X2 }10.2 AHB总线时钟;0 |! U- g! z8 n/ f9 y+ K8 L" t. ^$ ^
10.3 APB1总线时钟(低速): 速度最高36MHz;
5 }  C: n# o4 a: ]- `" k, K) r10.4 APB2总线时钟(高速): 速度最高72MHz;7 I- D/ K7 W! B9 R$ B
10.5 PLL时钟。
3 f* J# `$ @. H) S9 h3 o" u3. 时钟相关配置寄存器
5 a& `$ b6 P5 l0 d( W
  1. typedef struct
    / c' s. g3 _, r- L( R6 s7 o1 ^! S
  2. {
    , y; y  C; @& o% k4 @
  3.   __IO uint32_t CR;                //HSI,HSE,CSS,PLL等的使能和就绪标志位 : @5 h$ Z; ~2 ^# O* \
  4.   __IO uint32_t CFGR;             //PLL等的时钟源选择,分频系数设定
    0 Y5 ?* f; |2 I
  5.   __IO uint32_t CIR;               // 清除/使能 时钟就绪中断) O8 S! W9 j* A
  6.   __IO uint32_t APB2RSTR;        //APB2线上外设复位寄存器6 z5 \3 q4 \! B, A
  7.   __IO uint32_t APB1RSTR;        //APB1线上外设复位寄存器* Q& [. }7 f1 y4 s( y7 ~
  8.   __IO uint32_t AHBENR;          //DMA,SDIO等时钟使能
      e* }- G- ?9 p! s
  9.   __IO uint32_t APB2ENR;         //APB2线上外设时钟使能 $ S8 |( f/ U" `% e# P$ u
  10.   __IO uint32_t APB1ENR;         //APB1线上外设时钟使能
    ) `3 ?, _' |; J. X' `
  11.   __IO uint32_t BDCR;            //备份域控制寄存器) r5 L1 a/ `7 R! F' M7 K& {& q) u2 [
  12.   __IO uint32_t CSR;             //控制状态寄存器# w8 e3 _7 b& E) s' x" \* ~
  13. } RCC_TypeDef;
复制代码
4. RCC相关头文件和固件库源文件( r) j0 c/ I- L
4.1 时钟使能配置:
3 F( \3 L$ ~$ U$ T- `/ GRCC_LSEConfig() 、RCC_HSEConfig()、RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……
- z4 x7 O) `! c  y4.2 时钟源相关配置:
4 _  V0 k2 n! c- @7 |7 T# cRCC_PLLConfig ()、 RCC_SYSCLKConfig() 、RCC_RTCCLKConfig() …
+ c7 L1 d* p. R! q2 t' m- o4.3 分频系数选择配置:0 u$ w% `# _6 `
RCC_HCLKConfig()2 Q! n9 j/ R7 O. {$ W
、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…
, g6 t4 T3 g, {( Z1 V; L( x4.4 外设时钟使能:: l8 t# c$ f9 V+ y- O& j! Y5 R
  1. RCC_APB1PeriphClockCmd();    //APB1线上外设时钟使能" L7 D2 }0 G/ s( b
  2. RCC_APB2PeriphClockCmd();    //APB2线上外设时钟使能
      G3 f* P0 Y5 d" W4 ?1 j) f
  3. RCC_AHBPeriphClockCmd();     //AHB线上外设时钟使能
复制代码

9 y9 K- g4 H' F+ C* a  e4.5 其他外设时钟配置:
6 O2 Q# L+ }/ P8 E! B: O- |9 |RCC_ADCCLKConfig()、RCC_RTCCLKConfig();5 b0 ^& `1 h: S
4.6 状态参数获取参数:
: d7 `) L' b) I8 B' D4 g" oRCC_GetClocksFreq()、RCC_GetSYSCLKSource()、RCC_GetFlagStatus();
* u: n3 e+ v$ L! [; {4.7 RCC中断相关函数:
3 H1 d8 E+ G( ]  G( GRCC_ITConfig()、 RCC_GetITStatus() 、 RCC_ClearITPendingBit()…
6 A% U0 s! w! r; q2 @0 s8 S  g
+ E/ x" E( Z3 P5 g& J: y: }) M9 Z4 @8 a9 k' p# f' b1 s

2 x$ O- u' w, `# R6 ~  C
收藏 评论0 发布时间:2021-12-4 20:04

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版