问题:最近把之前stm32f103平台的工程拿到stm32f105平台编译,编译通过了,但是烧录运行时发现系统时钟慢了3倍左右。

我先上一张stm32的时钟树吧

1.通过打印SYSCLK=72MHz,PCLK1=36MHz,PCLK2=72MHz,HCLK=72MHz,ADCCLK=36MHz。系统时钟打印的都是正确的,那只有外部晶振用的不对,后来查看stm32f10x.h中有这么一段宏定义:

#if !defined  HSE_VALUE

#ifdef STM32F10X_CL

#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */

#else

#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

#endif /* STM32F10X_CL */

#endif /* HSE_VALUE */

看见没?库默认使用的是25MHz晶振,而我使用的是8MHz。

那么最简单粗暴的解决方案是我把晶振也换成25MHz,一切问题解决!

那么并没有结束,如果我使用8MHz晶振该如何呢?

1.首先要先把#define HSE_VALUE    ((uint32_t)25000000) 改为:8000000.

2.在system_stm32f10x.c中有这么一个函数

static void SetSysClockTo72(void)

{

__IO uint32_t StartUpCounter = 0, HSEStatus = 0;

............................................

#ifdef STM32F10X_CL

/* Configure PLLs ------------------------------------------------------*/

/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |

RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

..........................................

}

这其中 HSE 使用的是25MHz,所有是除以5乘以8=40MHz。

但我们使用的是8MHz,可以除以2乘以10=40MHz。

修改后:

/* Configure PLLs ------------------------------------------------------*/

/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */

/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */

RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |

RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);

RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL10 |

RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);

编译,运行,问题解决。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐