1.时钟树
STM32可使用外部高速时钟HSE和内部时钟HSI
将系统时钟配置为72MHZ的过程:
8M的HSE通过OSC_IN/OUT连接,首先遇到HSE分频器PLLXTPRE,可设置二分频或不分频,此处选择不分频,然后到达PLL输入时钟源(PLLSRC,选择使用内部时钟或外部时钟),再设置PLL倍频系数(PLLMUL,设置范围为2-16)为9,此时频率为72MHZ,然后进入AHB总线HCLK此时可以通过HPRE[3:0]设置分频(范围1,2,4,8,16,128,256,512),这里我们不设置,现在72MHZ的时钟已经来到了外设时钟总线,APB1,APB可以各自设置分频,我们设置为1及不分频,都为72MHZ。
以上配置均通过设置 时钟配置控制寄存器(RCC_CFGR)实现
代码实现
RCC_Config.c
#include "rcc_config.h"
void HSE_SetSysCLK(uint32_t RCC_PLLMul_x)
{
ErrorStatus HSEStatus;
RCC_DeInit(); //复位RCC寄存器
RCC_HSEConfig(RCC_HSE_ON);
HSEStatus=RCC_WaitForHSEStartUp();
if(HSEStatus==SUCCESS)
{
//使能预取指
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_ACR_LATENCY_2);
RCC_HCLKConfig(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_PCLK2_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置PLLCLK=HSE*RCC_PLLMul_x
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_x); //PLL默认9 范围2-16 超频
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟
while(RCC_GetSYSCLKSource()!=0x08); //0x08 PLL被用作系统时钟而我们已将HSE设置为PLL
}
else
{
}
}
RCC_Config.h
#ifndef _rcc_config_h
#define _rcc_config_h
#include "stm32f10x.h"
void HSE_SetSysCLK(uint32_t RCC_PLLMul_x);
#endif