STM32上电默认时钟内部8MHZ,经过库函数SystemInit的初始化,设置成启用外部晶振模式,并设为系统时钟为PLL倍频后的时钟:72MHZ.
* SYSCLK 72MHz
* AHB 72MHz
* PCLK1 36MHz
* PCLK2 72MHz
* PLL 72MHz
但是用户可以自己选择使用不同时钟,下面给出了几个函数。
可以配置成内部时钟或者外部时钟。
/*
* 寄存器的方式设置系统时钟:
* 输入PLL倍频因子,输入PLL的倍频值2—16倍频(注意:不同的芯片有不同的倍频因子)
* HCLK = PLLCLK=SYSCLK=P2CLK=P1CLK*2=ADCCLK*2=TIMCLK=USBCLK*2/3
*
*/
void HSE_SetPLL(u8 PLL)//
{
unsigned char temp=0;
RCC_DeInit(); //将RCC寄存器重新设置为默认值
RCC->CR|=0x00010000; //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18; //设置PLL倍频值 2~16
RCC->CFGR|=1<<16; //PLL时钟源选择
FLASH->ACR|=0x32; //FLASH 2个延时周期
RCC->CR|=0x01000000; //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟
while(temp!=0x02) //等待PLL作为系统时钟设置成功
{
temp=RCC->CFGR>>2;
temp&=0x03;
}
}
//RCC_HSE_Configuration函数设置HSE作为PLL的时钟源,不设置的话在main函数执行前执行了SystemInit函数
/*************************************
* 使用外部晶振:8MHZ, 最大可以配置到72MHZ
* 执行SystemInit函数后芯片内部时钟为:
* SYSCLK 72MHz
* AHB 72MHz
* PCLK1 36MHz
* PCLK2 72MHz
* PLL 72MHz
**************************************/
void RCC_HSE_Configuration(void)
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE) HSE晶振打开(ON)
if(RCC_WaitForHSEStartUp() == SUCCESS)//等待HSE起振,SUCCESS;HSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK) RCC_SYSCLK_Div1 ----- AHB时钟 = 系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2) RCC_HCLK_Div1 ----- APB2时钟 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1) RCC_HCLK_Div2 ----- APB1时钟 = HCLK/2
/* 下面两句话不加的话,不能配置成72Mhz */
FLASH_SetLatency(FLASH_Latency_2);//设置FLASH存储器延时时钟周期数FLASH_Latency_2 2延时周期
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//选择FLASH预取指缓存的模,预取指缓存使能
// 设置系统时钟为:外部晶振时钟 * RCC_PLLMul_9 / RCC_PLLSource_HSE_Div1 = 8MHZ * 9 / 1 = 72MHZ
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟源及倍频系RCC_PLLConfig(外部时钟分频因子,PLL倍频系数)
RCC_PLLCmd(ENABLE);//使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//检查指定的RCC标志位(PLL准备好标志)设置与否
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
while(RCC_GetSYSCLKSource() != 0x08);//0x08:PLL作为系统时钟
}
}
/*************************************
* 使用内部晶振:8MHZ,内部最大可以配置到64MHZ
* 执行SystemInit函数后芯片内部时钟为:
* SYSCLK 72MHz
* AHB 72MHz
* PCLK1 36MHz
* PCLK2 72MHz
* PLL 72MHz
**************************************/
void RCC_HSI_Configuration(void)
{
RCC_DeInit();//将外设 RCC寄存器重设为缺省值
RCC_HSICmd(ENABLE);//使能HSI
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)//等待HSI使能成功
{
}
if(1)
{
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);
//设置 PLL 时钟源及倍频系数
/*
* RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_4); // 结果导致:PLL系统时钟为:8M / 2 * 4 = 16MHZ
* RCC_PLLSource_HSI_Div2: 分频系数,内部时钟为8MHZ,经过2分频 = 8MHZ/2 = 4MHZ
* RCC_PLLMul_4: PLL倍频因子,表示倍频4倍
*
*/
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
//等待指定的 RCC 标志位设置成功 等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
//设置系统时钟(SYSCLK) 设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//等待PLL成功用作于系统时钟的时钟源
// 0x00:HSI 作为系统时钟
// 0x04:HSE作为系统时钟
// 0x08:PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
}
阅读(2812) | 评论(0) | 转发(0) |