我们常用的STM32F10x系列单片机外部晶振频率默认指定成了8M,如果外部电路发生修改,外部晶振发生了变化,会导致系统主频变化,串口输出乱码。
外部晶振频率定义在库头文件:stm32f10x.h中:
/** * @brief In the following line adjust the value of External High Speed oscillator (HSE) used in your application Tip: To avoid modifying this file each time you need to use different HSE, you can define the HSE value in your toolchain compiler preprocessor. */ #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 */
HSE_VALUE就是外部晶振的频率,我们可以看到代码中定义了两种频率:25M和8M,默认情况下使用的是8M。注释里说如果不想修改代码,也可以在编译宏定义中定义HSE的值。当然直接修改头文件也可以:
修改方法,比如要修改成12M:
1.修改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 */ #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ #endif /* STM32F10X_CL */ #endif /* HSE_VALUE */
2.为保证系统主频还是72M,还要改system_stm32f10x.c里的SetSysClockTo72()函数:
/* 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);
通过注释可以看到72M是通过HSE*9得到,现在HSE成了12,PLLNUM只需要6就可以到72M:
/* 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); /* PLL configuration: PLLCLK = HSE * 6 = 72 MHz */ RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6);
重新编译运行,串口输出正常。
相关推荐
关于STM32调试HAL库时钟不准而引发USART波特率和Systick走的不准的原因可能性之一,博主认为这可能是解决办法之一,便将此文档上传,以后有需要查看,或者其它人遇到此问题可以查看。
STM32学习笔记STM32学习笔记STM32学习笔记STM32学习笔记STM32学习笔记STM32学习笔记
此工具是意法半导体之前发布的配置STM32F4XX系统时钟的小工具,通过该工具可以轻松的配置内外部晶振。该工具并不是STM32CuBeMx,他生成的文件是标准库的形式。
stm32f107配置使用16M外部晶振方法,只需要修改stm32f10x.h文件和system_stm32f10x.c文件
STM32调试笔记STM32调试笔记STM32调试笔记STM32调试笔记STM32调试笔记STM32调试笔记STM32调试笔记
STM32学习笔记
单片机STM32学习笔记.docx单片机STM32学习笔记.docx单片机STM32学习笔记.docx单片机STM32学习笔记.docx单片机STM32学习笔记.docx单片机STM32学习笔记.docx
STM32学习笔记.pdfSTM32学习笔记.pdf
[STM32自学笔记].蒙博宇
一个菜鸟的STM32寄存器学习笔记4_外部中断收集.pdf
stm32自学教程。适合开发者,学生,单片机爱好者
STM32学习笔记额
以STM32CubeMX为依托,基于HAL库的STM32学习笔记之GPIO开发基础,使用STM32F103ZET6开发板,实现对IO口的控制
学习总结,stm32平台单片机开发,外设学习的总结
资源名称:STM32自学笔记内容简介:《STM32自学笔记》以新颖的思路、简单的逻辑、简洁的语言来阐述作者初遇STM32以来的种种认识,书中多处内容都是由作者从STM32初学时的实践中总结而来。《STM32自学笔记》主要介绍...
STM32学习笔记之SD卡V2.0协议初始化
《STM32自学笔记》随书共享资料
单片机PWM波频率调整,用于STM32,PWM波形调整有多重方法,这里基于库函数为大家讲解