stm32f10x时钟系统(一)

时钟框图说明

stm32f10x时钟系统框图如下:
这里写图片描述

蓝色四边形是时钟源,灰色四边形是选择器,另外一种颜色的是(预)分频器;比如32MHz经过二分频就是16MHz。

5个时钟源,一个系统时钟(SYSCLK)

HSI:高速内部时钟(大约8MHz);由RC振荡器产生,RC振荡器产生的时钟是不稳定的

HSE:高速外部时钟(4~16M, 正点原子的8M),晶振产生

PLL:锁相环;用来倍频的(2~16倍),输出一个PLLCLK时钟

上面三个时钟都可以作为系统时钟的来源。

CSS:时钟监控系统。它有什么用呢?一般来说,都是选择HSE时钟作为系统时钟,但是由于HSE的时钟来源是外部的;可以会出现某些意外:比如晶振不起振了;这时候CSS就会选择HSI作为系统时钟。

LSE:低速外部时钟,频率一般为:32.768KHz,外接晶振产生。一般用来给RTCCLK使用;RTCCLK是实时时钟,
LSI:低速内部时钟,频率约为40KHz,由RC振荡器产生;主要功能给独立看门狗时钟使用

上述是五个时钟源信号。

MCO是一个引脚,对应PA8,它可以输出时钟信号;包括:SYSCLK、HSI、HSE、PLLCLK/128

扫描二维码关注公众号,回复: 144624 查看本文章

USB时钟:PLLCLK经过USB分频器(1或者1.5倍)得来;USB时钟是48MHz,PLLCLK的时钟信号为72MHz或者48MHz,如果为72MHz,那么USB分频器就设置1.5倍分频,如果是48MHz,那么USB分频器就设置1倍分频

SYSCLK时钟经过AHB预分频器(分频因子为1,2,4,8,16,32,64,128,256)可以给HCLK时钟;或者经过AHB预分频器在经过APB1预分频器变成36MHz的时钟,给挂在APB1总线下的低速器件使用,或者经过APB2预分频器变成72MHz的时钟信号给挂在APB2总线下的高速器件使用。

小结

  1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。
    • HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
    • HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
    • LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG
    • LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC  、
    • PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
      倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
  2. 系统时钟SYSCLK可来源于三个时钟源:
    • HSI振荡器时钟
    • HSE振荡器时钟
    • PLL时钟
  3. STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL
    输出的2分频、HSI、HSE、或者系统时钟。

  4. 任何一个外设在使用之前,必须首先使能其相应的时钟。


几个常用的寄存器:

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

库函数版本

上述的寄存器在库函数版本中都有相应的库函数可以调用。

  • 时钟使能配置:
    RCC_LSEConfig() 、RCC_HSEConfig()、
    RCC_HSICmd() 、 RCC_LSICmd() 、 RCC_PLLCmd() ……
  • 时钟源相关配置:
    RCC_PLLConfig ()、 RCC_SYSCLKConfig() 、
    RCC_RTCCLKConfig() …
  • 分频系数选择配置:
    RCC_HCLKConfig() 、 RCC_PCLK1Config() 、 RCC_PCLK2Config()…

  • 外设时钟使能:
    RCC_APB1PeriphClockCmd(): //APB1线上外设时钟使能
    RCC_APB2PeriphClockCmd(); //APB2线上外设时钟使能
    RCC_AHBPeriphClockCmd(); //AHB线上外设时钟使能

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

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

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

前面系统初始化的函数在ST官方的固件库里面都设置好了,直接设置的寄存器,因此不需要自己手动使能

参考资料

  • 正点原子视频
  • stm32中文参考手册

猜你喜欢

转载自blog.csdn.net/williamgavin/article/details/79758749