我是焊了8MHz 的晶振,但用内部的RC。采用MSI。
//*************************************************************************************
//#define HSE_8MHZ_EN 1 //=0 使用内部时钟HSI;=1使用外部时钟,=2 MSI使用
#define USE_PLL 0 //=0 不倍频;=1 倍频!!
//*************************************************************************
void SET_RRC(void){
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(DISABLE);//DISABLE
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_0);
/* Disable 64-bit access */
FLASH_ReadAccess64Cmd(DISABLE);
/* GPIOA clock enable */
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
/* DAC Periph clock enable */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* Enable TIM2 clock */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* System resumed from STANDBY mode */
/* Clear StandBy flag */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
//PWR_ClearFlag(PWR_FLAG_SB);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);// RCC_APB2Periph_USART1
}
//******************************************************************
//设置震荡源HsE HSI
//*******************************************************************
void Set_HSI_HSE(void){
/* Enable the HSI oscillator */
//RCC_HSICmd(ENABLE); //必须打开,ADC使用的!
/* Check that HSI oscillator is ready */
//while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
if(HSE_8MHZ_EN==0){
RCC_HSEConfig(RCC_HSE_OFF); //关闭外部晶振
RCC_HSICmd(ENABLE); //,ADC使用的!
if(USE_PLL==1){
RCC_PLLConfig(RCC_PLLSource_HSI,RCC_PLLMul_3,RCC_PLLDiv_4);//16*3=48;48/3=16mhz
RCC_PLLCmd(ENABLE);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
}else{
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);// 使用PLL频率
}
/********设置分频 ****************/
RCC_HCLKConfig(RCC_SYSCLK_Div1); //6MHZ
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
if (USE_PLL==0){
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY ) == RESET);//等待稳定!RCC_SYSCLKConfig RCC_FLAG_PLLRDY
}else{
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET);//等待稳定!
}
RCC_MSICmd(DISABLE);
}
if(HSE_8MHZ_EN==1){
RCC_HSEConfig(RCC_HSE_ON); //打开外部晶振
RCC_PLLCmd(DISABLE);
if(USE_PLL==1) RCC_PLLConfig(RCC_PLLSource_HSE,RCC_PLLMul_3,RCC_PLLDiv_3);//8*3/3 8mhz
/********设置分频 ****************/
//RCC_HCLKConfig(RCC_SYSCLK_Div1); //4MHZ /1 =4M 直接使用4M晶振!!
RCC_HCLKConfig(RCC_SYSCLK_Div2); //8MHZ/2=4MHz 2016-3-10 改成4 工作频率是8/4=2M
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
//------------------------------------------------------------------
if(USE_PLL==1){
RCC_PLLCmd(ENABLE);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_WaitForHSEStartUp()==ERROR);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY ) == RESET);//等待稳定!
}else{
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
while(RCC_WaitForHSEStartUp()==ERROR);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY ) == RESET);//等待稳定!RCC_SYSCLKConfig
}
//RCC_HSEConfig(RCC_HSE_ON); //打开外部晶振
RCC_HSICmd(DISABLE); //ADC使用的!
RCC_MSICmd(DISABLE);
}
if(HSE_8MHZ_EN==2){
RCC_HSEConfig(RCC_HSE_OFF); //关闭外部晶振
RCC_MSICmd(ENABLE);
RCC_MSIRangeConfig(RCC_MSIRange_6);// 65K 2--ok
RCC_SYSCLKConfig(RCC_SYSCLKSource_MSI);
/********设置分频 ****************/
RCC_HCLKConfig(RCC_SYSCLK_Div1); //
RCC_PCLK1Config(RCC_HCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
while(RCC_GetFlagStatus(RCC_FLAG_MSIRDY) == RESET);//等待稳定!RCC_SYSCLKConfig
RCC_HSICmd(DISABLE); //,ADC使用的!
}
//**********************************************************************************
SET_RRC();
//******************************************************************************************
}
|