【 问题】移植其他平台的STM32F401的样例,编译烧录后发现串口输出到电脑全是乱码,并且PC13引脚驱动的LED闪烁太快(程序使用HAL_Delay函数1S闪一次,但实际上差不多0.5S就闪一次)。
【定位思路】串口乱码和系统定时函数同时出问题,初步分析是时钟配置的问题。
【定位过程】 查看代码。Main()中的SystemClock_Config()函数在移植的时候已经修改过一次,现在PLL分频系数M,N,P,Q分别是25,336,4,7。(因为样例的硬件外部时钟是8MHz,而手里面的这块blackpill板子上焊的晶振是25MHz,所以把M的值从8改成了25。系统内部25MHz×336÷25÷4=84MHz)这部分代码看不出问题来。
接着分析了让时钟配置参数应用生效的HAL_RCC_ClockConfig()函数,可以看到其调用了HAL_RCC_GetSysClockFreq()。而HAL_RCC_GetSysClockFreq()的代码中又使用了HSE_VALUE宏定义。查看HSE_VALUE的宏定义还是8000000。终于找到问题,直接修改HSE_VALUE宏定义为25000000。重新烧录后,发现问题依旧!?这是肿么肥事?
全项目搜索HSE_VALUE,果然有2处宏定义,分别在system_stm32f4xx.c和stm32f4xx_hal_conf.h中。如果只修改system_stm32f4xx.c中的HSE_VALUE,只影响SystemCoreClockUpdate()函数。而HAL库函数引用的来自stm32f4xx_hal_conf.h中的HSE_VALUE值。
小结一下:HSE_VALUE
=> HAL_RCC_GetSysClockFreq()
=>HAL_RCC_ClockConfig()
=>SystemClock_Config()
【解决方案】所以最好2个文件中的HSE_VALUE宏定义都修改成25000000就OK了。再次编译烧录后,问题解决!