stm32f407vet6标准库函数设置时钟源

根据块说明:

RCC_DeInit();
 /*这里选择 外部晶振(HSE)作为 时钟源,因此首先打开外部晶振*/
 RCC_HSEConfig(RCC_HSE_ON);
 /*等待外部晶振进入稳定状态*/
 while( RCC_WaitForHSEStartUp() != SUCCESS );
 /* 到这一步为止,已有 HSE_VALUE = 8 MHz.
    PLL_VCO input clock = (HSE_VALUE or HSI_VALUE / PLL_M),
    根据文档,这个值被建议在 1~2MHz,因此我们令 PLL_M = 8,
    即 PLL_VCO input clock = 1MHz */
 PLL_M         =    8;  
 /* 到这一步为止,已有 PLL_VCO input clock = 1 MHz.
    PLL_VCO output clock = (PLL_VCO input clock) * PLL_N,
    这个值要用来计算系统时钟,我们 令 PLL_N = 336,
    即 PLL_VCO output clock = 336 MHz.*/       
 PLL_N        =    336;
 /* 到这一步为止,已有 PLL_VCO output clock = 336 MHz.
    System Clock = (PLL_VCO output clock)/PLL_P ,
    因为我们要 SystemClock = 168 Mhz,因此令 PLL_P = 2.
    */
 PLL_P         =    2;
 /*这个系数用来配置SD卡读写,USB等功能,暂时不用,根据文档,暂时先设为7*/
 PLL_Q         =    7;
 /* 配置PLL并将其使能,获得 168Mhz 的 System Clock 时钟*/
 RCC_PLLConfig(RCC_PLLSource_HSE, PLL_M, PLL_N, PLL_P, PLL_Q);
 RCC_PLLCmd(ENABLE);
 /*到了这一步,我们已经配置好了PLL时钟。下面我们配置Syetem Clock*/
 /*选择PLL时钟作为系统时钟源*/
 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

第一步,打开.c文件,注释系统默认的配置

 第二步,修改板子上对应的外部晶振值

 第三步,时钟配置代码

/*
 * 使用HSE时,设置系统时钟的步骤
 * 1、开启HSE ,并等待 HSE 稳定
 * 2、设置 AHB、APB2、APB1的预分频因子
 * 3、设置PLL的时钟来源
 *    设置VCO输入时钟 分频因子        m
 *    设置VCO输出时钟 倍频因子        n
 *    设置PLLCLK时钟分频因子          p
 *    设置OTG FS,SDIO,RNG时钟分频因子 q
 * 4、开启PLL,并等待PLL稳定
 * 5、把PLLCK切换为系统时钟SYSCLK
 * 6、读取时钟切换状态位,确保PLLCLK被选为系统时钟
 */

/*
 * m: VCO输入时钟 分频因子,取值2~63
 * n: VCO输出时钟 倍频因子,取值192~432
 * p: PLLCLK时钟分频因子  ,取值2,4,6,8
 * q: OTG FS,SDIO,RNG时钟分频因子,取值4~15
 * 函数调用举例,使用HSE设置时钟
 * SYSCLK=HCLK=168M,PCLK2=HCLK/2=84M,PCLK1=HCLK/4=42M
 * HSE_SetSysClock(25, 336, 2, 7);
 * HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法
 
 * 系统时钟超频到216M爽一下
 * HSE_SetSysClock(25, 432, 2, 9);
 */
void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)    
{
    __IO uint32_t HSEStartUpStatus = 0;
  
    // 使能HSE,开启外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    
    // 等待HSE启动稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        // 调压器电压输出级别配置为1,以便在器件为最大频率
        // 工作时使性能和功耗实现平衡
        RCC->APB1ENR |= RCC_APB1ENR_PWREN;
        PWR->CR |= PWR_CR_VOS;
        
        
        // APB1 = 42MHz (最大), APB2 = 84MHz (最大)
        RCC_HCLKConfig(RCC_SYSCLK_Div1);   // HCLK = 168MHz
        RCC_PCLK1Config(RCC_HCLK_Div4);    // PCLK1 = 42MHz
        RCC_PCLK2Config(RCC_HCLK_Div2);    // PCLK2 = 84MHz
        
        //配置PLL (HSE = 8MHz, 目标168MHz)
        // PLL_M = 8, PLL_N = 336, PLL_P = 2 (分频因子)
        RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);
        
        // 使能PLL
        RCC_PLLCmd(ENABLE);

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

        /*-----------------------------------------------------*/
        //开启 OVER-RIDE模式,以能达到更高频率(F429才有该功能)
        //    PWR->CR |= PWR_CR_ODEN;
        //    while((PWR->CSR & PWR_CSR_ODRDY) == 0)
        //    {
        //    }
        //    PWR->CR |= PWR_CR_ODSWEN;
        //    while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)
        //    {
        //    }      
        
        
        // 配置FLASH预取指,指令缓存,数据缓存和等待状态
        FLASH->ACR = FLASH_ACR_PRFTEN 
                        | FLASH_ACR_ICEN 
                        | FLASH_ACR_DCEN 
                        | FLASH_ACR_LATENCY_5WS;
        
//        //命令的形式
//        FLASH_SetLatency(FLASH_Latency_5);
//        FLASH_PrefetchBufferCmd(ENABLE);
        /*-----------------------------------------------------*/
            
        // 当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLK
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        // 读取时钟切换状态位,确保PLLCLK被选为系统时钟
        while (RCC_GetSYSCLKSource() != 0x08)
        {
        }
    }
//    else
//    { 
//        // HSE启动出错处理
//        while (1)
//        {
//        }
//    }
}

第四步,main函数调用

//使用HSE,配置系统时钟为168M,外部8MHZ晶振
HSE_SetSysClock(8, 336, 2, 7);
//使用HSE,配置系统时钟为168M,外部25MHZ晶振
//HSE_SetSysClock(25, 336, 2, 7);

 

posted @ 2025-06-20 11:12  木子zzgxl  阅读(194)  评论(0)    收藏  举报