飞道的博客

解决STM32F407串口数据乱码问题

246人阅读  评论(0)

问题描述:

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

不正常的实验现象

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

解决方法:

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

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


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

正常的实验现象

原因分析:

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


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

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

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


  
  1. void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
  2. {
  3. uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
  4. /* Get SYSCLK source -------------------------------------------------------*/
  5. tmp = RCC->CFGR & RCC_CFGR_SWS;
  6. switch (tmp)
  7. {
  8. case 0x00: /* HSI used as system clock source */
  9. RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
  10. break;
  11. case 0x04: /* HSE used as system clock source */
  12. RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
  13. break;
  14. .......

 


转载:https://blog.csdn.net/qq_35629563/article/details/116792583
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场