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

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

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑
& O: u6 a+ k1 I* W; ^) A' E$ J$ }* U! ?1 k
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除; h0 |$ u) F+ l) @
) c: \  w: o, }: @& X0 ~
    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:! W3 E: `8 U' b* }
    系统时钟:外部晶振8MHZ,倍频到168MHZ;
4 f2 \4 w* ^! ~( R- C- j4 G    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;: D: i% h7 Z0 S9 {
    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;
- F% S: G* c; B3 J
( ~0 C- B; n7 X: s3 i' q故障分析:5 K; F0 i$ h( |7 w' s0 S  `
打开system.stm32f4xx.c关于时钟配置的说明:* ^. c& ^! @1 N5 J8 X6 t- z; J
  1.     *                    Supported STM32F40xxx/41xxx devices5 W& @$ M) Y, v3 P4 w
  2.   *-----------------------------------------------------------------------------5 L/ ?+ j1 [! q' X
  3.   *        System Clock source                    | PLL (HSE)+ B/ T5 r4 K4 W
  4.   *-----------------------------------------------------------------------------
    7 h8 O  h9 |/ M/ G0 u
  5.   *        SYSCLK(Hz)                          | 168000000
    " n* x8 P& G4 T& G+ D) y0 {) \4 l
  6.   *-----------------------------------------------------------------------------! `6 m7 P* ?1 F2 _
  7.   *        HCLK(Hz)                           | 168000000. ]! @$ M( o1 K5 m$ Z; o5 h
  8.   *-----------------------------------------------------------------------------" w% Z4 J. t, K- o) F' M9 [/ t5 p
  9.   *        AHB Prescaler                        | 1* x9 u3 J4 v: B& [9 g. R- d
  10.   *-----------------------------------------------------------------------------
    - J  m4 Y2 m0 ]4 y" F% f% ?
  11.   *        APB1 Prescaler                        | 4
    7 t( M+ q, S+ N' c' x& y
  12.   *-----------------------------------------------------------------------------
    5 P+ h) ]  m  O5 F6 j6 T8 A
  13.   *        APB2 Prescaler                        | 2
    5 h1 q% d  G1 }
  14.   *-----------------------------------------------------------------------------! q. ?, R' p( I3 ~* K1 C
  15.   *        HSE Frequency(Hz)                       | 25000000# B( Y: H+ C( d6 U  M
  16.   *-----------------------------------------------------------------------------& w& Y/ X( I* }: l  f& Y
  17.   *        PLL_M                              | 25
    * m9 E8 u3 N" |8 \% a5 z
  18.   *-----------------------------------------------------------------------------" A/ h! P8 @+ C( N: {  r. ]2 v/ |
  19.   *        PLL_N                              | 336
    ) U0 {2 ?6 l0 T& ~% z% Z3 q
  20.   *-----------------------------------------------------------------------------4 }+ }3 K' a8 I2 A) y
  21.   *        PLL_P                              | 2
    & |3 ~  q9 K; N
  22.   *-----------------------------------------------------------------------------
    * q% V% C' H2 j/ o4 m6 i& n1 W
  23.   *        PLL_Q                              | 7
    9 ]1 P3 ?; f3 x- M# @, W' G) P
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:! f9 C4 f4 o1 {9 a  m* U( J
! Q  q. D5 U# B6 e, [
HSE Frequency(Hz)  :   使用外部25MHZ晶振;; `- |/ y9 S: }) J5 h4 x
System Clock source:  PLL (HSE), 4 c- I% |) w, G" E+ s! B2 T
SYSCLK                    :  168MHZ.
! n' S+ c( y- VPLL_M                     :25( k0 D0 P; [1 n; r2 r9 Q4 C
PLL_N                     :336: G+ e$ I1 {+ R- C, [/ U% @) `- V: {9 R
PLL_P                     :24 d- z+ P# e3 {8 e
PLL_Q                    :7  t6 l- V& e' {/ b+ M
      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。$ i# \4 I2 ]1 v) F! S
解决方法:, t/ v: K2 b) x) M, u1 }) s
借助STM32CubeMX,可以方便地配置系统时钟:& M5 Y/ a5 c4 \# ]. n

" X/ P5 z2 g" |2 Z, x/ J7 _, N 无标题1.png
+ x& F9 E; I6 Q6 R. V; b! D5 u0 ^6 b
根据上图配置系统时钟所需正确参数:; d7 ^8 Z6 }* z
M=4     ( PLL_M)
) z' h8 @0 k5 Z) j9 KN=168  (PLL_N)
/ m# q5 u, i8 _5 ~+ i/ g! ZP=2      (PLL_P)
2 M% D) b" z4 \& L. D" X6 Z5 p9 iQ=4      (PLL_Q)
6 V/ b/ R" K3 \2 Z2 e; A/ s- f: U+ p: d% I( A: u6 x% I
接下来修改相关文件:
" S) n! j9 W( N0 Y4 `& X1、在stm32f4xx.h的70行定义芯片型号:% E6 v* P8 E" ?" V" B, V2 ?7 y
8 [0 d& m- \- u
  1. #define STM32F40_41xxx
复制代码
' K) r% @3 o7 B& |& [
) S8 F9 e6 A7 {, f" Y
1 B! P9 y6 M" M
2、在stm32f4xx.h的144行定义晶振频率7 C: |$ G5 j  A9 f$ z  O. w! p2 H
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码
# i/ z8 n3 |6 m! w; W- c; e+ _
  |6 x  a# H1 Y# Y: B' c# s2 ~* f6 W

5 i6 J- R. T7 z8 Z3、在system_stm32f4xx.c中修改
4 E; i7 R6 x$ U* x, E371行
$ E% j: w. N8 \' N
  1. #define PLL_M     4
复制代码
6 b3 k! e- r, F/ Q5 c  E

: `: A4 m* \* r1 E; n3 d384行
2 S  Z: r. g7 C! t
  1. #define PLL_Q      4
复制代码
  b" O( ]" v+ e& ^9 H# z! X% f
, W+ E" D; }, C& T% E$ x1 c
401行1 _: Q4 o$ O! p
  1. #define PLL_N     168
复制代码
7 J2 {: w9 g2 j  G

9 E8 x5 I; T  \" E0 C/ F9 s% N       经过以上修改,编译运行,串口通讯工作正常。
* ~3 t! B& x% |! E9 v# G总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。6 M5 |0 Q8 W+ q4 l) F+ k* U$ D

- f/ o7 O6 A$ |9 X+ H2 Q7 |
/ a6 h' [- E' {# g$ h8 w: [3 Y. F

评分

参与人数 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 手机版