STM32不同外部晶振时工程的配置问题
2018-03-21 19:52
302 查看
遇到的问题:
同样的串口配置代码在一种407开发板上能正常输出,但是换到另一种407开发板上后就出现乱码,检查串口输出波形后发现,电平转换芯片没有问题,但是波特率却有问题。问题原因:
经过故障排查发现出现上述问题的原因是两种STM32F407使用的外部晶振的频率不一样,前者使用的是25MHZ的晶振,而后者却是使用的8MHZ的晶振,如果代码未经更改而直接用在后者身上,就会出现上述串口乱码的情况,而且后者的每bite位的周期就是前者的三倍左右。解决办法:
方法一:
因为 STM32F407的库文件中默认晶振值为25MHz,若外接晶振8MHz。所以:1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)处的值(改为8MHz)。此处修改影响Debug时观察到的时钟数值。
2.stm32f4xx.h默认25M外部晶振(HSE):#if !defined (HSE_VALUE) #defineHSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz25000000 */#endif /* HSE_VALUE*/
如果改为8M或其他值,需要修改此宏定义。
为了尽量保持官方固件库的完整性,可在stm32f4xx_conf.h中添加代码
#if defined (HSE_VALUE)
/* Redefine the HSE value;it's equal to 8 MHz on the STM32F4-DISCOVERY Kit*/
#undef HSE_VALUE
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
注:但PLL_M定义在system_stm32f4xx.c中的,此方法对其不可用,亲测。
3. 打开文件 "system_stm32f4xx.c" ,搜索”PLL_M",修改默认PLL_M的参数:/*************************PLL Parameters *************************************//* PLL_VCO = (HSE_VALUEor HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 25#define PLL_N 336 /* SYSCLK = PLL_VCO /PLL_P */#define PLL_P 2 /* USB OTG FS, SDIO andRNG Clock = PLL_VCO / PLLQ */#define PLL_Q 7 /******************************************************************************/
同样改为8M的话,PLL_M也应该改为8.(假设最后的时钟值不变)。
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N =
25/25*336 = 336M (8/8*336=336M)
SYSCLK = PLL_VCO / PLL_P =
336 / 2 = 168M 默认是168M时钟。
方法二:(目前找到的最好解决方法,若有更好的方法,欢迎前来交流)
1.首先需要修改"Option for target 'xxx'"中的Target -> Xtal(Mhz)处的值(改为12MHz)。此处修改影响Debug时观察到的时钟数值。2. 在"Option for target 'xxx'"中的C/C++-> Define处添加
HSE_VALUE=8000000, 宏
在这里修改HSE的值,然后依然要修改"system_stm32f4xx.c"文件中的PLL_M,否则,在115200以上波特率下,首字节字符是乱码。亲测。(修改stm32f4xx.h里面的值不是不可以,但是感觉修改里面的东西不是很好,毕竟都是库来的,以后调用的时候也不用想着这个问题。但是,现在尚未找到更好的解决办法)
3. 打开文件 "system_stm32f4xx.c" ,搜索”PLL_M",修改默认PLL_M的参数:/*************************PLL Parameters *************************************//* PLL_VCO = (HSE_VALUEor HSI_VALUE / PLL_M) * PLL_N */#define PLL_M 25#define PLL_N 336 /* SYSCLK = PLL_VCO /PLL_P */#define PLL_P 2 /* USB OTG FS, SDIO andRNG Clock = PLL_VCO / PLLQ */#define PLL_Q 7 /******************************************************************************/
相关文章推荐
- STM32 F1配置外部晶振
- stm32变更外部晶振时如何配置时钟、以及HSI的使用
- 不同晶振配置STM32 波特率
- STM32 不同型号配置 MDK 工程
- STM32:外部晶振时钟配置
- STM32时钟配置,不同晶振时需要配置的程序
- Tomcat中配置多个工程使用不同端口访问问题
- STM32系统时钟设置,采用外部有源晶振相关配置问题
- IAR下stm32使用12M外部晶振
- 【个人小结】项目公共js的配置,解决不同页面多个配置修改的问题
- 调试 ARM STM32 外部中断 遇到的一个问题
- 在一个工程中使用了不同版本的静态库的问题分析
- Android studio 工程配置相关问题-.grade
- STM32-外部中断常见问题记录
- 基于WINAVR + avr studio 4 使用外部晶振时及延时可能遇到的问题( By-炬本)
- 打开网站工程时遇到配置bower显示404的问题。
- 关于Spring Profile配置不同环境时.web.xml激活和pom.xml激活的问题
- .NET Framework 工程Target framework配置问题
- STM32 外部GPIO中断配置
- Jenkins的maven工程打包的时候指定不同环境的配置文件