1、修改工作频率
我所使用的是STM32F407VET6的芯片,根据官方的信息,该芯片的CPU的额定频率应该是168MHz。但是由于外设上的HSE(外部高速震荡时钟) 只有8M,与官方设定的25M不同,因此我们需要在库函数中进行修改,使CPU工作频率能工作在168M。
在修改额定频率之前,我们先来看看时钟体系是怎么样的。
根据中文参考手册(P116),我们发现STM32F4xx系列拥有三种不同的时钟源来驱动系统时钟(SYSCLK),分别为HSI(内部高速震荡时钟)、HSE(外部高速震荡时钟)和PLL(锁相环回路)
如图,SYSCLK可由HSE、HSI、或PLL直接配置。PLL由HSE或HSI配置。其中PLL配置的公式如下。
未标黄的公式是用于计算USB等的,暂时不看它。
其中PLL_N(倍频因子)、PLL_M(分频因子)、和PLL_P(分频因子)。
所以,现在可以对芯片工作频率进行修正了。
时钟配置是在启动文件中的。下述是启动文件的描述
* Description : STM32F40xxx/41xxx devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the system clock and the external SRAM mounted on
;* STM324xG-EVAL board to be used as data memory (optional,
;* to be enabled by user)
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM4 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
系统时钟的配置是在 Reset_Handler 中完成的
转跳入 SystemInit 函数,在该.c文件中可看到注释中有
* 4. The default value of HSE crystal is set to 25MHz, refer to "HSE_VALUE" define
* in "stm32f4xx.h" file. When HSE is used as system clock source, directly or
* through PLL, and you are using different crystal you have to adapt the HSE
* value to your own configuration.
*
* 5. This file configures the system clock as follows:
*=============================================================================
*=============================================================================
* Supported STM32F40xxx/41xxx devices
*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* HCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* AHB Prescaler | 1
*-----------------------------------------------------------------------------
* APB1 Prescaler | 4
*-----------------------------------------------------------------------------
* APB2 Prescaler | 2
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) | 25000000
*-----------------------------------------------------------------------------
* PLL_M | 25
*-----------------------------------------------------------------------------
* PLL_N | 336
*-----------------------------------------------------------------------------
* PLL_P | 2
*-----------------------------------------------------------------------------
转跳HSE_VALUE,修改25M为8M;同时转跳PLL_M,修改25为8。就完成了。
2、切换时钟源
在转跳入 SystemInit函数后,我们阅读其函数,发现了内部的配置时钟源的函数。
转跳进入 SetSysClock 函数。再阅读其内容。发现其配置使用时钟源的语句
RCC->CFGR |= RCC_CFGR_SW_PLL;
为选择时钟源的语句,其中其他语句
3、小结
时钟的配置是在启动文件中就进行的,其参数的描述在 SystemInit 函数的.c文件头部注释中。