理解时钟没有时钟树图肯定不行,先来了解时钟树图
图中5个红色框为5个时钟源,个人理解为四个直接时钟源,就是右下角标注的四个,另一个间接时钟源,因为他是对来自两个高速时钟(HSE或者HSI)的倍频得到的。他们都用来做什么?图中其他颜色的标注了时钟主要去向和它来自的时钟源。这里系统时钟就非常重要了。
STM32时钟系统的配置除了初始化的时候在system_stm32f10x.c中的SystemInit()函数中外,其他的配置主要在stm32f10x_rcc.c文件中。
打开system_stm32f10x.c文件,找到SystemInit()函数。
函数第一句就是这么一句话,那么这是RCC个什么呢?其实这是个配置时钟的寄存器结构体变量的宏。右击追踪这个RCC可以发现。
那么这是个什么样的结构呢?
继续。。。。。
发现下面这个结构体定义,其实这里的结构体变量都是RCC寄存器,我们就可以通过这个宏定义表示的结构体变量的成员变量来操作RCC的各个寄存器。。。。。。。这些寄存器《STM32中文参考手册》60~76页有详细描述。但是从下面的各个寄存器的名称就可以明个大概这个寄存器是干嘛的。
1. 时钟控制寄存器(RCC_CR) 2. 时钟配置寄存器(RCC_CFGR) 3. 时钟中断寄存器 (RCC_CIR) 4. APB2 外设复位寄存器 (RCC_APB2RSTR) 5. APB1 外设复位寄存器 (RCC_APB1RSTR) 6. AHB 外设时钟使能寄存器 (RCC_AHBENR) 7. APB2 外设时钟使能寄存器(RCC_APB2ENR) 8. APB1 外设时钟使能寄存器(RCC_APB1ENR) 9. 备份域控制寄存器 备份域控制寄存器 (RCC_BDCR) 10. 控制/ 状态寄存器 (RCC_CSR) 下面继续看SystemInit ()函数中的主要语句;
根据寄存器手册可以知道这是启动内部高速时钟。
这些都是一些相应的配置,主要在后面这个SetSysClock函数。
打开这个函数看一下
啥鸡毛玩意儿??其实名称也比较容易理解,我们可以通过定义宏来选择执行相应的函数设定相应的时钟频率。
追踪这个宏定义(下图)可以发现默认是72MHz(追踪不到说明是没有声明的),那么我们可以通过修改这个宏来修改系统初始化的时钟频率。
接下来回头我们看一下这些设置系统时钟的SetSysClock函数是怎么配置相应时钟频率的。打开后发现这里有设置为24M的函数、有设置为36M的函数。。。。等等;以设置系统时钟频率为72M的函数SetSysClockTo72()为例,我们打开这个函数;
这个函数有点长,一点一点看。
这里都是操作寄存器来配置,这些配置的结果都已经有官方英文注释,我注释上了中文。有兴趣我们可以对照《STM32中文参考手册》查看这些配置。或者我们直接就知道这些配置的结果是什么就行了。
红框中第一句配置为HCLK = SYSCLK,通过时钟树我们可以知道就是将AHB预分频器配置为1(不分频);第二句PCLK2 = HCLK,就是讲APB2预分频器配置为1(不分频)。第三句PCLK1 = HCLK,就是讲APB1预分频器配置为2(2分频);
接下来配置PLLCLK的时钟源为HSE并且9倍频
最后将系统时钟来源设定为PLL。
最后简述系统时钟初始化主要过程
1. 打开内部高速时钟HIS; 2. 设置时钟 a) 打开外部高速时钟HSE b) 配置PLLCLK的时钟来源为高速外部时钟HSE且9倍频 c) 打开PLL时钟使能后将PLL设置为系统时钟来源 |