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

STM32F10x 时钟系统初学总结

[复制链接]
STMCU 发布时间:2020-11-10 15:21
STM32F10x 时钟系统初学总结
1
时钟系统


1.概述
  用通俗的话来说,时钟是单片机的“脉搏”,是单片机的驱动源,使用单片机中的任何一个外设都必须打开此外设相应的时钟。这样的好处是,在不使用某个外设的时候,关闭此时钟外设,从而可以降低系统的总功耗,进而节能,以实现低功耗的效果。
  衡量“脉搏”强度的量为xx次/分钟,在单片机中衡量时钟强度的量叫做时钟频率,即 xx 周期/秒,就是我们常说的赫兹 Hz;脉搏(心跳)每跳动一次,就会将血液能量送往全身以供使用,脉搏越快,每分钟输送能量越大,耗能越快;相对应的时钟每发送一个时钟信号,单片机处理一条指令(或一条指令的一部分),频率越高,每秒钟处理指令越多,耗能相应越快。


2.原理
  由时钟源(晶体振荡器等)产生时钟信号,该时钟信号经过分频/倍频后作为系统时钟,系统时钟经分频/倍频后作为各个外设的频率;在时钟信号发出后,单片机内部各部分收到了来自时钟的信号,执行指令(类似于触发器,由电平高低触发)。系统时钟,是处理器运行时间基准(每一条机器指令一个时钟周期)。这样每个时钟 tick 系统都会处理一步指令,这样使得工作一步一步,不会出现紊乱。所以频率越高,每秒钟处理指令数越多,速度越快。(此处为理想情况,不考虑其他外接设备造成的“木桶效应”)
  时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行指令。以 Pentium 4 2.0 为例,它的工作主频为 2.0GHz,具体来说,2.0GHz 意味着每秒钟它会产生 20 亿个时钟脉冲信号,每个时钟信号周期为 0.5 纳秒。而 Pentium 4 CPU 有 4 条流水线运算单元,如果负载均匀的话,CPU 在 1 个时钟周期内可以进行 4 个二进制加法运算。这就意味着该 Pentium 4 CPU 每秒钟可以执行 80 亿条二进制加法运算。


3.STM32时钟概述
  STM32 本身十分复杂,外设非常多,但是在我们实际使用的过程中往往不会用到所有的外设,如果将全部外设都开启,就会造成浪费,加大耗能;所以在实际情况下,STM32 的外设时钟是独立的,可以控制使能或除能,即“打开”需要用到的外设,不用的外设是默认“关闭”的。
  使用任何外设都需要时钟才能启动,但是不同的外设所需要的时钟频率不同,都是用低速无法满足需求,都是用高速又会造成浪费。一个单片机内提供多个不同的系统时钟,可以适应更多的应用场合。不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块。对不同模块的时钟增加开启和关闭功能,可以降低单片机的功耗。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的 MCU 都是采用多时钟源的方法来解决这些问题。所以便有了 STM32 复杂的时钟系统和时钟树。主要的目的就是给相对独立的外设模块提供时钟,也是为了降低整个芯片的耗能。


2
STM32系统框图
11.png
图 1-stm32f10x 系统时钟框架图
12.png
     图 2-stm32f10x 系统时钟框架图-官方数据手册版

1.时钟源
   stm32f10x 时钟系统总共有四个时钟源:HSE、LSE、HSI、LSI 和 PLL,其中 PLL 是由时钟信号输入再进行倍频,间接产生时钟信号,另外四个时钟源为石英晶振或 RC 振荡器,直接产生时钟信号;芯片内的其他时钟都是通过以上五个时钟源分频或倍频得来;图 1 中为蓝色方块。
(1)HSE(External high-speed clock)
  HSE Osc,高速外部时钟信号,可接晶体/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz-16MZh;通常选用 8MHz 的晶振;
(2)LSE(External low-speed clock)
  LSE Osc,低速外部时钟,接频率为 32.768MHz 的石英晶体,为实时时钟或其他定时器时钟提供一个低功耗且准确的时钟源;

(3)HSI(Internal high-speed clock)
  HSI RC,高速内部时钟,RC 振荡器,频率为 8MHz,精度较于晶体/陶瓷谐振器较低。

(4)LSI(Internal low-speed clock)
  LSI RC,低速内部时钟,RC 振荡器,频率为 40KHz,可以在停机和待机模式下保持运行。

(5)PLL(Phase Locked Loop)
  PLL,锁相环倍频输出,时钟输入源可选择为 HSI/2、HSE 或者 HSE/2;可选择 16 种倍频 1-16;输出为锁相环倍频输出时钟(PLLCLK,最大 72MHz)。

2.选择器
  stm32f10x 芯片时钟系统中,共有 5 个频率选择器:PLLXTPRE、PLLSRC、SW、MCO、RTCSEL,功能为从多个输入时钟源中选择一个作为选择器输出;图 1 中为灰色梯形
(1)PLLXTPRE(HSE divider for PLL entry)
   PLLXTPRE,HSE 分频器作为 PLL 输入;选择 HSE 不分频或 HSE 二分频输出到 PLLSRC。

(2)PLLSRC(PLL entry clock source)
   PLLSRC,PLL 输入时钟源,选择 HSI 经二分频或者 PLLXTPRE 输出时钟作为输出时钟到 PLL;

(3)SW(System clock switch)
   SW,系统时钟切换,选择 HSI 或 HSE 或 PLL 输出作为系统时钟;

(4)MCO(Microcontroller clock output)
   MCO,微控制器时钟输出,选择不输出、系统时钟(SYSCLK)输出、内部 RC 振荡器时钟(HSI)输出、外部振荡器时钟(HSE)输出或 PLL 时钟 2 分频后输出。

(5)RTCSEL(RTC clock source selection)
   RTCSEL,RTC 时钟源选择,无时钟、LSE 振荡器作为 RTC 时钟、LSI 振荡器作为 RTC 时钟、HSE 振荡器在 128 分频后作为 RTC 时钟。

3.(预)分频器/"倍频器"
stm32f10x 芯片时钟系统中,可供设置选择分频系数的共有 5 个预分频器和 2 个倍频器;5 个预分频器:AHB prescaler、APB1 prescaler、APB2 prescaler、ADC prescaler、USB prescaler;2 个倍频器:TIM2,3,4 Multiplier、TIM1 Multiplier;功能是将输出时钟频率倍频或分频后输出;图 1 中为绿色方形。
(1)AHB prescaler
   AHB prescaler,AHB 预分频,系统时钟(SYSCLK)作为输入经过分频后输出,输出作为 AHB 总线时钟(HCLK,最大 72MHz);分频因子为 1、2、4、8、16、32、64、128、256、512。

(2)APB1 prescaler(APB low-speed prescaler)
   APB1 prescaler,低速 APB 预分频,AHB 总线时钟(HCLK)作为输入经过分频后输出,输出作为低速外设总线时钟(PCLK1,最大 36MHz);分频因子为:1、2、4、8、16。

(3)APB2 prescaler(APB high-speed prescaler)
   APB2 prescaler,高速 APB 预分频,AHB 总线时钟(HCLK)作为输入经过分频后输出,输出作为高速外设总线时钟(PCLK2,最大 72MHz);分频因子为:1、2、4、8、16。

(4)ADC prescaler
   ADC prescaler,ADC 预分频,高速外设总线时钟(PCLK2)作为输入经过分频后输出,输出作为 ADC 时钟(ADCCLK);分频因子为:2、4、6、8。

(5)USB prescaler
   USB prescaler,USB 预分频,锁相环输出时钟(PLLCLK,48MHz 或 72MHz)作为输入经过分频后输出,输出作为 USB 时钟(USBCLK,固定为 48MHz);分频因子为:1、1.5;若 PLLCLK 为 48MHz 则分频因子选择 1,否则选择 1.5,保证分频后输出为 48MHz。

(6)TIM2,3,4 Multiplier
   TIM2,3,4 Multiplier,TIM2,3,4 倍频器,低速外设总线时钟(PCLK1)作为输出经过倍频后输出,输出作为通用定时器时钟(TIMxCLK);根据 APB1 预分频系数进行倍频,预分频系数为 1 则倍频系数为 1,否则为 2;

(7)TIM1 Multiplier
   TIM2,3,4 Multiplier,TIM1 倍频器,高速外设总线时钟(PCLK2)作为输出经过倍频后输出,输出作为 TIM1 时钟(TIM1CLK);根据 APB2 预分频系数进行倍频,预分频系数为 1 则倍频系数为 1,否则为 2;


时钟安全系统

stm32f10x 芯片时钟系统中,CSS 作为时钟安全系统,使用时钟监测器监测 HSE 时钟,如果 HSE 时钟发生故障,HSE 时钟将会被自动关闭,失效时间会被送入高级定时器并产生时钟安全中断 CSSI,同时时钟故障将导致系统时钟自动切换到 HSI 振荡器;CSS 作用就是监测 HSE 振荡器的正常运行,能够在 HSE 出故障时,及时调整系统时钟源保证系统正常运作;图 1 中为黄色方形。

3
STM32F10X时钟控制

1.控制概述
  STM32F10x 芯片的时钟控制主要包括以下几个方面知识;系统时钟源的选择、系统时钟频率的配置、总线时钟的配置、总线设备时钟的使能/除能;

  (1)系统时钟源的选择:系统时钟源为 SYSCLK,由 SW(系统时钟切换)选择时钟源来作为系统时钟 SYSCLK,可供选择的输入时钟有 HSE、HSI、PLLCLK(PLL 输出);
  (2)系统时钟频率的配置:选择 SW(系统时钟切换)的 3 个输入时钟源的其中一个的时钟频率作为系统频率;HSI 则是 HSI RC 的频率,通常为 8MHzLLCLK 作为系统时钟频率时,需要根据 PLLXTPRE 和 PLLSRC 两个选择器的输出经 PLL 倍频后作为系统时钟频率,通常为 8MHz;HSE 直接作为系统时钟频率使用相对较少;
和 SW 三个选择器和 PLL 倍频器来控制,输入时钟源经 PLL 倍频后输出作为 SW(系统时钟切换)的其中一项输入,再经过 SW 选择后作为 SYSCLK(系统时钟);

   (3)总线时钟的配置:AHB 总线,输入时钟源 SYSCLK 经 AHB 预分频器分频后输出,输出为 HCLK,高性能总线供给时钟;APB1 低速外设总线,输入时钟源 HCLK 经 APB1 分频器预分频后输出,输出为 PCLK1,低速外设总线时钟;APB2 高速外设总线,输入时钟源 HCLK 经 APB2 分频器预分频后输出,输出为 PCLK2,高速外设总线时钟;
   (4)总线设备时钟的使能/除能:主要是外设总线 APB1 和 APB2 的使能/不使能,时钟初始化默认是不使能,如果要使用外设,则需要打开外设对应的时钟;
   即在使用STM32F10x之前需要先进行时钟系统的相关配置,也就是时钟初始化,在工程文件中会在启动时进行一个默认的初始化SystemInit(),使用者在初始化完成后在进行所需的个性配置;默认配置是在启动时系统操作寄存器来进行配置,寄存器配置相对麻烦,所以在使用者进行个性化设置时,是使用库函数直接配置。
2.时钟初始化
  初始化时钟系统时,在工程文件 system_stm32f10x.c 中通过 SystemInit()和 SetSysClock()两个函数进行初始化,使用的是寄存器操作的方法来初始化时钟系统;因为是直接操作寄存器,所以初始化过程非常复杂,以下是这两个函数的解析,仅供学习、参考用(以 STM32F103C8T6 为例);可跳过,直接看如何通过库函数配置即可。

   SystemInit(),启动芯片,将系统频率设置为8MHz,关闭所有外设;具体操作为:启动内部时钟源 HSI RC(8MHz)作为系统时钟、配置总线时钟预分频器和外设总线时钟预分频器、配置 ADC 预分频器和定时器预分频器/倍频器、微控制器时钟不输出、关闭 HSE Osc、关闭 CSS 时钟监视系统、PLL 不使能、配置 PLLXTPRE、PLLSRC、PLL 输出、USB 预分频、关闭时钟中断使能(LSI、LSE、HSE、HSI、PL 就绪中断使能)、清除中断标志位(LSI、LSE、HSE、HSI、PLL就绪)、清除安全系统时钟中断.

总结


01
常用寄存器
   AHBENR寄存器:DMA,SDIO等时钟使能;
   APB1ENR寄存器:APB1总线上外设时钟使能;
   APB2ENR寄存器:APB2总线上外设时钟使能;
   CR寄存器:HSI,HSE,CSS,PLL等的使能和就绪标志位,因为有些时钟源刚使能完不一定能马上稳定,需要等一段时间,当稳定之后就会在该寄存器相应的位置位,通过查看寄存器的值就可以知道该时钟源是否已经稳定;
   CFGR寄存器:时钟源的选择和分频系数的设定。

02
常用库函数
  时钟使能配置函数:
RCC_LSEConfig()、RCC_HSEConfig()、RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()

  时钟源相关配置函数:
RCC_PLLConfig ()、RCC_SYSCLKConfig()、RCC_RTCCLKConfig()

  分频系数选择配置函数:
RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()

  外设时钟使能函数:
RCC_APB1PeriphClockCmd()、RCC_APB2PeriphClockCmd()、RCC_AHBPeriphClockCmd();

  其他外设时钟配置:
RCC_ADCCLKConfig ()、 RCC_RTCCLKConfig();

  状态参数获取参数:
RCC_GetClocksFreq()、RCC_GetSYSCLKSource()、RCC_GetFlagStatus()

  RCC中断相关函数 :
RCC_ITConfig()、RCC_GetITStatus()、RCC_ClearITPendingBit()




写在最后
STM32的时钟系统确实是很复杂,不仅有倍频,分频,还有一系列的外设时钟开关。倍频是考虑到了电磁兼容性,如果外部直接提供一个72MHz的晶振,太高的震荡频率会给电路板的制作带来一定的难度。分频则是因为STM32既有高速外设,也有低速外设,各外设的工作频率不相同,需要分开来管理。最后,每个外设时钟还有自己独立的开关(在图上可以看到,在外设时钟之前需要经过一个与门,这就是它们的开关)在我们不使用该外设时,需要把时钟关闭以减少STM32的功耗。
  STM32为了实现低功耗,将所有的外设时钟都默认设置为不使能(disable),用到什么外设,只要打开对应外设的时钟就可以,其他的没用到的可以还是不使能(disable),这样耗能就会减少,这就是为什么不管你配置什么功能都需要先打开对应的时钟的原因。

文章出处:AI Robot Studio


收藏 评论0 发布时间:2020-11-10 15:21

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版