单片机 > 单片机程序设计 > 详情

STM32F4时钟系统初探(二)

发布时间:2025-02-11 发布时间:
|

上次了解了STM32F4时钟系统中PLL的基本状况, 现在我打算自已动手配置一下STM32的时钟, 使用PLL将STM32F429的主频倍到168MHz去, Let’s go.

名词注解:
RCC: Reset Clock Config, 复位时钟配置.

下面直接上代码, 但有有一点要注意: 在使能PLL之前PLL所有的参数都要配置完毕, 等PLL使能后PLL是不可以再进行配置的.

代码:

void RCC_Config(void)

{

    ErrorStatus status = ERROR;

    // 复位RCC寄存器

    RCC_DeInit();

    // 打开外部高速晶振

    RCC_HSEConfig(RCC_HSE_ON);

    // 等待高速晶振稳定

    status = RCC_WaitForHSEStartUp();

 

    if (status == SUCCESS)

    {

        // 使能flash缓存预读取

        FLASH_PrefetchBufferCmd(ENABLE);

        // 在STM32F42xxx和STM32F43xxx中, 这个值与电压和主频都有关系.

        // 当电压在2.7-3.6V, 150 < HCLK <= 180MHz时, 为5个WS

        FLASH_SetLatency(FLASH_Latency_5);

        // 配置PLL, SYSCLK = 168MHz

        RCC_PLLConfig(RCC_PLLSource_HSE, 2, 84, 2, 7);

        // 使能PLL

        RCC_PLLCmd(ENABLE);

        // 等待PLL稳定

        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        // 设置PLL为系统时钟

        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        // 等待PLL被用于系统时钟

        while (RCC_GetSYSCLKSource() != 0x08);

    }

    else

    {

        // HSE启动失败, 死循环

        while (1);

    }

 

    return;

}

使用以上代码就可以使用PLL将主频倍到168MHz去了, RCC_PLLConfig(RCC_PLLSource_HSE, 2, 84, 2, 7)这个函数中的参数怎么计算可以参照上一节, 在这里不再多说.
接下来就是相应外设时钟的配置, 建议在相应的外设初始化中配置即可. 不同的外设属于不同的总线, 在使用外设前记得配置对应的时钟.
在RCC初始化中调用了两个FLASH相关的函数, 这里说一下是怎么回事.

ARM的大部分指令可以在一个时钟周期中执行完成, 当CPU主频为168MHz时, 指令周期大约为6us, 但是Flash的读取时间大约为35us, 这样就带来一个矛盾, CPU执行速度太快, 指令来不及从Flash读取. 为了使CPU能全速运行, Flash控制器使用了一个128位的指令预读缓冲器, 可存储4条32位指令或者8条16位指令. FLASH_PrefetchBufferCmd(ENABLE)指令用来使能这个缓存区, 需要注意的是当电压低于2.1V时缓存区必须禁用掉(RM0090 P80). FLASH_SetLatency(FLASH_Latency_5)设置Flash预读缓存所需要的等待状态, 这个值与CPU的主频和电压均有关系, 具体可以参考数据手册, 对于STM32F42xxx和STM32F43xxx, 主频在150M到180M之间时, 需要5个等待状态(Wait states), 为6个CPU周期.


关键字:STM32F4  时钟系统 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM系列 STM32F103RCT6 开发