请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑 ) q2 F# r- ]5 `# f; Z4 R
% a; J2 a1 K8 `: b1 Q; P
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除
0 u( {" V; b  P" L, y0 {" h
! l) g4 M7 m% @5 e    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:5 q% J3 A, c8 ?! `# U. `( F
    系统时钟:外部晶振8MHZ,倍频到168MHZ;
' d" t# i" _. B  y8 l: S" E    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;3 Z4 |: q, ]9 m4 d
    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;# ]& t- m# Z; h

' }& K5 u/ m. e9 C故障分析:
/ y, C1 k$ g$ m& U( Y+ y& n2 V9 _/ { 打开system.stm32f4xx.c关于时钟配置的说明:# N4 n4 b. S% @" e
  1.     *                    Supported STM32F40xxx/41xxx devices
    ! i3 [* m) x$ ?6 l
  2.   *-----------------------------------------------------------------------------3 S5 _7 K; c+ \9 N% z. }$ A
  3.   *        System Clock source                    | PLL (HSE)
      l6 `8 K+ C& Q
  4.   *-----------------------------------------------------------------------------* v: _7 @  K$ c- m* }6 r- a. N
  5.   *        SYSCLK(Hz)                          | 168000000
    0 v& H9 L1 C" Q& j/ c0 J8 P" S
  6.   *-----------------------------------------------------------------------------+ a+ ^. S9 O4 ^  E2 ^
  7.   *        HCLK(Hz)                           | 168000000
    ( ?: H. Z, u$ n" e  j) b) d
  8.   *-----------------------------------------------------------------------------
    3 N: D- i! q& \0 D- B' V) H1 v2 c$ T
  9.   *        AHB Prescaler                        | 1; a& Z) F, }( @- J, `7 p& H) p& n: S1 q, o
  10.   *-----------------------------------------------------------------------------
    1 W$ B5 S7 |+ y  ~2 r5 {8 B9 w
  11.   *        APB1 Prescaler                        | 4
    , C. ~9 R4 n3 j3 H! }' K/ M
  12.   *-----------------------------------------------------------------------------
    ' N; ]% t, g/ c- L
  13.   *        APB2 Prescaler                        | 2
    " x: [7 Z$ f/ F3 r
  14.   *-----------------------------------------------------------------------------
    ! E$ K+ W( k7 |5 |0 y0 Z
  15.   *        HSE Frequency(Hz)                       | 250000000 s0 y# i+ f5 v; W. p
  16.   *-----------------------------------------------------------------------------  V) J9 e, s/ g) m
  17.   *        PLL_M                              | 25- j2 j2 @$ \* @; \1 F
  18.   *-----------------------------------------------------------------------------2 ^5 u* z1 ^, k1 W
  19.   *        PLL_N                              | 336
    ; b0 n. O4 r/ j2 r1 l
  20.   *-----------------------------------------------------------------------------1 c# O3 ]9 Q0 h2 @
  21.   *        PLL_P                              | 2# i) c' B' n/ d; y! r
  22.   *-----------------------------------------------------------------------------9 R# S( G! B; w" P
  23.   *        PLL_Q                              | 75 L, M  r5 L$ C2 h5 I" B3 l
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:
+ y) m1 X. b6 P! {( C  h
. B! o3 d6 ^3 ^0 |$ B5 CHSE Frequency(Hz)  :   使用外部25MHZ晶振;
% c( |: v) j( LSystem Clock source:  PLL (HSE), ) J0 s" P2 `6 q9 L
SYSCLK                    :  168MHZ.. H" C1 o: i$ n" I
PLL_M                     :25
$ N) h% O$ t: v; MPLL_N                     :336& \" n2 \7 Y1 b8 i
PLL_P                     :2" o8 c( |% B* w, E
PLL_Q                    :76 e: T7 i0 x% i
      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。- Y: j. |0 Y$ \/ Q% T, V
解决方法:
$ `5 }# T5 ~6 ^( s借助STM32CubeMX,可以方便地配置系统时钟:: V5 `& G2 t% s' g1 F& j2 `
4 m9 D# f6 w0 d) H+ @; \
无标题1.png
; v, H  G' [$ n8 }9 X: q4 f  V! q1 E6 h  e0 M
根据上图配置系统时钟所需正确参数:
3 Z' M; K$ ?9 |0 i# J/ t0 h$ O+ [5 o0 [M=4     ( PLL_M)! K- V: e' i* P  H
N=168  (PLL_N)( k, S5 J+ K7 Z( K0 H' w
P=2      (PLL_P)7 M& a5 }; J$ }; A5 q4 @/ A
Q=4      (PLL_Q)
* |: n4 _4 s/ \. h& k: h+ b' g* m
接下来修改相关文件:9 @* T; m% w' L. f  ~
1、在stm32f4xx.h的70行定义芯片型号:! k' B) ?8 |9 Q2 \
* U" [( _; \0 j7 m  r- X- v
  1. #define STM32F40_41xxx
复制代码

: H2 p' g; y* }, u5 \; \
- v. ]2 q; O" ?- E
% `: W- {8 ?, _* f, o2、在stm32f4xx.h的144行定义晶振频率
2 h) Y+ D6 s4 G: ^# \
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码

( G4 t3 g# H$ q* J+ \8 d0 }$ e' ]. |/ ]" }' @2 T8 K5 B' G. Z

( L# N7 U# X9 L& i- u, `' g3、在system_stm32f4xx.c中修改+ O  Q5 T5 M. ~. j8 Y2 d, f
371行( E# W$ R) ~2 ]9 K7 m9 L6 K
  1. #define PLL_M     4
复制代码
; @- }% o9 W( N# Y/ S$ n. r: ?

  q  [) n" ^( L: Z( y$ j8 \. H$ F9 X384行
# L& Z" V7 o; D% D
  1. #define PLL_Q      4
复制代码
8 c5 @, {; e# G5 v: {8 E$ g
3 `* C, b: q; R4 h9 j( g
401行
! M8 h2 M3 T% h' D" a" |
  1. #define PLL_N     168
复制代码

. K& `( O5 n. Q, n7 w# j  }% m" _% ^. `+ {1 U4 o8 G
       经过以上修改,编译运行,串口通讯工作正常。5 O4 R* K7 M- n
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。) h, b' ]( U8 Y1 q- L

# g) W7 Q7 @2 j8 p+ `7 q; w% l: A/ U% y. f* d: {

评分

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