STM32学习---时钟系统

来源:互联网 发布:涂色 app 源码 编辑:程序博客网 时间:2024/03/29 12:52

1. 时钟树

  STM32的时钟系统比较复杂,我们主要通过时钟树来了解单片机内部的时钟配置情况。时钟树可以从开发指南中找到。以f1为例,学习一下他的树。
  明确几个缩写定义:

AHB 先进高速总线
APB1 先进设备总线1
APB2 先进设备总线2

  时钟源

HSE 高速外部时钟
HSI 高速内部时钟
LSE 低速外部时钟
LSI 低速内部时钟

SYSCLK 系统时钟
PLLCLK PLL锁相环时钟
HCLK AHB上的时钟
PCLK1 APB1上时钟
PCLK2 APB2上时钟

这里写图片描述
如图所示,为方便了解,可以把时钟树上的时钟分下区域:1、系统时钟 ,2低速时钟,3、总线时钟,4、其他。

1.1系统时钟。

  STM32系统时钟源有三个选择:HSI、HSE和PLLCLK。
  HIS为8MHz,HSE可选晶振频率为4~16MHz。而系统时钟SYSCLK最大可达72MHZ,器件内部提供有锁相环可对高速时钟进行倍频使系统时钟更快,其支持2~16倍频设置。我们常用PLL对HSE进行倍频,做为系统时钟。常用的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。
  需要注意的一点是USB的时钟是通过对PLLCLK分频之后得到,因为其分频器只能1或1.5分频,而USB时钟要求为48MHz,所以如果需要使用USB时,PLLCLK的时钟只能为48MHz或72MHz。
PS. f4中支持高速USB,可以直接接外部的usb时钟源。

1.2 低速时钟

  低速时钟可选内部和外部时钟源,内部时钟为40KHz,外部时钟一般选32.768KHz。
  外部低速时钟的用途较为有限只作为RTC实时时钟。
  内部低速时钟一是作为RTC实时时钟,二是给独立看门狗使用。可用于停机待机模式的自动唤醒。可以通过定时器五的输入输入时钟测量进行校准。
  RTC的时钟源还可以选择HSE/128,具体使用方法在后面学习。

1.3总线时钟

  器件内部具有先进高速总线和两条先进设备总线。Cortex-M3内核、STM32的存储器和大多数外设时钟均通过总线时钟得到。
HCLK是通过SYSCLK分频得到,可进行1、2、512的分频,最大72MHz 。
PCLK1、PCLK2均是通过HCLK分频得到,其自身也分别有分频器,两个分频器都可以提供1、2、4、8、16的分频系数。PCLK 1最大36 MHz,PCLK 2最大72MHz。
  由图可知, Cortex-M3内核和SYSTICK的时钟是由HCLK进行8分频后得到;SDIO的SDIOCLK来源于HCLK,其AHB接口由HCLK进行2分频后得到;核心存储器、DMA、FSMC时钟均由HCLK直接驱动。
  APB1上外设有定时器2~7,电源时钟,备份接口时钟,can总线,USB,i2c,UART2~5,SPI 2、3,窗口看门狗。这些外设时钟源均来自PCLK1。
  APB2上挂载的有定时器1、8,还有ADC,SPI1,GPIO,辅助IO功能。这些外设时钟源均来自PCLK2。

1.4其他

  I2S时钟直接挂载在SYSCLK上,后经其自身分频器分频得到音频的采样频率。

  MCO(时钟输出)的来源可以选为PLLCLK/2,HIS,HSE,SYSCLK。

2 时钟配置寄存器

  时钟相关的寄存器有10个,如下:

时钟控制寄存器(RCC_CR)

时钟配置寄存器(RCC_CFGR)
时钟中断寄存器 (RCC_CIR)
APB2 外设复位寄存器 (RCC_APB2RSTR)
APB1 外设复位寄存器 (RCC_APB1RSTR)
AHB外设时钟使能寄存器 (RCC_AHBENR)
APB2 外设时钟使能寄存器(RCC_APB2ENR)
APB1 外设时钟使能寄存器(RCC_APB1ENR)
备份域控制寄存器 (RCC_BDCR)
控制/状态寄存器 (RCC_CSR)

  根据对时钟树的分解,可对这些寄存器进行理解。
  RCC_CR中主要对SYSCLK的三个时钟源进行设置,包括打开内部、外部高速时钟,打开PLL、CSS功能,内部、外部高速时钟就绪状态判定,还有内部高速时钟校准和外部高速时钟旁路等。在使用时主要关注打开内部/外部高速时钟,打开PLL,等待内部/外部高速时钟稳定。
  RCC_CFGR是三种设置:1、对各种分频器、PLL倍频设置;2、SYSCLK、PLL时钟源选择;3、MCO源选择。这个寄存器设置完成,器件的各路时钟都已确定。
  RCC_CIR 是时钟相关中断的使能/关断、清除中断标志位。时钟相关中断有HIS、HSE、LSI、LSE、PLL的准备就绪中断,CSS中断。
RCC_APB2RSTR、RCC_APB1RSTR分别是对APB2、APB1上的外设进行复位。
  RCC_APB2ENR、RCC_APB1ENR、RCC_AHBENR分别是使能/关断APB2、APB1、AHB上的外设时钟,STM32器件各个时钟基本都可控。而且外设都有开关可控,使用时再开启,可以降低系统功耗。。
  RCC_CSR 是各种时钟相关的中断、异常的标志位。
  具体寄存器的定义可参与STM32参考手册。

3 时钟配置初始化

  时钟初始化步骤有:
  一,复位系统时钟;
  二,选择时钟源(一般选择HSE),等待时钟稳定;
  三,时钟,HSE正常后配置RCC_CFGR,AHB、APB1、APB2的时钟源和分频系数。(之后还要对flash等待周期预缓存的设置。这是由于 flash的配置必须的系统始终<4MHz,而且没有打开AHB预分频器的时候才能执行)。
  四配置PLL,等待PLL稳定。
  五选择系统时钟源。并且等待系统时钟稳定,准备就绪。
  
  一般情况,我们使用固件库提供的startup_stm32fxxx_xx.s作为启动代码,在其中会调用 SystemInit函数,它在system_stm32fXXx.c文件中,我们只需要在预定义处改动就可以设置我们需要的系统时钟。
这里写图片描述

系统时钟复位:
  如果不对是系统时钟复位,在调试时可能会产生预期不到的初始化问题。
  复位中主要执行的有:使能内部高速时钟;然后是SRAM和闪存时钟使能,其他外设时钟关闭;对各分频器分频系数复位,选择内部高速时钟;关闭所有中断,配置中断向量表。
   系统时钟复位也在SystemInit函数中实现。

0 0
原创粉丝点击