本帖最后由 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
- * Supported STM32F40xxx/41xxx devices! r I- R4 [8 A7 D% }4 B
- *-----------------------------------------------------------------------------
9 k V2 S v: I# c - * System Clock source | PLL (HSE)+ T. Q& s2 [! U" o
- *-----------------------------------------------------------------------------" r2 Z, N. F+ l/ g+ j" X
- * SYSCLK(Hz) | 1680000002 Y' G8 U6 M" H4 l$ \
- *-----------------------------------------------------------------------------
% c1 Y+ ?& M! Z4 s' y - * HCLK(Hz) | 168000000
: Z$ ?8 H0 p6 p | - *-----------------------------------------------------------------------------
3 [ d9 c: A. F1 L/ u: z4 }: u; R% v/ j - * AHB Prescaler | 1
* S, V8 F) m2 v; H% O4 F, _, q - *-----------------------------------------------------------------------------) g3 r8 S3 N. `' }, U) M/ u
- * APB1 Prescaler | 4* v/ A y# ~$ j. O
- *-----------------------------------------------------------------------------
2 G' P# ^! U7 Y+ z9 `# }- { - * APB2 Prescaler | 2' l* Z% ~5 v5 S7 y8 E
- *-----------------------------------------------------------------------------
! p s$ R5 O' V8 x+ |- u9 g - * HSE Frequency(Hz) | 25000000
! H' p0 w- y0 m- v' ? - *-----------------------------------------------------------------------------
N) t" O; j' h4 m( ^, ^ - * PLL_M | 25( F& C2 R+ j; v' c& R& c: V
- *-----------------------------------------------------------------------------
9 L a+ u9 [, |$ ]( K3 R - * PLL_N | 3364 s N/ x0 c4 F3 a8 E8 v
- *-----------------------------------------------------------------------------' Z1 `, H0 \( ~
- * PLL_P | 21 l: |. ~# k$ Z& J/ F C9 @
- *-----------------------------------------------------------------------------+ ^- P: r8 U) K; D; `9 t
- * PLL_Q | 7
8 W9 O* ]7 B& |9 Z" {, u - *-----------------------------------------------------------------------------
复制代码 从说明中可知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
* 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
/ {- 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: ~: {- #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
k( G1 G( a. P) ^* n
( W, i* H4 k3 R- v% a( H384行2 i6 ?+ }0 J2 e
. C" E" N: n( [ q& a& I0 ?6 v: |" a: x! c# Q! e) g9 [
401行5 Y$ ^- Q( I6 w. \" v- L; p
) 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- |
|
MARK 谢谢 小白学习了。但自己的回复怎么下次找不到呢?