问题描述:
我使用的开发板是正点原子的stm32f407探索者开发板 ,看的视频是野火的野火F407开发板-霸天虎视频-【中级篇】,使用的固件库是从野火资料下载中心下载的(问题就出在这),在做串口实验的时候,上位机接收到的数据显示总是乱码,具体如下图所示
发送的信息是:"\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
-
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函数中
-
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;
-
.......
转载:https://blog.csdn.net/qq_35629563/article/details/116792583
查看评论