STM32
直播中

李明聪

7年用户 1137经验值
私信 关注
[问答]

如何修改STM32外部晶振的频率呢

用库函数开发STM32的时候不知道如何修改系统主频?不知道如何修改外部晶振频率?

回帖(1)

颜婷

2021-10-26 14:41:14
  STM32系列修改外部晶振以及代码的修改
  很多初学者,用库函数开发STM32的时候不知道如何修改系统主频?不知道如何修改外部晶振频率?
  这里,我们针对这两个问题,给大家做一个简单的教程。希望大家能够掌握,以后可以轻松修改主频
  8M晶振修改为12M 主频72M不变
  STM32F1的固件库,外部晶振频率的定义在stm32f10x.h里面,如下:
  [mw_shl_code=c,true]#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 */[/mw_shl_code]
  其中,HSE_VALUE就是外部晶振的频率,对通用型STM32,默认是8M,对互联型,默认是25M。
  如果我们使用12M外部晶振,那么修改HSE_VALUE 的值为:12000000,即可,代码如下:
  [mw_shl_code=c,true]#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)12000000) /*!《 Value of the External oscillator in Hz */
  #endif /* STM32F10X_CL */
  #endif /* HSE_VALUE */[/mw_shl_code]
  
  然后,还是使用72M的主频,在system_stm32f10x.c里面,有如下宏定义:
  #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
  /* #define SYSCLK_FREQ_HSE HSE_VALUE */
  #define SYSCLK_FREQ_24MHz 24000000
  #else
  /* #define SYSCLK_FREQ_HSE HSE_VALUE */
  /* #define SYSCLK_FREQ_24MHz 24000000 */
  /* #define SYSCLK_FREQ_36MHz 36000000 */
  /* #define SYSCLK_FREQ_48MHz 48000000 */
  /* #define SYSCLK_FREQ_56MHz 56000000 */
  #define SYSCLK_FREQ_72MHz 72000000
  #endif
  默认定义了:SYSCLK_FREQ_72MHz 72000000,也就是72M,所以这里不用改,但是,事实上,修改主频为72M的是通过
  SetSysClockTo72函数实现的,该函数核心代码如下:
  RCC-》CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
  RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
  RCC_CFGR_PLLMULL9);
  #else
  /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
  RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
  RCC_CFGR_PLLMULL));
  RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
  #endif /* STM32F10X_CL */
  /* Enable PLL */
  RCC-》CR |= RCC_CR_PLLON;其中,修改主频的核心代码为:
  RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
  通过RCC_CFGR_PLLMULL9将倍频系数设置为9,如果默认外部晶振是8M,那么刚好得到72M的频率。
  不过,我们修改外部晶振为12M了,所以这里得改为6,修改后代码如下:
  RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
  
  8M晶振
  
  16M晶振2分频 再倍频*9=72
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分