本帖最后由 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
- * Supported STM32F40xxx/41xxx devices
! i3 [* m) x$ ?6 l - *-----------------------------------------------------------------------------3 S5 _7 K; c+ \9 N% z. }$ A
- * System Clock source | PLL (HSE)
l6 `8 K+ C& Q - *-----------------------------------------------------------------------------* v: _7 @ K$ c- m* }6 r- a. N
- * SYSCLK(Hz) | 168000000
0 v& H9 L1 C" Q& j/ c0 J8 P" S - *-----------------------------------------------------------------------------+ a+ ^. S9 O4 ^ E2 ^
- * HCLK(Hz) | 168000000
( ?: H. Z, u$ n" e j) b) d - *-----------------------------------------------------------------------------
3 N: D- i! q& \0 D- B' V) H1 v2 c$ T - * AHB Prescaler | 1; a& Z) F, }( @- J, `7 p& H) p& n: S1 q, o
- *-----------------------------------------------------------------------------
1 W$ B5 S7 |+ y ~2 r5 {8 B9 w - * APB1 Prescaler | 4
, C. ~9 R4 n3 j3 H! }' K/ M - *-----------------------------------------------------------------------------
' N; ]% t, g/ c- L - * APB2 Prescaler | 2
" x: [7 Z$ f/ F3 r - *-----------------------------------------------------------------------------
! E$ K+ W( k7 |5 |0 y0 Z - * HSE Frequency(Hz) | 250000000 s0 y# i+ f5 v; W. p
- *----------------------------------------------------------------------------- V) J9 e, s/ g) m
- * PLL_M | 25- j2 j2 @$ \* @; \1 F
- *-----------------------------------------------------------------------------2 ^5 u* z1 ^, k1 W
- * PLL_N | 336
; b0 n. O4 r/ j2 r1 l - *-----------------------------------------------------------------------------1 c# O3 ]9 Q0 h2 @
- * PLL_P | 2# i) c' B' n/ d; y! r
- *-----------------------------------------------------------------------------9 R# S( G! B; w" P
- * PLL_Q | 75 L, M r5 L$ C2 h5 I" B3 l
- *-----------------------------------------------------------------------------
复制代码 从说明中可知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+ @; \
; 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
: H2 p' g; y* }, u5 \; \
- v. ]2 q; O" ?- E
% `: W- {8 ?, _* f, o2、在stm32f4xx.h的144行定义晶振频率
2 h) Y+ D6 s4 G: ^# \- #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
; @- }% o9 W( N# Y/ S$ n. r: ?
q [) n" ^( L: Z( y$ j8 \. H$ F9 X384行
# L& Z" V7 o; D% D8 c5 @, {; e# G5 v: {8 E$ g
3 `* C, b: q; R4 h9 j( g
401行
! M8 h2 M3 T% h' D" a" |
. 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: {
|
MARK 谢谢 小白学习了。但自己的回复怎么下次找不到呢?