|
|
由于以前是用的CUBEMX直接生成的代码,现在自己使用STM32Cube_FW_H7 V1.12.0搭建了自己的工程,在使用串口时出现乱码,花了3个小时终于排查到错误,由于没有调试设备,只能一步一步检查,
开始时以为是代码配置问题,花了点时间去重新学习了下串口,发现不是这的问题,
因为使用的AC6,重定向printf,又去寻找是否因为编译器的问题,
再后来又去排查系统时钟是否错误,先去检查了system_config(),发现GPIO的时钟又是对的,我就去看了别人的工程,再反复检查时,从HAL_UART_Init发现时钟源的选择,

在 UART_SetConfig函数内部,代码会获取当前 UART 的时钟源,随后进入一个Switch分支。如果我的的串口使用的是 APB 总线时钟,它会调用 RCC 系统的频率获取函数,

由于 V1.12.0 库中该表下标 4-7 的值被错误地写成了 0,导致 HAL_RCC_GetPCLKxFreq() 返回了一个比实际硬件频率大 2 倍的频率

这里原来的是const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};

函数里通过 HAL_RCC_GetPCLKxFreq() 获取到的 pclk 就会恢复正常,乱码也就消失了。
终于解决了,再不然真的炸掉了,以前只以为只需要注意下HSE_Value就行,hhh也终究是吃上了不知道的亏,还在解决了,后来去检索时发现STM32的论坛已经提及,但是不犯错根本晓不到这个(这个题目正常也不会去这么查找吧),至于原理请看这篇文章,力竭了Qwq
经验分享 | STM32CubeMX 生成时钟获取函数的分析 - STM32团队 ST意法半导体中文论坛
|
|