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

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

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑
3 D. }+ L; u( h/ _, ]7 g7 D3 ]$ }& n9 p; j2 {( {1 A
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除. e, F3 J& t& s) {) z8 w
  e! p' K" T* y# Y; o
    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:# P# E. l$ W1 @8 {2 q! C2 U$ k9 S
    系统时钟:外部晶振8MHZ,倍频到168MHZ;; S& a/ V+ b4 k% K2 N
    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;
' p; L; c3 {# \0 X7 s; h4 M" c    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;4 n6 w+ D  H! b! V' e

1 r; @" Y* Y  G7 o7 M4 b# T! _& D故障分析:
6 ?4 q5 H4 m2 k: Q+ @ 打开system.stm32f4xx.c关于时钟配置的说明:+ f) C7 `, H: O/ \5 ]0 L
  1.     *                    Supported STM32F40xxx/41xxx devices! r  I- R4 [8 A7 D% }4 B
  2.   *-----------------------------------------------------------------------------
    9 k  V2 S  v: I# c
  3.   *        System Clock source                    | PLL (HSE)+ T. Q& s2 [! U" o
  4.   *-----------------------------------------------------------------------------" r2 Z, N. F+ l/ g+ j" X
  5.   *        SYSCLK(Hz)                          | 1680000002 Y' G8 U6 M" H4 l$ \
  6.   *-----------------------------------------------------------------------------
    % c1 Y+ ?& M! Z4 s' y
  7.   *        HCLK(Hz)                           | 168000000
    : Z$ ?8 H0 p6 p  |
  8.   *-----------------------------------------------------------------------------
    3 [  d9 c: A. F1 L/ u: z4 }: u; R% v/ j
  9.   *        AHB Prescaler                        | 1
    * S, V8 F) m2 v; H% O4 F, _, q
  10.   *-----------------------------------------------------------------------------) g3 r8 S3 N. `' }, U) M/ u
  11.   *        APB1 Prescaler                        | 4* v/ A  y# ~$ j. O
  12.   *-----------------------------------------------------------------------------
    2 G' P# ^! U7 Y+ z9 `# }- {
  13.   *        APB2 Prescaler                        | 2' l* Z% ~5 v5 S7 y8 E
  14.   *-----------------------------------------------------------------------------
    ! p  s$ R5 O' V8 x+ |- u9 g
  15.   *        HSE Frequency(Hz)                       | 25000000
    ! H' p0 w- y0 m- v' ?
  16.   *-----------------------------------------------------------------------------
      N) t" O; j' h4 m( ^, ^
  17.   *        PLL_M                              | 25( F& C2 R+ j; v' c& R& c: V
  18.   *-----------------------------------------------------------------------------
    9 L  a+ u9 [, |$ ]( K3 R
  19.   *        PLL_N                              | 3364 s  N/ x0 c4 F3 a8 E8 v
  20.   *-----------------------------------------------------------------------------' Z1 `, H0 \( ~
  21.   *        PLL_P                              | 21 l: |. ~# k$ Z& J/ F  C9 @
  22.   *-----------------------------------------------------------------------------+ ^- P: r8 U) K; D; `9 t
  23.   *        PLL_Q                              | 7
    8 W9 O* ]7 B& |9 Z" {, u
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:7 i& F* G8 z" C) ~0 L7 z
5 {0 |) L2 f% N( A5 A
HSE Frequency(Hz)  :   使用外部25MHZ晶振;
' O$ W; P1 a% Q- V$ A" ^System Clock source:  PLL (HSE),
: F: v8 D/ |# M" l$ W% Y+ F7 t& T0 FSYSCLK                    :  168MHZ.
  C2 ~6 i& `: y0 {# HPLL_M                     :25# I: n3 [+ a& O; Y' ^, k
PLL_N                     :336
  L8 p8 h# J3 t" C( M) W0 cPLL_P                     :2
3 P7 ^$ o$ Q' n+ B3 DPLL_Q                    :7- n) e; v# d+ J7 M! o7 C0 [# L0 G  s" z
      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。# O" a& J! K. g6 a
解决方法:1 ~! G/ ~% W( D0 i; w
借助STM32CubeMX,可以方便地配置系统时钟:& r2 u; ^& v" n/ C6 u# \; a

3 q  q- U9 f- x0 h 无标题1.png
* H9 K- G3 H( ^- S# ~" k3 N0 e/ u) ^+ P% C: V3 W3 A" p  I
根据上图配置系统时钟所需正确参数:/ u/ g- a; T: m8 {! a" _9 I
M=4     ( PLL_M)
3 {' {! e0 n2 y2 T- R0 vN=168  (PLL_N)( k3 w3 O3 V& E0 e) j! c. A. X
P=2      (PLL_P)# w+ P6 m1 A" }7 P
Q=4      (PLL_Q)
+ L# M) l8 I7 ?5 k; ?0 Y7 B9 L4 P: f9 S5 ]; |! C3 G' g0 c' p- }4 `
接下来修改相关文件:
, l/ Q, u( ^9 Y! G0 q# z* T1、在stm32f4xx.h的70行定义芯片型号:3 t. R( {& U* y

! X4 G( I8 u- H5 p
  1. #define STM32F40_41xxx
复制代码

/ {- g: t2 R) _* Q" `9 m" }! j0 I# I; [. ?+ ]' L

8 I. C5 u: _: j6 O& ?. ?2、在stm32f4xx.h的144行定义晶振频率
9 a1 H& r+ o2 n4 q, e: ~: {
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码

7 Z. y$ X9 L! A) {8 M. A; }; z" t9 ?
2 t/ f, W1 e+ O8 N6 ?# P' `& J8 \/ l" h; V& t5 G1 ?
3、在system_stm32f4xx.c中修改
. I- Q# w8 |0 e$ ]$ h9 P371行% d8 U4 H$ W# D0 U$ M% n$ ^5 G
  1. #define PLL_M     4
复制代码

  k( G1 G( a. P) ^* n
( W, i* H4 k3 R- v% a( H384行2 i6 ?+ }0 J2 e
  1. #define PLL_Q      4
复制代码

. C" E" N: n( [  q& a& I0 ?6 v: |" a: x! c# Q! e) g9 [
401行5 Y$ ^- Q( I6 w. \" v- L; p
  1. #define PLL_N     168
复制代码

) M1 m* a# H" y, u
- \- H5 P' i2 R# ]  k       经过以上修改,编译运行,串口通讯工作正常。' {% q. z- L0 B+ g1 y
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
) x, K( h1 ?4 Q% O# ^3 O
" u5 U: i/ h2 T4 H  o. \3 n. j4 r& j2 M8 n- |

评分

参与人数 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版