STM32F103外部晶振8MHZ改为16MHz的使用
目录
前言
最近使用别人的电路板编写软件,烧录程序后发现一直无法跑起来,一旦进行了时钟的初始化操作整个程序直接跑飞,估计肯定是时钟的问题。发现电路板采用16M的晶振而之前一直使用8M,将程序晶振程序修改为16M后就可以正常的运行了一、修改标准函数库的方法
标准函数库目前已经不是主流了,但是有些老的项目移植会用
函数库的.h文件只要将.C下展开就可以找到
1、stm32f10x.h修改HSE_VALUE
将原来的HSE_VALUE值修改为
#define HSE_VALUE ((uint32_t)16000000)
2 、system stm32f10x.c的SetSysClockTo72()函数修改
注意这里是.C文件,16MHz需要先2分频,修改为
3、不同晶振的统一配置的方式
在之上的修改位置更改为以下代码
在.h文件加入以下宏配置
// <h> 晶振源配置
// <8000000=> 8MHz外部晶振
// <12000000=> 12MHz外部晶振
// <16000000=> 16MHz外部晶振
#ifndef EXT_OSC_SOURCE
#define EXT_OSC_SOURCE 16000000
#endif
修改stm32f10x.h中的内容,如下
#define HSE_VALUE ((uint32_t)EXT_OSC_SOURCE) /*!< Value of the External oscillator in Hz */
修改system stm32f10x.c中的内容,如下
#if EXT_OSC_SOURCE == 8000000
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);
#elif EXT_OSC_SOURCE == 12000000
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_PLLMULL6);
#elif EXT_OSC_SOURCE == 16000000
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#else
#warning please select a crystal source
#endif
4 、时间晶振修改
用到了RCC晶振的触发时间也需要修改
5、修改Target内晶振参数为16
二、修改Hal函数库的方法
当然可以直接通过CubeMX的时钟配置页面直接修改。1.stm32f4xx_hal_conf.h修改HSE_VALUE
将原来的HSE_VALUE值修改为
#define HSE_VALUE 16000000U
2、修改main.c中的PLLM值为对应晶振的频率
我这里使用正点原子的函数,可以看到用的是x9,我们用16Mz只需要使用x4
修改后
这里是直接调用函数大致的调整了下,需要非常精确需要在HAL_RCC_OscConfig中设置参数
小记:
其他型号的stm芯片基本都是这样修改晶振的,也提醒了我在写程序前要检查下硬件的外部晶振,不一定是自己平时习惯的硬件。