解决STM32F407串口数据乱码问题

问题描述:

我使用的开发板是正点原子的stm32f407探索者开发板 ,看的视频是野火的野火F407开发板-霸天虎视频-【中级篇】,使用的固件库是从野火资料下载中心下载的(问题就出在这,在做串口实验的时候,上位机接收到的数据显示总是乱码,具体如下图所示

解决STM32F407串口数据乱码问题_第1张图片 不正常的实验现象

发送的信息是:"\r\n您发送的消息为:\r\n"

解决方法:

  • 1、排除硬件问题。使用正点原子的串口例程,通信结果是正常的,因此问题一定出在软件上。

  • 2、当前项目搜索“#define PLL_M ”——在system_stm32f4xx.c文件中,确保PLL_M的值与板子上的晶振保持一致。如晶振是25MHz,PLL_M=25;晶振是8MHz,PLL_M=8。同文件中其他几个需要注意的参数宏定义是:

#define PLLM 8   //VCO输入=HSE/PLL_M=8M/8=1M,1M≤VCO输入≤2M
#define PLLN 336  //VCO倍频输出=1M*PLL_N=1M*336=336M,50≤PLLN≤432,100≤VCO倍频输出≤432.
#define PLLP 2   //PLLCLK=336M/PLL_P=336M/2=168M=SYSCLK,PLLP={2,4,6,8},SYSCLK≤168M
#define PLLQ 7   //PLL48CK=336M/PLL_Q=36M/7=48M,4≤PLL_Q≤15,PLL48CK≤48
解决STM32F407串口数据乱码问题_第2张图片 Ctrl+F
  • 3、当前项目搜索“#define HSE_VALUE”——在stm32f4xx.h文件中,确保HSE_VALUE的值与板子上的晶振保持一致。如晶振是25MHz,HSE_VALUE=25000000;晶振是8MHz,HSE_VALUE=8000000。

解决STM32F407串口数据乱码问题_第3张图片 正常的实验现象

原因分析:

  • 1、PLL_M 对系统的影响。在系统进入到main函数之前,会先进行时钟配置,具体的过程在启动文件startup_stm32f40_41xxx.s中调用SystemInit函数来完成,而SystemInit函数中又调用了SetSysClock函数来最终完成配置。在SetSysClock函数中

RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
                   (RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);

更具体的可以看野火F407开发板-霸天虎视频-【中级篇】16——RCC时钟树讲解非常详细

  • 2、HSE_VALUE对系统的影响。在串口的初始化函数USART_Init中,配置波特率的时候使用到了系统时钟,而获取系统时钟的方法是调用RCC_GetClocksFreq函数,而RCC_GetClocksFreq函数获得系统时钟的过程是

void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
  uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;

  /* Get SYSCLK source -------------------------------------------------------*/
  tmp = RCC->CFGR & RCC_CFGR_SWS;
  
  switch (tmp)
  {
    case 0x00:  /* HSI used as system clock source */
        RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
        break;
    case 0x04:  /* HSE used as system clock  source */
        RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
        break;
.......

 

你可能感兴趣的:(STM32,stm32,乱码,单片机,串口通信,usart)