STM32陆陆续续把基础的部分学完了,但对于时钟一直一知半解。
今天开始陆陆续续补充关于时钟部分的知识。
一、时钟树
STM32为了实现低功耗,而设计的功能完善构成复杂的时钟系统,称之时钟树。使外设功能的时钟可自配置。因为STM32外设众多,而不同的项目用到的外设参差不齐,所以可控的时钟可以实现降低产品功耗。
所有的外设在使用之前都必须设置时钟信号,才可以正常工作。以STM32F103C8T6时钟树为例,如下图所示:

STM32的四个时钟源
外部时钟
- 高速外部时钟(HSE):外部时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。
- 低速外部时钟(LSE):外部时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。
内部时钟
- 高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。
- 低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz
大置过程:
- 8M时钟遇到第一个分频器PLLXTPRE,也就是HSE后面的第一个节点,我们一般不分频。(若为HSI则必须分频2倍)
- 时钟来到PLL Source Mux,可选输入的时钟信号有外部高速时钟(HSE)和内部高速时钟(HSI),选择HSE。
- 接着信号走到锁相环PLL,具有倍频作用,HSE或者HSI/2经过倍频得到PLLCLK 通常为8*9=72MHz(及HSE选择倍频9得到的)若为HSI/2时PLLCLK则最大为64Mhz
- 来到系统时钟源输入选择,可选时钟有HSE(8M)、HSI(8M)和经过倍频的PLL CLK(72M),选择PLL CLK作为系统时钟,此时系统时钟为72M。
- 系统时钟(SYSCLK)来到AHB预分频器,可选分频系数:1,2,4,8,16,32,64,128,256。选择不分频,直接来到挂载低速外设的(APB1)PCLK1和挂载高速外设的(APB2)PCLK2。
- PCLK1低速外设时钟的最大频率为36M,所以最低进行2分频。PCLK2高速外设时钟的最大频率是72M,可选择不分频。
手动配置32的时钟(库函数版本)
日常直接使用库函数就好了 Stm32_Clock_Init(9);
#include "HSE.h"
#include "sys.h"
#include "stm32f10x.h"
void HSE_Init(uint32_t RCC_PLLMul_x)
{
ErrorStatus HSEState;
RCC_DeInit();
//使能HSE
RCC_HSEConfig(RCC_HSE_ON);
HSEState=RCC_WaitForHSEStartUp();
//判断HSE是否启动成功
if(HSEState==SUCCESS)
{
//使能预取值
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置 PLLCLK=HSE*RCC_PLLMul_x
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PPL稳定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//选择系统时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
else
{
/**/
}
}
本文详细介绍了STM32的时钟树结构,包括外部时钟、内部时钟源,以及从HSE到系统时钟的配置过程。通过举例阐述了如何设置不同分频器和倍频器来优化功耗,并提供了手动配置32MHz时钟的库函数示例。
2615

被折叠的 条评论
为什么被折叠?



