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

福利三:雨露均沾·逢7狂欢】之二:STM32F407VG串口通信乱码故障的排除

[复制链接]
wenyangzeng 发布时间:2026-7-4 15:15
一个项目需要与上位机串口通讯交换数据:,
" C( w  M, b  o# G7 {( ]$ a芯片型号:STM32F407VG,& Z. Q; C, x4 u; ^" }; K' H' K+ F$ o
系统时钟:外部晶振8MHZ,倍频到168MHZ;5 v9 V# i! O# [6 k
固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf;* g5 N- E$ T6 k7 j3 d7 y* o
编译、执行,结果发现串口发送和接收数据都是乱码;* O6 R1 I% t' _0 X9 C7 P4 H" w
故障分析:
9 `+ x, q8 o4 i( ^查阅固件库中system.stm32f4xx.c关于时钟配置:
7 y* g, g. p; L. q  E) ^3 _/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  ^; E# O2 B6 ]% M6 }3 r#define PLL_M      25
4 O( I% O$ \7 `9 ^. O* K$ D$ V: }% J8 p8 d8 s7 ]7 [) Z
可知STM32F40xxx/41xxx在固件库的默认配置:" W2 u  I( R# L% [# N3 e
HSE Frequency(Hz)  :   使用外部25MHZ晶振;
( e. _% [. @$ e: `System Clock source:  PLL (HSE),6 _: A# ]- N8 j6 P
SYSCLK                    :  168MHZ.- Q- [5 l  W( b8 j! z
PLL_M                     :25, V5 H" N  D: \
PLL_N                     :336
/ d& J- s/ r5 f6 B: U" L' V# nPLL_P                     :2
; {) U0 C# L! n2 cPLL_Q                    :7
4 [# g& {2 ?: k0 [
  v6 K( b8 x% v4 f  B由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。
  w8 C5 r: j; S& P. R& e借助STM32CubeMX,可以方便地配置系统时钟:/ E0 [' g! n) A. S; m

) B( X  X: \8 q& Z! l' T2 S& @& u根据上图配置系统时钟所需正确参数:
7 E; [- w5 K; N+ KM=4      PLL_M. X# P# {3 q, C
N=168  PLL_N
4 B) _- R, ^( t( X* \; [8 TP=2      PLL_P3 @( n. I( k! Z3 d- B
Q=4      PLL_Q
* M- @4 q  W! u1 d3 p; A0 z4 L, B" F. b7 O$ N# w# G, @2 _8 K( R7 B6 ?8 J
接下来修改固件库中相关文件:8 X9 y, \) Q, I8 `

+ A1 B' n) z9 f" {; L0 `9 }8 W修改stm32f4xx.h& N. P9 Y4 |) S7 W/ ~% t* {- q3 I
2 I8 L6 E8 r) H+ h: Y
  1. 在70行定义芯片型号:( E- |6 a' r" r" ]+ T0 d

  2. : c& [2 v9 R+ n6 A) ^. i
  3. #define STM32F40_41xxx
    8 T8 K) v* G- \% C, x3 }

  4. & y7 M. v' E; D: C" x
  5. 在144行定义晶振频率
    2 s5 a2 X( Z0 a9 h* A
  6. 0 R- x. ^3 \6 k
  7. #define HSE_VALUE    ((uint32_t)8000000)+ P6 _' F( y4 h' W! ~' j5 ]7 `

  8. 2 g- }% ^4 ^! f$ k" d
  9. 修改system_stm32f4xx.c- k+ y9 A  s% x* c% I- Q
  10. #define PLL_M     4
    8 p) I# v6 u% k: f1 z7 \! p6 f3 a
  11. #define PLL_Q      4* D2 g- Y8 x: g) q$ V- ]& x( O
  12. #define PLL_N     168
复制代码

/ i( E' B9 N6 }& @3 p- n2 a0 C, }" z2 `3 W) y

: [) B% R) V0 V; _串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。$ Y0 T% i# X& i" {9 @( S1 y
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
' Y9 f/ w! _: w: o. v- O9 z3 P
t2.png
赞 收藏 评论0 发布时间:2026-7-4 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版