好久没搞407了,最近有项目又要使用407,移植了网上的库版本程序( MCD Application Team @version V1.0.0),看起来——系统能够运行,LED闪灯频率也正确。但是配置串口的时候,波特率总是比预计的小3倍左右。
串口配置如下:
- void DriveUartOneInit(void)
- {
- GPIO_InitTypeDef gpioInit;
- USART_InitTypeDef usartInit;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
-
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
- gpioInit.GPIO_Speed = GPIO_Speed_25MHz;
- gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
- gpioInit.GPIO_OType = GPIO_OType_PP;
- gpioInit.GPIO_Mode = GPIO_Mode_AF;
- //// txd
- gpioInit.GPIO_Pin = GPIO_Pin_9;
- GPIO_Init(GPIOA, &gpioInit);
-
- //// rxd
- gpioInit.GPIO_Pin = GPIO_Pin_10 ;
- GPIO_Init(GPIOA, &gpioInit);
-
- //USART 初始化设置
- usartInit.USART_BaudRate = 115200;
- usartInit.USART_WordLength = USART_WordLength_8b;
- usartInit.USART_StopBits = USART_StopBits_1;
- usartInit.USART_Parity = USART_Parity_No;
- usartInit.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(URT_ONE_NUM, &usartInit);
- }
复制代码 使用MCO输出验证了时钟与自己预设的一样,确定MCU整体的时钟配置是正确的。
那就是怀疑串口配置相关的时钟有问题,调试跟踪发现,USART_Init调用了系统时钟相关的函数RCC_GetClocksFreq,这个函数会调用外部晶振HSE_VALUE宏定义,但是这个值不是我预设的值。系统调用的是stm32f4xx.h的HSE_VALUE,而我定义的是在system_stm32f4xx.c文件内,但是文件system_stm32f4xx.c先包含了stm32f4xx.h,故文件system_stm32f4xx.c内的定义无效,更改定义后波特率正常。
!!! 所以写程序的时候还需要更加小心谨慎,要不然自己挖的坑还得自己找自己填......
|
这个工具生成,执行文件空间太大了,不喜欢。。。
不用改底层的,只需要把宏定义的值该正确就可以了