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

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

[复制链接]
wenyangzeng 发布时间:2017-12-2 21:49
本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑 * w  T, z! V6 ?1 p
" A9 {: A5 u) ^9 A
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除
  m) g! f  g# E& d
. a+ I; y7 K: [! U- s    芯片型号:  STM32F407VG,与上位机串口通讯交换数据:
4 F9 V! x, G  d! [3 @    系统时钟:外部晶振8MHZ,倍频到168MHZ;8 l8 Q  Y$ D1 h5 Q3 e, m# F: e
    固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;
1 J% O9 ]. l$ V7 N% h    在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;
8 D% M. j- m9 a5 c6 N# s+ X% [
" W8 \) x: _- w5 Y, X$ b故障分析:
  V9 [3 W% d8 `2 V% } 打开system.stm32f4xx.c关于时钟配置的说明:
5 ~6 a5 b- R3 O7 m; z# x
  1.     *                    Supported STM32F40xxx/41xxx devices
    " v. d4 z) E1 d  j/ U  F: V
  2.   *-----------------------------------------------------------------------------/ s+ L" n7 F& l3 X% D
  3.   *        System Clock source                    | PLL (HSE)
    * p# i" l) h4 u4 Q
  4.   *-----------------------------------------------------------------------------3 o$ O* k2 ^2 ~; }4 n
  5.   *        SYSCLK(Hz)                          | 168000000
    . @3 i# J9 `( H
  6.   *-----------------------------------------------------------------------------
    2 }/ d( R0 i3 U# L- x
  7.   *        HCLK(Hz)                           | 168000000
    ) U' B+ E$ O- w5 S) i2 F- z; N2 x
  8.   *-----------------------------------------------------------------------------
    % `! V2 F4 T" s1 f9 w* l+ K" j
  9.   *        AHB Prescaler                        | 1
    4 x9 |5 @6 T. L* S
  10.   *-----------------------------------------------------------------------------) b# ?& r5 E0 P
  11.   *        APB1 Prescaler                        | 4
    : h/ t( ]3 Y. V
  12.   *-----------------------------------------------------------------------------, ?) ~" u/ ?4 T: e" h
  13.   *        APB2 Prescaler                        | 2
    . b# S+ s3 ?) L
  14.   *-----------------------------------------------------------------------------
    * p7 K+ m  P' B7 P; a& E4 F2 J; t, F
  15.   *        HSE Frequency(Hz)                       | 25000000- L7 V( G/ E, O9 h5 X( I, i
  16.   *-----------------------------------------------------------------------------
    1 G4 p& c! i8 o. h# z
  17.   *        PLL_M                              | 25
    , ~' H3 F0 k4 D) M8 w
  18.   *-----------------------------------------------------------------------------! j1 {: t: l( ~* S* q; n
  19.   *        PLL_N                              | 336
    $ X+ D4 ~9 h# q
  20.   *-----------------------------------------------------------------------------4 H9 M) W1 c$ k5 u& v/ ^- _
  21.   *        PLL_P                              | 27 U- K) E% Z# @; i( g" ?
  22.   *-----------------------------------------------------------------------------/ h- t( |, s( S3 ~
  23.   *        PLL_Q                              | 7
    . P; N8 \3 o* ?9 t/ u+ q. d
  24.   *-----------------------------------------------------------------------------
复制代码
从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:& m4 u' {/ V$ V+ H

4 ]9 [3 P: ]1 s" }" U# WHSE Frequency(Hz)  :   使用外部25MHZ晶振;' l1 d& C* H) h
System Clock source:  PLL (HSE), 5 X  ~' @2 ]7 ]2 s
SYSCLK                    :  168MHZ.
/ C7 P# h3 {8 I% s$ ]0 ePLL_M                     :25
1 G) a8 i' A  g6 w, {PLL_N                     :336. _6 ?! W. J: J
PLL_P                     :2
' C5 M3 n$ ^) d3 B3 e, oPLL_Q                    :7- ~! O* p5 D" {, o* N( p, V
      由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。$ J( [! H3 W. g/ ^; y
解决方法:
+ h0 O: P& L% c, b  v0 n7 A借助STM32CubeMX,可以方便地配置系统时钟:% [: v. d6 r3 c
' c; V* y, H0 |$ [6 T- X5 W
无标题1.png
% Z% Z! R5 t* L- d5 p% e  T
+ @- V7 k* b9 _9 J" g8 d) p, n+ g+ n0 o根据上图配置系统时钟所需正确参数:
5 C' m  T3 i2 z$ l! oM=4     ( PLL_M)
& n1 Q: `, O) k; [; o' wN=168  (PLL_N)
5 J! g3 z; M' S' L" c3 I$ uP=2      (PLL_P)
; K& c7 u- e5 |/ HQ=4      (PLL_Q)
+ _- u3 p+ T' f. _3 }/ ^! M0 A, Z
9 E1 o" Q4 k/ M( C% ^& |$ \3 N; d$ R接下来修改相关文件:. L0 r  F1 n. @" S* a6 B% H
1、在stm32f4xx.h的70行定义芯片型号:
+ K3 {. a, \4 P. L3 O1 F% h8 W' L2 Z' y8 I+ Y
  1. #define STM32F40_41xxx
复制代码

* y0 C$ x* d6 i# L3 u: U5 E1 ]/ M/ k

# a# X  a$ q% G! z+ C2、在stm32f4xx.h的144行定义晶振频率# G% V0 }8 l1 Z  V
  1. #define HSE_VALUE    ((uint32_t)8000000)
复制代码

) }3 N6 Y9 q8 ]7 X" Y5 g- Z: L0 x& S

( z2 ~* q/ ^$ z" B- s9 Z. Z3、在system_stm32f4xx.c中修改% U; G1 h, R$ Y/ V: t
371行
7 r/ V3 Z1 e! M
  1. #define PLL_M     4
复制代码

+ ^8 z/ h5 {. Z/ o' `, O& @! w. U+ d" A, ^" T
384行% A( ]2 n/ t$ z8 i" }1 M  T
  1. #define PLL_Q      4
复制代码
- E1 D9 v" R1 K) W0 B/ W) b

" E+ Y# J2 M  f+ D, |2 P# D1 ]401行( A) U' f& i, T2 H3 u: j- D) {
  1. #define PLL_N     168
复制代码

6 J: t( n: }0 e5 H" H; B9 `) M+ K8 [: r
       经过以上修改,编译运行,串口通讯工作正常。+ U- I2 D; z1 [/ @
总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。
+ H* n4 i) p9 o& V# y" `0 l
% @: |9 o+ A3 [5 T" X/ q1 ^
. |1 z2 e0 g) p1 {( B, m$ f9 c" J

评分

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