STM32中通过固件库自己编写时钟配置文件

使用HSE配置系统时钟

  • 因为STM工程使用固件库,进入main函数时都已配置好时钟,所以我们自己编写时钟配置文件首先需要复位RCC寄存器!
  • 使能HSE
  • 判断HSE是否启动成功
  • 使能预取指
  • 设置FLASH等待周期
  • 配置3条总线的倍频因子
  • 配置锁相环,使能锁相环
  • 等待锁相环稳定
  • 选择锁相环输出为系统时钟,并等待其稳定
void HSE_sysclock_config( uint32_t  RCC_PLLMul_x )
{
    //先复位RCC寄存器
    RCC_DeInit();

    /*使用HSE配置系统时钟*/

    //使能HSE
    RCC_HSEConfig( RCC_HSE_ON );

    //检测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);

        //使能PLL
        RCC_PLLCmd(ENABLE);

        //等待PLL稳定
        while ( RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY) );

        //选择系统时钟(选择锁相环输出)
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //等待选择稳定
        while ( 0x08 != RCC_GetSYSCLKSource() );
    }
    else
    {
        //HSE启动失败,用户自己编写补救措施
    }

}

使用HSI配置系统时钟

  • 因为STM工程使用固件库,进入main函数时都已配置好时钟,所以我们自己编写时钟配置文件首先需要复位RCC寄存器!
  • 使能HSI
  • 判断HSI是否启动成功
  • 使能预取指
  • 设置FLASH等待周期
  • 配置3条总线的倍频因子
  • 配置锁相环,使能锁相环
  • 等待锁相环稳定
  • 选择锁相环输出为系统时钟,并等待其稳定
void HSI_sysclock_config( uint32_t  RCC_PLLMul_x )
{
    __IO uint32_t HSIStatus = 0;

    //先复位RCC寄存器
    RCC_DeInit();

    /*使用HSI配置系统时钟*/

    //使能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);  

        //配置三个总线的倍频因子
        //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_HSI_Div2, RCC_PLLMul_x);

        //使能PLL
        RCC_PLLCmd(ENABLE);

        //等待PLL稳定
        while ( RESET == RCC_GetFlagStatus(RCC_FLAG_PLLRDY) );

        //选择系统时钟(选择锁相环输出)
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //等待选择稳定
        while ( 0x08 != RCC_GetSYSCLKSource() );
    }
    else
    {
        //HSI启动失败,用户自己编写补救措施
    }

}

猜你喜欢

转载自blog.csdn.net/super_marie/article/details/79935005