【STM32F401CCU6小系统调试案例——串口数据乱码,HAL_Delay()延时误差很大】

【 问题】移植其他平台的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了。再次编译烧录后,问题解决!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值