stm32F103采用内部晶振8MHz时钟和外部晶振初始化代码

使用HSE配置系统时钟(stm32F10x 系列 外部晶振一般为4M–25MHz,具体见芯片手册)
首先需要复位RCC寄存器!
使能HSE
判断HSE是否启动成功
使能预取指
设置FLASH等待周期
配置3条总线的倍频因子
配置锁相环,使能锁相环
等待锁相环稳定
选择锁相环输出为系统时钟,并等待其稳定

设置时钟流程:
1、将RCC寄存器重新设置为默认值  RCC_DeInit
2、打开外部高速时钟晶振HSE    RCC_HSEConfig(RCC_HSE_ON);
3、等待外部高速时钟晶振工作    HSEStartUpStatus = RCC_WaitForHSEStartUp();
4、设置PLL              RCC_PLLConfig
5、打开PLL              RCC_PLLCmd(ENABLE);
6、设置系统时钟          RCC_SYSCLKConfig
7、设置AHB时钟           RCC_HCLKConfig;
8、设置低速速AHB时钟      RCC_PCLK1Config
9、设置高速AHB时钟        RCC_PCLK2Config;
10、等待PLL工作          while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 
11、判断是否PLL是系统时钟  while(RCC_GetSYSCLKSource() != 0x08)
12、打开要使用的外设时钟   RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd()
    /*使用HSE配置系统时钟*/
void HSE_sysclock_config( uint32_t  RCC_PLLMul_x )
{
    RCC_DeInit();    //先复位RCC寄存器
    RCC_HSEConfig( RCC_HSE_ON );    //使能HSE
    //检测HSE是否启动成功
    if ( SUCCESS == RCC_WaitForHSEStartUp() )
    {
        //使能预取指,这是FLASH固件中的函数
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
        //设置FLASH等待周期。  因为倍频成72M 所以等待两个周期。
        FLASH_SetLatency(FLASH_Latency_2);  
        //配置三个总线的倍频因子
        //HCLK --> AHB 最大为72M,所以只需要1分频
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        //PCLK1 --> APB1 最大为36M,所以要2分频
		RCC_PCLK1Config(RCC_HCLK_Div2);
        //PCLK2 --> APB2 最大为72M,所以只需要1分频
		RCC_PCLK2Config(RCC_HCLK_Div1);
        //先配置锁相环 PLLCLK = HSE * 倍频因子
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);
        RCC_PLLCmd(ENABLE);        //使能PLL
        while ( RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY) );  //等待PLL稳定
        //选择系统时钟(选择锁相环输出)
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //等待选择稳定
        while ( 0x08 != RCC_GetSYSCLKSource() );
    }
    else
    {
        //HSE启动失败
    }

}

使用HSI配置系统时钟<使用时钟初始化代码之前 先一定要设置<晶振为8MHz>,不能设置25MHz等其它频率
stm32F103采用内部晶振8MHz时钟和外部晶振初始化代码_第1张图片
使用HSI配置系统时钟
首先需要复位RCC寄存器!
使能HSI
判断HSI是否启动成功
使能预取指
设置FLASH等待周期
配置3条总线的倍频因子
配置锁相环,使能锁相环
等待锁相环稳定
选择锁相环输出为系统时钟,并等待其稳定

void HSI_sysclock_config( uint32_t  RCC_PLLMul_x )
{
    __IO uint32_t HSIStatus = 0;
    //先复位RCC寄存器
    RCC_DeInit();
    //使能HSI
    RCC_HSICmd(ENABLE);
    //检测HSE是否启动成功
    HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    if ( RCC_CR_HSIRDY == HSIStatus )
    {
        //使能预取指,这是FLASH固件中的函数
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

        //设置FLASH等待周期。  因为倍频成72M 所以等待两个周期。
        FLASH_SetLatency(FLASH_Latency_2);  
		// 8M/2*16=64M RCC_PLLMul_x = RCC_PLLMul_16
		RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x); //先配置锁相环 PLLCLK = HSI * 倍频因子
		//配置三个总线的倍频因子
		// HCLK = SYSCLK AHB 36M
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK --> AHB 最大为72M,所以只需要1分频
		RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 --> APB1 最大为36M,所以要2分频	
		RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 --> APB2 最大为72M,所以只需要1分频
		RCC_PLLCmd(ENABLE); //使能PLL
		// Wait till PLL is ready
		while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL稳定
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择系统时钟(选择锁相环输出)
		// Wait till PLL is used as system clock source
		while (RCC_GetSYSCLKSource() != 0x08); //等待选择稳定
		RCC_GetClocksFreq(&RCC_ClockFreq);//查看频率值
		}
		else
		{
			//HSI启动失败
		}
}


你可能感兴趣的:(stm32)