STM32 的时钟系统

STM32有5个时钟源:
1.HSI高速内部时钟,RC振荡器,可作为系统时钟或者用作PLL时钟输入。16MHZ
2.HSE高速外部时钟。4-26MHZ
3.LSI是低速内部时钟,RC振荡器。频率为32KHZ,用于驱动独立看门狗。
4.LSE低速外部时钟。用于驱动RTC时钟(RTCCLK)
5.PLL为锁相环倍频输出。主PLL由HSI或HSE提供时钟信号。
一共有三个PLL,分别为主PLL、专用PLLI2S、专用PLLSAI。
1)主PLL有两个不同的输出时钟。一个作为高速系统时钟(最高达216MHZ),第二个输出用于为 USB OTG FS、SDMMC 和 RNG 生成 48 MHz 时钟。
2)另外两个专用时钟也是为其他模块提供时钟源的。
对于每个时钟源在未使用时都可以打开或关闭,以降低功耗。
其中,HSI、HSE、PLL可用来驱动系统时钟SYSCLK。

PLLCLK = HSE *N /(M *P)

STM32 的时钟系统_第1张图片

Stm32_Clock_Init函数讲解:

时钟系统配置的一般步骤:
1.使能PWR时钟:调用函数__HAL_RCC_PWR__CLK_ENABLE();
2.设置调压器输出电压级别:
调用函数__HAL_PWR_VOLTAGESCALING_CONFIG();
3.选择是否开启Over_Drive功能。调用函数:HAL_PWREx_EnableOverDrive();
4。配置时钟源相关参数:调用函数HAL_RCC_OscConfig();
5.配置系统时钟源以及AHB,APB1,APB2的分频系数
调用函数 HAL_RCC_ClockConfig();

PS:
Fvco = Fs*N/M; // Fvco VCO频率
Fsys = Fvco/P ; // Fsys 系统时钟频率
Fusb = Fvco/Q; // Fusb USB、RNG、SDIO等的时钟频率 // Fs PLL输入时钟频率,可以为HSI 或 HSE

例子: 外部晶振为25MHZ时,若N = 432; M = 25; P = 2 ;Q= 9
则 : Fvco = 25*432/25 = 432MHZ;
Fsys = 432/2 = 216MHZ;
Fusb = 432/9 = 48 MHZ;

时钟源配置函数: HAL_RCC_OscConfig();
HAL_RCC_OscConfig(&RCC_OscInitStructure)
RCC _OscInitTypeDef* RCC_OscInitStructure

typedef struct
{
uint32_t OsillatorType;
uint32_t HSEState;
uint32_t HSIState;
uint32_t LSEState;
uint32_t HSICalibration Value;
uint32_t LSIState;
RCC_PLLInitTypeDef PLL;
} RCC _OscInitTypeDef

typedef struct
{
uint32_t PLLState;
uint32_t PLLSource;
uint32_t PLLM;
uint32_t PLLN;
uint32_t PLLP;
uint32_t PLLQ;

} RCC _PLLInitTypeDef

RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; // 时钟源为HSE
RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE
RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON; // 打开PLL
RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE; //PLL时钟源选择为HSE
RCC_OscInitStructure.PLL.PLLM=pllm; // 分频系数
RCC_OscInitStructure.PLL.PLLN=plln; //分频系数
RCC_OscInitStructure.PLL.PLLP=pllp;//分频系数 RCC_OscInitStructure.PLL.PLLQ=pllq; //分频系数
HAL_RCC_OscConfi(&RCC_OscInitStructure);//初始化

时钟配置函数:HAL_RCC_ClockConfig();

typedef struct
{
uint32_t ClockType;
uint32_t SYSCLKSource;
uint32_t AHBCLKDivider;
uint32_t APB1CLKDivider;
uint32_t APB2CLKDivider;
} RCC_ClkInitTypeDef;

RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;// 系统时钟源
RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数
RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数
RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数
HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_7);//同时设置FLASH延时周期为7WS,也就是8个CPU周期。

配置调压器输出级别和开启Over-Drive 功能需要开启PWR时钟。
STM32 的时钟系统_第2张图片
今天的学习就到这,欢迎批评指正或补充~

你可能感兴趣的:(stm32)