详解STM32F1系列时钟树以及配置
本文详细介绍了STM32F1系列时钟树,以及如何对相应寄存器进行配置达到我们想要的系统时钟,并附带了寄存器配置源码。
时钟树简图
STM32F1系列芯片,共有4个时钟源,当然也有人说是5个,包括了PLL倍频器,由于PLL的时钟来源于HSE或HSI,所以我认为只有4个时钟源。以上是时钟简图,在图注部分对如何配置进行了详细说明。在使用频率不要求很高的时候最好不要超频,会影响芯片的性能。
时钟树详图
需要注意的是定时器的频率条件:如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致,否则×2。
因为APB1总线上挂有定时器2~7,且APB1的预分频系数为2,不是1,所以定时器2 ~7的频率需要×2,也就是36M×2=72M。
因为APB2总线上挂有定时器1和8,且APB2的预分频系数为1,所以定时器1 和8的频率不需要×2,也就是72M。
所以在系统时钟设置为72M之后,所有的定时器频率全部为72M。
寄存器配置
- 时钟控制寄存器(RCC_CR)
此寄存器我们使用的功能基本上就是,内外高速时钟以及PLL倍频器的开启与关闭。
此寄存器用来控制时钟的开关,也可以检测时钟的状态。
为了境地功耗使用哪个时钟,就使能哪个时钟,不用的就不要使能。
- 第0和1位:0位内部高速时钟使能位,需要使用内部高速时钟是将第0位置1,检测第1位值是否为1,判断内部高速时钟是否就位。(1为就绪)
- 第3-7位:内部高速时钟调整,可以根据外界环境的变化调节,RC时钟的频率(一般不会用到)
- 第8-15位:不用管,需要时可以读取其数据
- 第16和17位:外部高速时钟启动位,以及状态检测位。(17位为1表示时钟在线)
- 第19位:外部时钟工作状态检测位,0为关闭检测,1为启动检测。
- 第24和25位:PLL倍频器使能位,1为使能,25位为1时,表示使能成功。
2、时钟配置寄存器(RCC_CFGR)
此寄存器主要用来设置系统以及总线的频率。
- 第0和1位:系统时钟切换位,选择HSI、HSE、PLL其中的一个作为系统时钟。
- 第1和2位:系统时钟切换状态位,用来检测切换是否完成。
- 第4~7位:AHB总线预分频系数位。
- 第8~10位:APB1总线预分频系数位。
- 第11~13位:APB2总线预分频系数位。
- 第14~15位:ADC预分频系数位
- 第16位:PLL时钟源选择位
- 第17位:外部时钟作为PLL时钟源时是否分频位。
- 第18~21位:PLL倍频器倍频系数选择位
- 第22位:USB预分频系数选择位
- 第24~26位:PA8输出频率选择位
以上两个寄存器就已经实现了F1系列系统以及3大总线的时钟配置,接下来以系统时钟72M,AHB总线72M,APB1总线36M,APB2总线72M,进行代码演示。
RCC->CR|=0x00010000; //使能外部高速时钟
while(!(RCC->CR>>17));//等待外部时钟就绪,判断其是否正常
RCC->CFGR=0X00000400; //APB1二分频;APB2不分频;AHB不分频;
RCC->CFGR|=0X7<<18; //设置PLL值为9倍频
RCC->CFGR|=1<<16; //PLL作为时钟源
FLASH->ACR|=0x32; //FLASH 2个延时周期
RCC->CR|=0x01000000; //打开PLL,需要在选择其作为时钟源之后
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
3、时钟中断寄存器 (RCC_CIR) 对于时钟异常工作的检测以及置位标志,基础开发基本用不到。
4、APB2 外设复位寄存器 (RCC_APB2RSTR)
对此寄存器的相应位置写入1,可以对相应外设进行复位,写入0时不起作用。
5、APB1 外设复位寄存器 (RCC_APB1RSTR)
对此寄存器的相应位置写入1,可以对相应外设进行复位,写入0时不起作用。
6、AHB外设时钟使能寄存器 (RCC_AHBENR)
相对应的位为1则使能AHB总线上的外设,0则失能相对应外设。
7、APB2 外设时钟使能寄存器(RCC_APB2ENR)
相对应的位为1则使能APB2总线上的外设,0则失能相对应外设。
8、APB1 外设时钟使能寄存器(RCC_APB1ENR)
作用同上。
9、备份域控制寄存器 (RCC_BDCR) 基本用不到
10、控制/状态寄存器 (RCC_CSR)
看门狗相关状态标志寄存器。
为了降低功耗,以上寄存器用到哪个就置位哪个的相对应的位置。