RCC主要作用:时钟
设置SYSCLK 设置AHB分频因子····配置好这些因子就能对时钟进行完整的配置。
时钟树如图:
系统时钟的选择是在启动时进行,复位时内部8MHz的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具失效监控的4~16MHz时钟;当检测到外部时钟失效时,它将被隔离,系统自动地切换到内部的RC振荡器,如果使能了中断,软件可以接收到相应的中断。同样,在需要时可以采取对PLL时钟完全的中断管理(如当一个间接使用的外部振荡器失效时)。
多个预分频器用于配置AHB的频率、高速APB(APB2)和低速APB(APB1)区域。AHB和APB的最高频率是36MHz。
编程要领:
1)开启HSE/HSI 等待HSE/HSI 稳定
2)设置AHB,APB2,APB1的预分频因子
3)设置PLL的时钟来源和PLL的倍频因子,各个频率主要在这里设置
4)开启PLL 等待PLL稳定
5)把PLLCK切换为系统时钟SYSCLK
6)读取时钟切换状态位,确保PLLCLK被选中为系统时钟
HSE配置系统时钟
#include"stm32f10x.h"#include"bsp_rccclkconfig.h"voidHSE_SetSysClk(uint32_tRCC_PLLMul_x) //设置HSE为系统时钟{ //把RCC外设初始化成复位状态ErrorStatusHSEStatus; //把RCC寄存器复位RCC_DeInit(); //使能HSE,开启外部晶振RCC_HSEConfig(RCC_HSE_ON); //等待HSE启动HSEStatus=RCC_WaitForHSEStartUp(); //当HSE稳定之后继续往下执行if(HSEStatus==SUCCESS ) { //使能预取指FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); //LATENCY:时延//这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例//000:零等待状态,当 0 < SYSCLK ≤ 24MHz//001:一个等待状态,当 24MHz < SYSCLK ≤ 48MHz//010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHzRCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div2); //配置PLLCLK = HSE *RCC_PLLMul_xRCC_PLLConfig( RCC_PLLSource_HSE_Div1,RCC_PLLMul_x); //使能PLLRCC_PLLCmd(ENABLE); //等待PLL时钟稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET ) { //选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() !=0x08); } } else { } } voidMCO_GPIO_Config() { //定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDefGPIO_InitStructure; //开启LED相关GPIO的外设时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //选择控制的引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //选择输出方式为推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置引脚速率为50MHZGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //调用库函数,初始化GPIOGPIO_Init(GPIOA, &GPIO_InitStructure); }
使用HSI作为系统时钟
#include"stm32f10x.h"#include"bsp_rccclkconfig.h"voidHSI_SetSysClk(uint32_tRCC_PLLMul_x) //设置HSE为系统时钟{ //把RCC外设初始化成复位状态__IOuint32_tHSIStatus=0; //把RCC寄存器复位RCC_DeInit(); //使能HSI,开启外部晶振RCC_HSICmd(ENABLE); //等待HSE启动HSIStatus=RCC->CR&RCC_CR_HSIRDY; //当HSE稳定之后继续往下执行if(HSIStatus==SUCCESS ) { //使能预取指FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); //设置SYSCLK周期与flash的访问时间比例,这里为2//设置成2的时候,SYSCLK低于48MHz也可以工作,设置成0或者1RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div2); //配置PLLCLK = HSE *RCC_PLLMul_xRCC_PLLConfig( RCC_PLLSource_HSI_Div2,RCC_PLLMul_x); //使能PLLRCC_PLLCmd(ENABLE); //等待PLL时钟稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET ) { //选择系统时钟RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() !=0x08); } } else { } } voidMCO_GPIO_Config() { //定义一个GPIO_InitTypeDef类型的结构体GPIO_InitTypeDefGPIO_InitStructure; //开启LED相关GPIO的外设时钟RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //选择控制的引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //选择输出方式为推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置引脚速率为50MHZGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //调用库函数,初始化GPIOGPIO_Init(GPIOA, &GPIO_InitStructure); }