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

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

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑
, G+ w! y# d) _  S. F& R* F) V( A" y% c4 Z) E/ x$ R- K0 O3 _4 q
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除2 D4 n; d; f: }  }3 E, |

" z& g, k6 l3 {3 B- U! x7 z" L    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:
+ [# u" X6 T* o9 [! j% g! S! ^" v    系统时钟:外部晶振8MHZ,倍频到168MHZ;( W' S+ O0 u# ]0 D$ _  J( Y
    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;( j* y: |5 A0 m% Z! h5 ?
    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;* }% M+ C/ x6 f/ j! C3 X: [
$ W! ~$ J1 ^9 V& \
故障分析:
# ]+ A) ~* S& |5 b  P 打开system.stm32f4xx.c关于时钟配置的说明:
8 }- f- W' N* [/ Q
  1.     *                    Supported STM32F40xxx/41xxx devices
    2 x# C' b9 w* r0 Y1 I" e, c) W) V
  2.   *-----------------------------------------------------------------------------, f' T1 x5 h1 F6 g3 W' R2 U
  3.   *        System Clock source                    | PLL (HSE)
    $ ]3 s5 k  K, q
  4.   *-----------------------------------------------------------------------------# ]2 R) X5 ~- M* q
  5.   *        SYSCLK(Hz)                          | 1680000003 q# `1 ^! l9 \  ?: h. f# D
  6.   *-----------------------------------------------------------------------------
    % b9 W! q! D/ k* l+ c( t2 F1 i
  7.   *        HCLK(Hz)                           | 168000000
    9 W$ y6 X3 r* v& m2 O* L
  8.   *-----------------------------------------------------------------------------
    & s( p  E7 M- F
  9.   *        AHB Prescaler                        | 1* [. x+ z2 @, s$ c2 A
  10.   *-----------------------------------------------------------------------------
    & I! h4 u' `: H# f
  11.   *        APB1 Prescaler                        | 48 v, M; z; ]5 D, A' Q+ Y* m
  12.   *-----------------------------------------------------------------------------
    4 |* }' C) e$ ?  f
  13.   *        APB2 Prescaler                        | 2
    ( m7 ~* t+ }8 G. v: e0 ]
  14.   *-----------------------------------------------------------------------------* }# T0 R3 z) W4 w. p2 u5 @  ?) s( h
  15.   *        HSE Frequency(Hz)                       | 25000000
    ' L6 q8 K& {4 K7 }+ u
  16.   *-----------------------------------------------------------------------------, y/ }/ V8 J5 |4 E2 P+ n
  17.   *        PLL_M                              | 25: b- O) Q+ s3 m
  18.   *-----------------------------------------------------------------------------
    ( ]( K3 u$ X9 t! L( `) h
  19.   *        PLL_N                              | 336
    7 Z5 R! Z% l+ K  M/ L/ _( ^
  20.   *-----------------------------------------------------------------------------
    # r, w9 U5 {, Z+ L! M( z
  21.   *        PLL_P                              | 24 D" B( \1 z8 A- g; X
  22.   *-----------------------------------------------------------------------------' h, Q- d4 V1 C4 _3 u" J% E+ R
  23.   *        PLL_Q                              | 7! O. C$ K- w# [) N' h0 n, S
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:
6 x/ `; O. c* o2 x/ i  w" C& K1 r7 W; q" h1 E/ _/ j8 ^" q
HSE Frequency(Hz)  :   使用外部25MHZ晶振;6 I! Y2 s: @' [0 t0 W
System Clock source:  PLL (HSE), ) }2 l6 t$ ]% o
SYSCLK                    :  168MHZ.
# U# v* }! u9 A# }' DPLL_M                     :25
: I0 K3 y  C; gPLL_N                     :336
* I$ t0 i. b! ~0 V- V5 n$ oPLL_P                     :21 p+ g$ B7 _; P# ?
PLL_Q                    :78 Q) Y0 K9 |: z9 p6 |
      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。1 V; d& e6 d4 o. e/ d
解决方法:! P- |* n; a" u6 I3 K
借助STM32CubeMX,可以方便地配置系统时钟:7 p6 M8 k1 d1 B' a! y
+ x8 ^* _! B8 f+ g3 A* L
无标题1.png   M7 }. W- y& p: \9 d3 q+ S( g

2 i7 d  y3 x% X6 U% q; K' _2 k根据上图配置系统时钟所需正确参数:" j9 |" a) S+ R& r4 F3 S# @
M=4     ( PLL_M)
5 @" C+ D' x% c! E- B, mN=168  (PLL_N)
6 D3 ]$ A; z' a$ ~* w7 f% ]P=2      (PLL_P)3 u' I6 A: l$ _+ G% h5 J
Q=4      (PLL_Q)# i) r) q* l* C( H% j

9 T# `7 v7 F1 ?0 Z5 t接下来修改相关文件:% f2 L3 e- t0 {& J0 ~+ Q4 S2 T
1、在stm32f4xx.h的70行定义芯片型号:. u) t& M5 l/ t
4 D! r2 ^4 ^) F: y* l: w- U/ x) k
  1. #define STM32F40_41xxx
复制代码

5 O# f7 v8 O7 Z% A* R2 p
0 B% Q) A7 g. W" P& F1 k- s, g6 Y4 ?. Z
2、在stm32f4xx.h的144行定义晶振频率% `4 }/ y, f% B$ e# D
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码

$ p1 m1 T5 y. r3 ]) G8 w! w
$ J/ U8 p7 `  _) U% R( v) M# Y- r) X  M; y2 P4 Q/ Y
3、在system_stm32f4xx.c中修改
+ D( D9 a" l" H% ?9 i6 v' _371行+ P3 V$ \( Q% W  X$ T  e
  1. #define PLL_M     4
复制代码
# g7 w, Q+ Y, z
  L8 Y8 C7 u6 a4 h  K& y
384行
; K) `( b4 ^' ]3 D3 Z$ A; h3 r# n
  1. #define PLL_Q      4
复制代码

8 j+ {. l* J0 H" ?& b+ @* Y7 {$ A! B# k
401行
$ N6 m4 ^1 n: m  A: M$ Z1 S
  1. #define PLL_N     168
复制代码

  [  c& [& @7 R' y, A4 _
  e$ ?; x3 |4 Q$ y# p1 u: d: L" o       经过以上修改,编译运行,串口通讯工作正常。
9 V6 c# Y" i8 ~% T/ i0 m; ?总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
7 q5 n! v3 K0 D5 J; G- P
5 a9 H& X  F* B( @! r; h/ h0 _2 F; o; x/ B3 h

评分

参与人数 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版