STM32F407串口乱码(正点原子与野火开发版兼容性问题)

设备信息

我使用的开发板是正点原子的stm32f407探索者开发板 ,使用的固件库以及程序是从野火资料下载中心下载的,使用串口查看数据的时候,上位机接收到的数据显示总是乱码,具体如下图所示。
STM32F407串口乱码(正点原子与野火开发版兼容性问题)_第1张图片
解决方案
每一款单片机都有自己的时钟源,存在外部高速时钟(HSE)和外部低速时钟(LSE),而单片机中的系统时钟最大值为168Mhz,一般都是由外部高速时钟提供,然后经过内部锁相环吧频率升上去。
外部高速晶振如图,正点原子探索者为8M,而野火的霸天虎为25Mhz,两款时钟源不同,因此直接复制的话,会使得,内部时钟混乱。因此出现串口乱码的情况,因此改串口或者该系统时钟源都可以。
在这里我用的是配置系统时钟源,是其最后都达到168Mhz

正点原子及8M HSE开发版时钟配置
STM32F407串口乱码(正点原子与野火开发版兼容性问题)_第2张图片
野火霸天虎25MHZ开发版时钟配置
STM32F407串口乱码(正点原子与野火开发版兼容性问题)_第3张图片
可以看出二者在一些系统寄存器的配置上不都一样

解决办法
1、 PLL_M
全局搜索“#define PLL_M ”——在system_stm32f4xx.c文件中

/************************* PLL Parameters *************************************/
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8
#else /* STM32F411xE */
#if defined (USE_HSE_BYPASS)
#define PLL_M      8    
#else /* STM32F411xE */   
#define PLL_M      16
#endif /* USE_HSE_BYPASS */
#endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */  

2 、HSE_VALUE
当前项目搜索“#define HSE_VALUE”——在stm32f4xx.h文件中,确保HSE_VALUE的值与板子上的晶振保持一致。如晶振是25MHz,HSE_VALUE=25000000;晶振是8MHz,HSE_VALUE=8000000。

#if defined (USE_HSE_BYPASS)     
#define HSE_BYPASS_INPUT_FREQUENCY   8000000
#endif /* USE_HSE_BYPASS */    

如果不一样的话,就不能用了
将正点原子或是野火写的system.stm32f4xx.c整个相应的替换
将正点原子或是野火写的system.stm32f4xx.c整个相应的替换
将正点原子或是野火写的system.stm32f4xx.c整个相应的替换
不要自己改,因为时钟配置很复杂,新手不要尝试自己改。

3.如果替换的话还是不行,需要改stm32f4xx.h
这是因为系统时钟配置的问题,搜索HSE_VALUE,将HSE_VALUE的值改为板子对应的值。

/**
 * @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) 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
  
#endif /* HSE_VALUE */

/**
 * @brief In the following line adjust the External High Speed oscillator (HSE) Startup 
   Timeout value 
   */

将25000000改为8000000即可,这次就可以用了
亲测有效,谢谢支持

你可能感兴趣的:(stm32,stm32,ide,mcu,单片机,嵌入式实时数据库)