本帖最后由 wenyangzeng 于 2017-12-2 22:00 编辑
& O: u6 a+ k1 I* W; ^) A' E$ J$ }* U! ?1 k
STM32F407VG使用固件库进行串行通讯波特率出错故障的排除; h0 |$ u) F+ l) @
) c: \ w: o, }: @& X0 ~
芯片型号: STM32F407VG,与上位机串口通讯交换数据:! W3 E: `8 U' b* }
系统时钟:外部晶振8MHZ,倍频到168MHZ;
4 f2 \4 w* ^! ~( R- C- j4 G 固件库:stm32f4xx_DSP_StdPeriph_Lib_V1.8.0;: D: i% h7 Z0 S9 {
在MDK5中运行stm32f4xx_DSP_StdPeriph_Lib_V1.8.0串口通讯,结果发现串口发送和接收数据都是乱码;
- F% S: G* c; B3 J
( ~0 C- B; n7 X: s3 i' q故障分析:5 K; F0 i$ h( |7 w' s0 S `
打开system.stm32f4xx.c关于时钟配置的说明:* ^. c& ^! @1 N5 J8 X6 t- z; J
- * Supported STM32F40xxx/41xxx devices5 W& @$ M) Y, v3 P4 w
- *-----------------------------------------------------------------------------5 L/ ?+ j1 [! q' X
- * System Clock source | PLL (HSE)+ B/ T5 r4 K4 W
- *-----------------------------------------------------------------------------
7 h8 O h9 |/ M/ G0 u - * SYSCLK(Hz) | 168000000
" n* x8 P& G4 T& G+ D) y0 {) \4 l - *-----------------------------------------------------------------------------! `6 m7 P* ?1 F2 _
- * HCLK(Hz) | 168000000. ]! @$ M( o1 K5 m$ Z; o5 h
- *-----------------------------------------------------------------------------" w% Z4 J. t, K- o) F' M9 [/ t5 p
- * AHB Prescaler | 1* x9 u3 J4 v: B& [9 g. R- d
- *-----------------------------------------------------------------------------
- J m4 Y2 m0 ]4 y" F% f% ? - * APB1 Prescaler | 4
7 t( M+ q, S+ N' c' x& y - *-----------------------------------------------------------------------------
5 P+ h) ] m O5 F6 j6 T8 A - * APB2 Prescaler | 2
5 h1 q% d G1 } - *-----------------------------------------------------------------------------! q. ?, R' p( I3 ~* K1 C
- * HSE Frequency(Hz) | 25000000# B( Y: H+ C( d6 U M
- *-----------------------------------------------------------------------------& w& Y/ X( I* }: l f& Y
- * PLL_M | 25
* m9 E8 u3 N" |8 \% a5 z - *-----------------------------------------------------------------------------" A/ h! P8 @+ C( N: { r. ]2 v/ |
- * PLL_N | 336
) U0 {2 ?6 l0 T& ~% z% Z3 q - *-----------------------------------------------------------------------------4 }+ }3 K' a8 I2 A) y
- * PLL_P | 2
& |3 ~ q9 K; N - *-----------------------------------------------------------------------------
* q% V% C' H2 j/ o4 m6 i& n1 W - * PLL_Q | 7
9 ]1 P3 ?; f3 x- M# @, W' G) P - *-----------------------------------------------------------------------------
复制代码 从说明中可知stm32f4xx_DSP_StdPeriph_Lib_V1.8.0演示代码中对于STM32F40xxx/41xxx系列芯片系统时钟的默认配置如下:! f9 C4 f4 o1 {9 a m* U( J
! Q q. D5 U# B6 e, [
HSE Frequency(Hz) : 使用外部25MHZ晶振;; `- |/ y9 S: }) J5 h4 x
System Clock source: PLL (HSE), 4 c- I% |) w, G" E+ s! B2 T
SYSCLK : 168MHZ.
! n' S+ c( y- VPLL_M :25( k0 D0 P; [1 n; r2 r9 Q4 C
PLL_N :336: G+ e$ I1 {+ R- C, [/ U% @) `- V: {9 R
PLL_P :24 d- z+ P# e3 {8 e
PLL_Q :7 t6 l- V& e' {/ b+ M
由于实际使用的晶振为8MHZ,按照默认的时钟配置当然无法得到正确的波特率,从而导致串口通讯失败。$ i# \4 I2 ]1 v) F! S
解决方法:, t/ v: K2 b) x) M, u1 }) s
借助STM32CubeMX,可以方便地配置系统时钟:& M5 Y/ a5 c4 \# ]. n
" X/ P5 z2 g" |2 Z, x/ J7 _, N
+ x& F9 E; I6 Q6 R. V; b! D5 u0 ^6 b
根据上图配置系统时钟所需正确参数:; d7 ^8 Z6 }* z
M=4 ( PLL_M)
) z' h8 @0 k5 Z) j9 KN=168 (PLL_N)
/ m# q5 u, i8 _5 ~+ i/ g! ZP=2 (PLL_P)
2 M% D) b" z4 \& L. D" X6 Z5 p9 iQ=4 (PLL_Q)
6 V/ b/ R" K3 \2 Z2 e; A/ s- f: U+ p: d% I( A: u6 x% I
接下来修改相关文件:
" S) n! j9 W( N0 Y4 `& X1、在stm32f4xx.h的70行定义芯片型号:% E6 v* P8 E" ?" V" B, V2 ?7 y
8 [0 d& m- \- u
' K) r% @3 o7 B& |& [
) S8 F9 e6 A7 {, f" Y
1 B! P9 y6 M" M
2、在stm32f4xx.h的144行定义晶振频率7 C: |$ G5 j A9 f$ z O. w! p2 H
- #define HSE_VALUE ((uint32_t)8000000)
复制代码 # i/ z8 n3 |6 m! w; W- c; e+ _
|6 x a# H1 Y# Y: B' c# s2 ~* f6 W
5 i6 J- R. T7 z8 Z3、在system_stm32f4xx.c中修改
4 E; i7 R6 x$ U* x, E371行
$ E% j: w. N8 \' N6 b3 k! e- r, F/ Q5 c E
: `: A4 m* \* r1 E; n3 d384行
2 S Z: r. g7 C! t b" O( ]" v+ e& ^9 H# z! X% f
, W+ E" D; }, C& T% E$ x1 c
401行1 _: Q4 o$ O! p
7 J2 {: w9 g2 j G
9 E8 x5 I; T \" E0 C/ F9 s% N 经过以上修改,编译运行,串口通讯工作正常。
* ~3 t! B& x% |! E9 v# G总结:在使用ST传统固件库开发产品过程中,当目标板使用与ST固件库默认值不同的外部晶振时,不能一味拿来就用。应该认真阅读ST官方关于固件库的说明,及时修改相关参数,才能避免多走弯路。6 M5 |0 Q8 W+ q4 l) F+ k* U$ D
- f/ o7 O6 A$ |9 X+ H2 Q7 |
/ a6 h' [- E' {# g$ h8 w: [3 Y. F |
MARK 谢谢 小白学习了。但自己的回复怎么下次找不到呢?