本帖最后由 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- * Supported STM32F40xxx/41xxx devices
2 x# C' b9 w* r0 Y1 I" e, c) W) V - *-----------------------------------------------------------------------------, f' T1 x5 h1 F6 g3 W' R2 U
- * System Clock source | PLL (HSE)
$ ]3 s5 k K, q - *-----------------------------------------------------------------------------# ]2 R) X5 ~- M* q
- * SYSCLK(Hz) | 1680000003 q# `1 ^! l9 \ ?: h. f# D
- *-----------------------------------------------------------------------------
% b9 W! q! D/ k* l+ c( t2 F1 i - * HCLK(Hz) | 168000000
9 W$ y6 X3 r* v& m2 O* L - *-----------------------------------------------------------------------------
& s( p E7 M- F - * AHB Prescaler | 1* [. x+ z2 @, s$ c2 A
- *-----------------------------------------------------------------------------
& I! h4 u' `: H# f - * APB1 Prescaler | 48 v, M; z; ]5 D, A' Q+ Y* m
- *-----------------------------------------------------------------------------
4 |* }' C) e$ ? f - * APB2 Prescaler | 2
( m7 ~* t+ }8 G. v: e0 ] - *-----------------------------------------------------------------------------* }# T0 R3 z) W4 w. p2 u5 @ ?) s( h
- * HSE Frequency(Hz) | 25000000
' L6 q8 K& {4 K7 }+ u - *-----------------------------------------------------------------------------, y/ }/ V8 J5 |4 E2 P+ n
- * PLL_M | 25: b- O) Q+ s3 m
- *-----------------------------------------------------------------------------
( ]( K3 u$ X9 t! L( `) h - * PLL_N | 336
7 Z5 R! Z% l+ K M/ L/ _( ^ - *-----------------------------------------------------------------------------
# r, w9 U5 {, Z+ L! M( z - * PLL_P | 24 D" B( \1 z8 A- g; X
- *-----------------------------------------------------------------------------' h, Q- d4 V1 C4 _3 u" J% E+ R
- * PLL_Q | 7! O. C$ K- w# [) N' h0 n, S
- *-----------------------------------------------------------------------------
复制代码 从说明中可知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
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
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
- #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
# g7 w, Q+ Y, z
L8 Y8 C7 u6 a4 h K& y
384行
; K) `( b4 ^' ]3 D3 Z$ A; h3 r# n
8 j+ {. l* J0 H" ?& b+ @* Y7 {$ A! B# k
401行
$ N6 m4 ^1 n: m A: M$ Z1 S
[ 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
|
MARK 谢谢 小白学习了。但自己的回复怎么下次找不到呢?