Ronan Blog

罗华东的博客 | 向前每多走一步,热爱和勇气就会多一分。

「platformIO」解决 stm32 标准外设库时钟不准的问题

2024-10-22 1 min read Docs Ronan

以下以stm32f407系列举例

1.遭遇问题:

在使用 platformIO 搭建标准外设库进行实际开发时遇到了外部时钟不准的问题。

2.原因分析:

这是因为 HSE 的配置有问题,platformIO 自带以及从 ST 官网下载的标准库中的 system_stm32f4xx.cPLL_Mstm32f4xx.h中的 HSE_VALUE默认值与实际开发版的外部晶振频率不一致

3.解决方法

假设当前stm32f407的板子上外部晶振是8MHz(根据自身情况不同)

1.将 platformIO 的安装目录中的 /Users//.platformio/packages/
framework-cmsis-stm32f4/Source/Templates/system_stm32f4xx.c
文件删除。

2.将解压得到的标准库的 …/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Project/
STM32F4xx_StdPeriph_Templates/system_stm32f4xx.c
文件复制到
/Users//.platformio/packages/framework-cmsis-stm32f4/
Source/Templates/
目录下。

3.打开 /Users//.platformio/packages/framework-cmsis-stm32f4/
Source/Templates/system_stm32f4xx.c
,在其中搜索到PLL_M

#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx)
 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
 #define PLL_M      25

PLL_M 后的25修改为 8

4.找到 …/STM32F4xx_DSP_StdPeriph_Lib_V1.9.0/Libraries/CMSIS/
Device/ST/STM32F4xx/Include/stm32f4xx.h
,在其中搜索HSE_VALUE,找到

#if defined(STM32F40_41xxx) || defined(STM32F427_437xx)  || defined(STM32F429_439xx) || defined(STM32F401xx) || \
    defined(STM32F410xx) || defined(STM32F411xE) || defined(STM32F469_479xx)
 #if !defined  (HSE_VALUE)
  #define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */

((uint32_t)25000000)修改为((uint32_t)8000000)并强制保存。

5.最后,还需要根据工程需要在 main函数 里对时钟进行分频,比如我使用的8分频:

//系统定时器初始化,时钟源来自HCLK,且进行8分频,
//系统定时器时钟频率=168MHz/8=21MHz
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);