好久没搞407了,最近有项目又要使用407,移植了网上的库版本程序( MCD Application Team @version V1.0.0),看起来——系统能够运行,LED闪灯频率也正确。但是配置串口的时候,波特率总是比预计的小3倍左右。
* G8 b) d( U& K9 x# H% R7 ^5 n X 串口配置如下:! v6 y6 H) q& P; g" P2 @
2 }3 e' u0 |0 [- void DriveUartOneInit(void)0 ?1 J* x8 o# R# }6 X
- {( Y3 ? ], u' H4 l# {8 h
- GPIO_InitTypeDef gpioInit;
. X, X' p# h! i9 C+ R - USART_InitTypeDef usartInit;
) [' `* J# f" X4 x5 x% ~# Y
$ K& s" _9 t. O2 k B- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);) g7 h4 ?' Z* |. R: }& Y+ ~+ U
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);) K# k( p* ]6 ~; i# x7 t6 u& B
-
1 }& r4 a" L9 q& g8 @/ }3 B - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);" L2 }( N6 T6 c
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);4 T9 ~; m) m- j; w, Y- n, e
9 ]7 z, `) @1 \- gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
' ]" I- Z8 r9 O8 x1 _9 [9 d H - gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;! H0 Z/ S3 |+ u9 ]5 D
- gpioInit.GPIO_OType = GPIO_OType_PP;
! Z9 G) o9 K( `* @ - gpioInit.GPIO_Mode = GPIO_Mode_AF;- ^, T4 L I7 l1 x5 t
- - H$ m' V. J8 C8 ^% f& i' d/ P# h
- //// txd0 \7 z4 a- t$ j
- gpioInit.GPIO_Pin = GPIO_Pin_9; * l- f+ T8 {& p w$ A2 C8 r
- GPIO_Init(GPIOA, &gpioInit);
& h: m! C& G* L' M3 J4 m - & [" P/ q* y. l* J) ^$ `3 Q- L2 c
- //// rxd
1 Y5 s6 U, Q7 V2 u2 F+ n" U) N4 x! J - gpioInit.GPIO_Pin = GPIO_Pin_10 ;3 U% C: N& p( q
- GPIO_Init(GPIOA, &gpioInit);
8 `! a0 z' w0 t! M( Y$ I - , `& @4 F+ n! P$ a# |" V
- //USART 初始化设置
- Q0 \& O7 m$ M; \* O6 l/ O - usartInit.USART_BaudRate = 115200;
, Q; i1 X& M4 D- L; M - usartInit.USART_WordLength = USART_WordLength_8b;
! d9 X5 j) {. t' L: w; b - usartInit.USART_StopBits = USART_StopBits_1;4 d0 b4 I$ j- v& E$ Y! m
- usartInit.USART_Parity = USART_Parity_No;
3 e6 }5 k4 h+ M+ k3 K1 C0 w/ i - usartInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;2 ^# P! O' ~! u6 B+ p+ O: q
- usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
8 \+ `% U- B7 j: j* L' Y f - USART_Init(URT_ONE_NUM, &usartInit);# J: D, S- y6 ]' T4 Q
- }
复制代码 使用MCO输出验证了时钟与自己预设的一样,确定MCU整体的时钟配置是正确的。
! x2 o3 D! o, C5 P( K 那就是怀疑串口配置相关的时钟有问题,调试跟踪发现,USART_Init调用了系统时钟相关的函数RCC_GetClocksFreq,这个函数会调用外部晶振HSE_VALUE宏定义,但是这个值不是我预设的值。系统调用的是stm32f4xx.h的HSE_VALUE,而我定义的是在system_stm32f4xx.c文件内,但是文件system_stm32f4xx.c先包含了stm32f4xx.h,故文件system_stm32f4xx.c内的定义无效,更改定义后波特率正常。; k% a* |& H r4 J# w9 ~
: ^8 j6 ]! c% Z1 e !!! 所以写程序的时候还需要更加小心谨慎,要不然自己挖的坑还得自己找自己填......( V" r. ~% ?: G6 |& e
4 t; i" j. C8 \9 X9 o6 Z8 E* M
|
这个工具生成,执行文件空间太大了,不喜欢。。。
不用改底层的,只需要把宏定义的值该正确就可以了