STM32F103时钟结构

个人学习记录使用,图取自正点原子。 

人的脉搏对于人是十分重要的,如果脉搏紊乱,会导致身体紊乱,甚至会导致死亡。同样,系统的时钟就好似脉搏,如果时钟没有设置合适,就会导致系统出错,达不到想要的效果,如果没有设置(或者使能)的话,就会导致系统无法工作。 

关于需要外设和IO口需要配置时钟频率的作用:

我认为对于外设,比如说,定时器需要进行计数,而每计数一次的时间就是根据定时器配置的时钟频率确定的,这对于定时器来说至关重要,影响到了定时器精确程度;

再比如说,USART通信的波特率,就是根据USART配置的时钟频率(红色部分PCLKx)确定的 ,这可以从官方给波特率的计算公式可以看出:

/*!< This member configures the USART communication baud rate.
                                       The baud rate is computed using the following formula:
                                            - IntegerDivider = ((PCLKx) / (16 * (USART_InitStruct->USART_BaudRate)))
                                            - FractionalDivider = ((IntegerDivider - ((u32) IntegerDivider)) * 16) + 0.5 */

对于IO口,可能会影响到IO口的电平转换速率

时钟结构框图:

注释:

1.蓝色为时钟源,有5个时钟源(外部时钟比内部时钟更加精确):

          (1).HSI高速内部时钟,RC振荡器,频率为8MHz,精度不高

          (2).HSE高速外部时钟,可接石英/陶瓷谐振器,频率范围4MHz~16MHz

          (3).HSI低速内部时钟,RC振荡器,频率为40kHz,提供低耗时钟,用于看门狗

          (4).LSE低速外部时钟,接32.768kHz的石英晶体,用于RTC

          (5).PLL锁相环倍频输出,其时钟来源可以是HSI/2、HSE或者HSE/2,备品可选择                       2~16倍,但是其输出频率最大不得超过72MHz

2.MCO为时钟输出引脚(PA8),可以将相关时钟配置给IO口使用

3.系统时钟SYSCLK有三个时钟来源:HSI、HSE、PLL

4.灰色梯形为时钟选择器,可以选择挂载在其上面的时钟作为时钟源

5.绿色矩形为分频器,用于时钟的分频,降低时钟的频率

6.黄色矩形是时钟监控系统CSS(作用如图所示)

RCC(即复位与时钟配置模块)相关配置:

可以配合时钟结构图一起理解:

1.时钟使能配置,就是使能相应的时钟源

2.时钟源相关配置,比如说配置PLL、SYSCLK、RTC的时钟频源,配置相关的时钟频率

3.分频系数选择配置,就是灰色梯形

4.外设(内部)时钟使能,就是在使用外设时,首先需要使能相应的时钟线,外设具有相应的工作频率了,才能工作

5.其他外设时钟使能,道理同4差不多

6.状态参数获取参数,比如获取时钟的频率、获取系统时钟源、获取时钟状态等

7.RCC中断相关函数

 时钟的相关配置寄存器:

系统时钟SYSCLK的相关配置在system_stm32f10x.c 中

修改系统时钟频率为注释和启用下图:

比如说你要将系统时钟设置为72MHz,就需要启用如下定义

STM32F103时钟结构_第1张图片

启用相关定义后,在系统初始化后会运行相应的系统时钟配置函数:

就是说,你再选择系统时钟设置为72MHz后,,系统时钟的相关配置,会根据72MHz的系统时钟进行系统时钟的配置(配置函数为蓝色高亮函数)

STM32F103时钟结构_第2张图片

 下面让我们看看上面这个将系统时钟配置为72MHz的函数(上面蓝色高亮函数),配置时钟的具体过程:

STM32F103时钟结构_第3张图片先是使能外部高速时钟源HSE(也就是确定外部时钟源为系统时钟,8MHz) ,然后等待时钟就绪。

STM32F103时钟结构_第4张图片

 这段代码对照着时钟框图理解,高速外部时钟HSE(8MHz)就绪后,确定SYSCLK(系统时钟)后面的那一部分绿色矩形的分频系数,即:

设置AHB分频系数为(uint32_t)RCC_CFGR_HPRE_DIV1

设置APB1的分频系数为(uint32_t)RCC_CFGR_PPRE1_DIV2

设置APB2的分频系数为(uint32_t)RCC_CFGR_PPRE2_DIV1

注意:

这些分频系数在此就已经设定了!这也就是,GPIOA等一系列IO口在写驱动的时候,只需要使能相应时钟,而不需要确定时钟频率的原因!因为系统时钟频率(分频系数)已经设定!

这段代码对照着时钟框图理解, 这段代码是说,在时钟源HSE(8MHz)确定后,需要经过锁相环PLL进行9倍频后,最终确定系统时钟SYSCLK频率为72MHz.

你可能感兴趣的:(STM32,stm32,单片机,c语言)