硬汉嵌入式论坛

 找回密码
 立即注册
查看: 69|回复: 2
收起左侧

[UART] 关于STM32H7的UART乱码问题

[复制链接]

3

主题

0

回帖

9

积分

新手上路

积分
9
发表于 昨天 03:19 | 显示全部楼层 |阅读模式
由于以前是用的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意法半导体中文论坛

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121120
QQ
发表于 昨天 09:11 | 显示全部楼层
谢谢楼主分享,1.12.1已经修改这个了

123.png


回复

使用道具 举报

6

主题

165

回帖

183

积分

初级会员

积分
183
发表于 昨天 17:43 | 显示全部楼层
CubeMX 在 STM32CubeH7 Firmware Package V1.12.1 / 06-December-2024 指出已修改此问题:

Main Changes
  • General updates to fix known defects and enhancements implementation.
  • Fix wrong computed clock frequencies in HAL RCC driver.

根据 GitHub 的 system_stm32h7xx.c 的文件历史
  • 2019-12-17 首次提交 v1.6.0,分频数组是正确的
  • 2024-11-07 修订提交 v1.10.5,分频数组被错误修改
  • 2024-12-09 修订提交 v1.10.6,分频数组恢复为正确


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-24 05:55 , Processed in 0.098515 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表