好久没搞407了,最近有项目又要使用407,移植了网上的库版本程序( MCD Application Team @version V1.0.0),看起来——系统能够运行,LED闪灯频率也正确。但是配置串口的时候,波特率总是比预计的小3倍左右。; Q4 h1 D1 k& g& r6 y; c
串口配置如下:% x; Y' R8 U3 A7 f( U; c
2 ]7 Z' k: ~' |5 u- void DriveUartOneInit(void)1 {- l4 Q4 G& r: _1 B8 j+ `
- {
5 l. |% J) y9 X - GPIO_InitTypeDef gpioInit;6 j/ V, m, |0 N9 }& g% o$ d- q
- USART_InitTypeDef usartInit;7 E. P0 t d5 b, Y& j0 v; h7 s" D
8 X$ f% z8 B5 ]/ L/ P" @& K- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
$ F3 d: u" y0 O$ `' t% z4 W - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);. S3 a; X x3 r; |, f( Z+ q
-
$ K V( t: p( b" |/ O; ?* M$ O - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); g, G! D1 ^. s8 B7 k! \; \
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);( O& k; t/ y7 J2 B- e
- $ }1 z( _! @) E; D8 V
- gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
: @9 z/ G+ a5 J8 h - gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
0 W1 h" i( [' I - gpioInit.GPIO_OType = GPIO_OType_PP;
# W8 a/ U& W$ p5 ?. }8 f1 C; c - gpioInit.GPIO_Mode = GPIO_Mode_AF;
! s( }2 S" Q3 ]2 ]2 o - + d' H- j$ j# N" L6 D
- //// txd, G& y. d* ?# j2 {0 p
- gpioInit.GPIO_Pin = GPIO_Pin_9; ; }; S' X6 g" U6 l
- GPIO_Init(GPIOA, &gpioInit);
2 Z/ @2 [! k9 `# a -
, j7 H5 C1 \) V: p$ ?! s7 O - //// rxd
4 v! c1 l# x* C - gpioInit.GPIO_Pin = GPIO_Pin_10 ;2 y% ?# V( P2 C& U1 `7 D! o
- GPIO_Init(GPIOA, &gpioInit);* X, M3 L2 c! t/ m: j" t1 ?
-
G& j) ^ g, c: \" l- Z- Y - //USART 初始化设置
, j/ u1 H3 F2 g7 l2 T - usartInit.USART_BaudRate = 115200;1 l4 h5 B8 N9 S* y
- usartInit.USART_WordLength = USART_WordLength_8b;
) Q" h! s1 `) @" u( ?9 ^ - usartInit.USART_StopBits = USART_StopBits_1;
- E9 M0 Y0 Y6 D' @ - usartInit.USART_Parity = USART_Parity_No;% j% c+ ~6 J: d Y* c( F
- usartInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;: _5 z- t, q7 D# E! ?1 j) f' W7 t
- usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
" Q8 `) `7 v( c0 ]5 W# l7 J# w7 g - USART_Init(URT_ONE_NUM, &usartInit);) u. W _: B Y1 ]$ K5 G) ~7 c. }
- }
复制代码 使用MCO输出验证了时钟与自己预设的一样,确定MCU整体的时钟配置是正确的。1 w( l, p- [5 h+ l
那就是怀疑串口配置相关的时钟有问题,调试跟踪发现,USART_Init调用了系统时钟相关的函数RCC_GetClocksFreq,这个函数会调用外部晶振HSE_VALUE宏定义,但是这个值不是我预设的值。系统调用的是stm32f4xx.h的HSE_VALUE,而我定义的是在system_stm32f4xx.c文件内,但是文件system_stm32f4xx.c先包含了stm32f4xx.h,故文件system_stm32f4xx.c内的定义无效,更改定义后波特率正常。5 C/ [6 e* O" }1 A
) c a$ E! D0 |7 ?+ k !!! 所以写程序的时候还需要更加小心谨慎,要不然自己挖的坑还得自己找自己填......- e f, c! O) y5 N3 S% T& J4 X. T
2 r5 I G0 t. i3 Z' D& H0 _ |
这个工具生成,执行文件空间太大了,不喜欢。。。
不用改底层的,只需要把宏定义的值该正确就可以了