学习使用的是 STM32F407ZGT6
开发板采用的是 淘宝买的杂牌开发板 “神舟号STM32F407” 板载的晶振是8MHz
学习视频是看到野火的霸天虎配套视频 “霸天虎STM32F407” 板载的晶振是25MHz
显然 如果要使用野火的程序需要修改 分频因子M
因为 板载晶振为8MHz 为了保证 串口传输时波特率正常 将M改为8
查看此函数中 PLL_M 为25
将此改为8MHz
此时应该可以了吧??
于是,我认为可能代码写错了? 然而在几番查找后发现并没有错!
然后,分别测试了原子的程序 和 野火的程序 发现原子的OK 而野火的不可以,所以判断硬件没有问题,为啥原子的可以?原子的STM32F407的库是用的V1.4版本的 而我用的是V1.8版本的。于是,我怀疑可能是 库里面某些定义没有改变。
在我将上面的头文件换成原子哥用的V1.4版本之后,野火的程序也OK了!
于是,将两个文件进行比较:
对比发现 HSE_VALUE 的值 定义不同!!将该值 修改为8问解决!!
总结:
stm32f4_dsp_stdperiph_lib_V1.8.0 库
修改时钟 需要修改两个地方
1.分频因子M
PLL_M 位于 system_stm32f4xx.c 中 外部晶振的值 / M = 1MHz
2.HSE_VALUE的值
该值 位于 stm32f4xx.h中 该为外部晶振的值 例如 8MHz->8000000 25Mhz->25000000
最后附上测试代码
#include "bsp_usart.h"
#if 1
void USART_Config_User(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
//开端口时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
//开串口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//配置端口
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//将端口连接到串口
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_Pin_10, GPIO_AF_USART1);
//配置串口
USART_InitStruct.USART_BaudRate = 115200;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_Init(USART1, &USART_InitStruct);
//配置串口接收中断
//这里中断没有写 因为只是测试发送功能
//使能串口
USART_Cmd(USART1, ENABLE);
}
#endif
//发送一个字节
void USART_SeedByte_User(USART_TypeDef* USARTx, uint8_t data)
{
USART_SendData(USARTx, data);
//等待发送成功
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}
#ifndef BSP_USART_H
#define BSP_USART_H
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
void USART_Config_User(void);
void USART_SeedByte_User(USART_TypeDef* USARTx, uint8_t data);
#endif //BSP_USART_H
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_conf.h"
#include "bsp_usart.h"
#if 1
int main(void)
{
uint16_t i = 6000;
USART_Config_User();
while(1)
{
while(--i);
i = 6000;
USART_SeedByte_User(USART1, 'a'); //测试需要延时 否则传送不正确
}
}
#endif