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

STM32F407VG使用固件库进行串行通讯波特率出错故障的排除

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑 2 h8 }% @. s& h! w8 m

  P9 J, z* D5 c; ]; k STM32F407VG使用固件库进行串行通讯波特率出错故障的排除
8 b5 Q) \+ y, O8 y& q( N) _
/ C9 e1 J3 [/ B    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:5 E- Q2 _1 i  J1 p
    系统时钟:外部晶振8MHZ,倍频到168MHZ;
# ]0 c( J7 J( d- v0 K7 O& |, D    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;
( V' b& _" R5 C+ J1 r# y) {8 L    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;
' a, g! p/ l3 r" L2 r' j
7 d9 M+ G. g! \* {9 r, u- G& h故障分析:0 N+ u8 S6 s* d( T" D% }
打开system.stm32f4xx.c关于时钟配置的说明:
7 O1 v) P+ l9 v. p% }$ T& `, X
  1.     *                    Supported STM32F40xxx/41xxx devices% M  ^) Q& V; w8 j9 N! s- W5 `
  2.   *-----------------------------------------------------------------------------$ x! r( H7 d6 [$ j0 s
  3.   *        System Clock source                    | PLL (HSE): _% U& U# m; u5 j1 H
  4.   *-----------------------------------------------------------------------------* M% a* a* o2 q4 D% k! ]
  5.   *        SYSCLK(Hz)                          | 168000000; V7 `7 s& b. E( ]+ F) X) C& k
  6.   *-----------------------------------------------------------------------------
    " ~0 @4 F9 z' z5 `& z
  7.   *        HCLK(Hz)                           | 168000000
    ; F  l7 `) t5 W+ d6 k- K9 l: w
  8.   *-----------------------------------------------------------------------------  g5 ]$ ~; A5 b5 \# M7 R; Q
  9.   *        AHB Prescaler                        | 1
    - O4 |  H% |4 r$ y# J
  10.   *-----------------------------------------------------------------------------
    0 W3 y. h& ?) L! H/ ?
  11.   *        APB1 Prescaler                        | 4+ i9 K3 s  c! z( M& j
  12.   *-----------------------------------------------------------------------------* ~: f# Y' N0 g! y
  13.   *        APB2 Prescaler                        | 2
    5 |% d9 j# T1 N2 l( f. t0 l
  14.   *-----------------------------------------------------------------------------
    % ^& h0 z2 L" H* C' ]$ z1 n
  15.   *        HSE Frequency(Hz)                       | 25000000
    $ Q  W  ^. X* Q/ ^$ f5 j
  16.   *-----------------------------------------------------------------------------& T; q+ v' |6 M9 a
  17.   *        PLL_M                              | 25" ~0 r) a2 C* h* U; T; v% y. {8 N
  18.   *------------------------------------------------------------------------------ l' Z9 N' L% d% ]& Y+ ~& I* w7 R
  19.   *        PLL_N                              | 336, j2 Z* E2 {% n5 C  p% C3 a' P
  20.   *-----------------------------------------------------------------------------
    8 F4 G6 u& P) R9 b- V6 ~+ V8 m1 a
  21.   *        PLL_P                              | 2" R0 j* T6 ^2 L6 @5 R3 \; E& u
  22.   *-----------------------------------------------------------------------------: Q1 x" D8 d! b4 V( l+ P$ ~! O
  23.   *        PLL_Q                              | 7
    * {3 g* @, g. S$ ?7 f1 ?
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:
& K8 x8 S9 i0 R( f  \! {2 O  [% f/ N: @
HSE Frequency(Hz)  :   使用外部25MHZ晶振;0 C2 k2 d4 Z6 b8 i' l
System Clock source:  PLL (HSE), , O* ?; }) i- T. W) I* T$ o5 h  W
SYSCLK                    :  168MHZ.
* [5 f) d1 c- E) g! H3 E3 NPLL_M                     :25
7 s. U2 M/ N& m; RPLL_N                     :336
; w4 L2 H' X9 T/ F( C1 y$ PPLL_P                     :29 K6 [$ B0 N. D0 G) \5 o7 ^: ?) ]
PLL_Q                    :7
& d) v, B3 \% s* {" [3 A4 b4 J6 D      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。
' w; Y1 k' \0 z* E5 `解决方法:
4 k+ j( D4 P; V- F# G" x借助STM32CubeMX,可以方便地配置系统时钟:
  T) z& s: g" \9 f  k1 I9 k8 \0 }; \* A
无标题1.png
# b$ r" ~8 R  z  K% o. |- g2 w& o" A$ N
根据上图配置系统时钟所需正确参数:
; j( Z/ T( C( h; P7 m5 I  DM=4     ( PLL_M)
: ^/ `7 z# ^" ~5 X7 L  p8 {( nN=168  (PLL_N)+ k8 Q, Y0 n2 }( _& f7 M
P=2      (PLL_P)
4 O9 o& f, E: s* x. O6 K; EQ=4      (PLL_Q), {0 a; d* L; f! m1 N* e/ F

: p; \3 X; \  d: B- O% R3 T接下来修改相关文件:/ B, B; I6 x0 m! U
1、在stm32f4xx.h的70行定义芯片型号:
' \$ L, A0 K6 T5 P7 L6 Q" T! b! K9 F# c
  1. #define STM32F40_41xxx
复制代码
6 B6 `# ]& K+ [  H$ l- _9 I% ]  u

: V: b, J8 E  v) v2 _2 c# q6 ^( ~1 R' x) ]0 [* S7 e
2、在stm32f4xx.h的144行定义晶振频率
4 p3 O# Z, W( P
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码
$ l  r" S* \% m2 b; j' ^

. a  m7 ~. g5 Q+ T+ V. E2 ~6 L3 ?( F3 Y& @% X$ |6 N7 x7 {7 P
3、在system_stm32f4xx.c中修改* P9 R5 n! D2 k/ W! d
371行
0 E4 h1 o$ K7 p6 M' N' z9 f7 i
  1. #define PLL_M     4
复制代码
* S( b9 w% e0 G1 W* ?, W' U# l

( V0 {+ i  f  q) E0 U384行; d2 p$ k' l- ?1 ]$ d
  1. #define PLL_Q      4
复制代码

# F$ T5 R$ R0 t/ X+ Y
+ f* l8 Z- l9 F0 Y8 ~401行6 w6 X0 [. ^1 }% t* w
  1. #define PLL_N     168
复制代码

1 ]; ?' v0 t# E4 M: W. H! e) Z
2 T4 E0 e4 z: t       经过以上修改,编译运行,串口通讯工作正常。
5 ~: R/ J2 T- ~总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
  _$ _" l% A6 _& k3 Z7 o$ a1 F" g1 Y6 I6 N( y3 R; X6 R! V
# x- T3 M, |( q' W" c. e# s0 [

评分

参与人数 1 ST金币 +6 收起 理由
MrJiu + 6 很给力!

查看全部评分

收藏 1 评论4 发布时间:2017-12-2 21:49

举报

4个回答
MrJiu 回答时间:2017-12-4 09:14:00
不错!!!
zero99 回答时间:2017-12-4 09:19:57
谢谢大佬分享啦
wenyangzeng 回答时间:2017-12-4 10:40:14
tianqi911 回答时间:2021-12-15 10:32:39

MARK 谢谢 小白学习了。但自己的回复怎么下次找不到呢?

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