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

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

[复制链接]
wenyangzeng 发布时间:2026-7-4 15:15
一个项目需要与上位机串口通讯交换数据:,
9 M* }: F4 i3 T' l  S芯片型号:STM32F407VG,' l" c7 ^, U. w# J$ ]! f
系统时钟:外部晶振8MHZ,倍频到168MHZ;* @# s" G( R& ]9 W7 _
固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples、USART\USART_Printf;
) O( D7 G& A( a$ d7 L编译、执行,结果发现串口发送和接收数据都是乱码;, Q: b; d' z$ t; x7 z' o
故障分析:$ z: I) T9 x2 I- L% w3 N1 n$ f
查阅固件库中system.stm32f4xx.c关于时钟配置:6 _$ j  B7 r. Z9 e% g) a2 O
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */9 t$ ?1 J  r, }
#define PLL_M      25, q) }" |! A* y/ K$ R6 \" _

% N3 m0 r5 P7 e" @/ W6 |# C/ P% D; r可知STM32F40xxx/41xxx在固件库的默认配置:" Z/ Z! v+ j) G# O
HSE Frequency(Hz)  :   使用外部25MHZ晶振;! X# c+ E8 V* c; k
System Clock source:  PLL (HSE),0 N& k9 ^9 q' Q2 H* q
SYSCLK                    :  168MHZ.
9 W5 Q$ m' P6 UPLL_M                     :25
& ]7 j( q0 i( P2 h) _0 IPLL_N                     :336
9 |( h4 F' E6 a) ]! X+ J+ L; ~: yPLL_P                     :2
  {& y& r# Z# I8 M" aPLL_Q                    :7- c+ O! R8 K, U

9 a! S7 o, w8 B. J) O+ {  i' x由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。2 O  _8 u( H0 k( L$ V
借助STM32CubeMX,可以方便地配置系统时钟:
" ?. c, M5 H( I# o1 Z: |" l$ Z) O& b
根据上图配置系统时钟所需正确参数:9 H3 h9 E- z8 I! f: U4 T7 f
M=4      PLL_M
& y. A6 d% I, w5 CN=168  PLL_N
% I, e; h& M% A0 p" rP=2      PLL_P
7 J2 c& d8 F. `5 m+ rQ=4      PLL_Q
9 O$ N" h' }% l1 s* q
2 ?8 d; K' J8 y7 k+ d' Q接下来修改固件库中相关文件:: h/ w' J3 M5 t  }$ k
5 Z+ W2 l, \0 o
修改stm32f4xx.h
3 F8 N" Y' y2 c/ R# Y( a- C+ d# b7 t7 V6 q
  1. 在70行定义芯片型号:6 D! p& I- [# F+ A8 z7 J- |, [

  2. + D6 }( b: Z6 F2 r
  3. #define STM32F40_41xxx
    : h* Q1 K9 X6 D+ v" ]; N/ @% k

  4. 6 @5 h; K$ K& |: z- ^+ g
  5. 在144行定义晶振频率
    - M4 J! T" z  o' p

  6. ( n0 y+ a0 J# J4 j- N
  7. #define HSE_VALUE    ((uint32_t)8000000), R- L! b3 x% Y# w" b+ h
  8. + C# V2 M: G/ h- [2 B3 z( {' }
  9. 修改system_stm32f4xx.c! M( b! [3 m8 E& y2 N
  10. #define PLL_M     4$ V0 _: i$ o6 E2 P
  11. #define PLL_Q      4& T: s& P. e1 ]! r
  12. #define PLL_N     168
复制代码

" c* Q) f3 I; ]
, X/ }1 e# }5 m: U. L/ `# [% y, b7 M5 i3 m7 @/ E+ U
串口代码请参考ST官方的,就不贴出来了。经过以上修改,编译运行,已经能够正常进行串口通讯了。' e" F" d6 R, @  C
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
8 J" s2 H5 {9 ?
t2.png
赞 收藏 评论0 发布时间:2026-7-4 15:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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