你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

经验分享 | STM32CubeMX 生成时钟获取函数的分析

[复制链接]
STMCU小助手 发布时间:2025-7-30 16:49
$ }& Y2 r: W( v' q( b& C

& |& i9 i  |& k9 A% K1 S1. 问题/ K1 y' E* W% z  N. z: H5 {0 C
STM32CubeMX 升级到了 V6.13.0 ,与此同时 STM32Cube_FW_H7 也升级到了 V1.12.0 ,在时钟获取数组的定义中出现了问题,造成的问题现象是串口输出内容乱码,经过和 V6.12.1+ STM32Cube_FW_H7_V1.11.2 生成的代码对比,发现是时钟获取函数的数组出现的问题,修改之后即可正常。
, O! I1 L7 U1 Y# g; R: Q1 A$ \- q& i  s7 a3 D  T8 y8 q6 k
4 W. v3 q! [0 Q& x$ K+ H
2. 如何复现
0 s3 Z! y0 s1 L7 r在 ST 官网上下载 STM32CubeMX 6.13.0 链接:Here,选择器件型号为 STM32H743ZIT6,使能 USART3 这个外设,选择使用 STM32Cube_FW_H7_V1.12.0 库来生成代码之后,串口打印出来的内容就是乱码。6 M- a+ I& q0 r9 l& q4 l, @
2 V5 d8 _& Y( v: \6 h" J- G: g

* f' j; Q  u8 h" P" V时钟配置如下图 1 所示。
6 u$ S* D1 d+ ~, `4 L# F
14.png
图1. 默认时钟配置
8 B( d* L  l7 j. e
2.1. 代码分析
% r' p; ^" t" w" A# Y首先,让我们看一下,不同的版本在生成代码中的主要区别,主要是 D1CorePrescTable 这个数组的内容有变化。
" v9 U) H  W6 @0 t0 r/ U; q
15.png
图2. 生成代码对比

# y* B" I' A9 K" D' V+ c
* d! _9 \, E2 e2 N
由上图可见,数组 D1CorePrescTable 的【4 : 7】内容由原来的{1,2,3,4}变成了 {0,0,0,0},那么这个数组是做什么用的,又为什么会对串口有影响呢?让我们来分析一下代码。" L2 j' w/ b# l5 G! ~+ N

9 z' a+ e6 \6 A7 A" u5 o

  Y* D2 e6 C, U5 u8 ~. `在串口初始化中有如下调用关系:
+ r8 J) @+ U; \4 T9 m2 z- U% k' w5 R9 _$ C. _6 O
! q$ `% B# N2 h& X
MX_USART3_UART_Init()àHAL_UART_Init()àUART_SetConfig()àHAL_RCC_GetPCLK1Freq()5 Q: w5 @5 I0 f. @/ v- @; n" O+ W- I
16.png
图3. 代码内容
( Q7 }2 O: Z. o% S- F) Y) x$ g

6 ?1 [7 ^7 e$ [! \) q( t由图 3 中的代码,我们可以看到,这里引用了 D1CorePrescTable 的内容,这里是如何引用的呢?其实是比较巧妙的。  A! |; _5 B0 S8 M8 L+ f) Z
5 e6 b1 A5 T$ {4 f6 v/ j
+ [, {' \9 h/ t8 x
我们首先看寄存器中是如何配置的。
  D4 [: x; i) P$ M3 e& s  A
17.png
图4. 寄存器描述
' }' M( {6 W4 P5 Z
" q/ m& s5 m3 g8 z1 l
寄存器中的 D2PPRE1[2:0]是配置 D2 域中 APB1 的分频系数,默认是 0xx,表示不分频;100 是 1/2 分频;101 是 1/4 分频 ; 以此类推。
# ?0 b! J! `9 N& U. l/ `# i( N% B8 I- {, q% y, E; u

2 \* |2 q9 ~" B* n在整个时钟树中的位置如图 5 所示
/ F4 x4 `% ~1 {
18.png
图5. 寄存器在时钟树中位置

' c; ?' R0 E+ @& i" |. e5 Z

9 K8 N/ b" M% f: F* G% l回到代码,我们单独截取其中一句话。
8 w9 H8 U$ V$ }! W( G# @
19.png
图6. 代码详细内容
) E4 f) B% [2 G  _

0 L3 H$ U! E5 `. U0 ^其中的数值定义如图 7 所示: h! Y' w/ W" e9 {' p! `
20.png
图7. 代码定义内容
  n5 T, ]) P* p" x3 Q
4 v7 I: l7 }) M7 `9 `
这个地方通过读取寄存器(RCC->D2CFGR 中的 D2PPRE1)的配置,就能得到 APB1总线上的时钟分频参数,其先通过函数 HAL_RCC_GetHCLKFreq()得到系统时钟的频率,再将其进行右移操作(右移 1 位代表除以 2)。具体右移多少位就是通过查找 D1CorePrescTable 这个表来决定的。
+ e0 k7 l, t0 L  {! ~" _/ i+ R
) ]4 X( N2 ]1 _
) O4 N& Q5 D! h$ L3 W
比如,这里如果是 1/2 分频,那么 RCC->D2CFGR & RCC_D2CFGR_D2PPRE1) >> RCC_D2CFGR_D2PPRE1_Pos 得到的结果就是 0b100,再和 0x1FU 进行“与操作”得到也是 0b100,即十进制的 4。通过正确的 D1CorePrescTable 表格,即可得到 D1CorePrescTable【4】=1,(注意数组是从 0 开始的)那么就是系统时钟进行右移 1 位的操作,得到除以 2 的效果。
" R0 ]4 x2 d+ Z( ]7 K$ T8 j9 O, ~( s
2 K4 _8 N8 ]; h7 Y
9 d+ o6 u. B- @; ~8 n9 j
正确数组:const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
+ S2 r6 l  j5 y# }4 q8 y2 r$ K$ ^5 u. P) \- ~* J8 p' u+ ^9 e

% ^/ ~8 K  Z/ K: h错误数组:const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
( k: V1 L- F. l  H
+ l7 `8 F; k7 [3 u
& @) Q( h4 D% }6 K
但是如果是错误的数组,查到的就是 D1CorePrescTable【4】=0,这是不需要右移的,就是没有经过 1/2 分频,显然是不对正确的。$ K- s6 N5 M; O: R: d

2 N  l7 x; u- m# P$ m2 e
, O. r8 p/ ^* x
这里还有个小问题:如果在 APB1 的时钟是没有经过分频的,那么 RCC->D2CFGR & RCC_D2CFGR_D2PPRE1) >> RCC_D2CFGR_D2PPRE1_Pos 得到的结果就总是小于 4 的(即 0xx,具体参见图 4),查表得到的结果就都是 0,也是没有问题的。但是1/2,1/4,1/8,1/16 这些分频系数都会出现计算错误,所以正确的方式就是手动修改这个参数即可解决问题。9 Y" k5 x6 w8 ?2 g( c

; ~# A( V) C/ V  o2 W

9 |6 D/ U+ ]5 [6 n3. 解决问题- G4 I0 o, g0 b# u
手动修改 system_stm32h7xx.c 中的数组 D1CorePrescTable 中的【4 :7】中数据即可。( s3 O5 E2 m$ p* p

5 @4 K; F6 \$ ^/ Y/ S
4 `9 \7 J8 G9 _! G1 a+ r/ [
正确:const uint8_t D1CorePrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};: l/ F6 |6 ]* w# S

# Q: i, E/ g% z6 u5 h" y' {) p
6 C6 \; K1 ]( A# g% h% z
同时,提交 bugzilla :197431 (此号码为 ST 内部使用,外部用户无法访问)。' ?7 I% S# D) I9 k4 i$ ^( f4 x
) c: ~. F5 a: v
7 h1 G% E, `8 j; b, A
4. 小结
3 m0 L2 D  s/ `7 _+ J, R这个问题,主要是来自时钟计算所需要的表格出错,造成串口波特率计算出来的结果错误。本文简要分析了数组在查表的方式进行的对应运算关系,并对错误范围做出了解释,未来遇到类似的问题都可以使用此方式进行分析。' L' Z3 w% N' k3 u
————————————————0 D& L# k0 @$ b! V* t

1 @( \- W$ z5 n, W& ?
5 {8 C/ f3 f6 t; y% n- V
                            ( _) _* `) y  e* W
5 z7 I0 Z" R$ d) U) {
收藏 评论0 发布时间:2025-7-30 16:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版