STM32F407串口通信程序波特率设置115200,上位机显示乱码,上位机设置38400才通信正常。

最近在实习公司使用的STM32F407ZGT6的主控板,板子是公司硬件部门设计的,我在调试这个板子的时候发现串口通信一直乱码,烧录了例程也是乱码,找了很多问题才发现,是由于晶振不对。公司的板子上设计的外部晶振频率是8Mhz的,但是STM32库里面的F407晶振默认是25MHz。实际晶振大概是程序里的1/3,所以波特率也成了预期的1/3.

根据STM32F4系列的时钟树配置,PLL的输出频率(PLL_VCO)可以通过以下公式计算: 

PLL_{VCO}=(\frac{HSE}{PLL_M})\times PLL_N

其中:

  • HSE 是外部高速时钟频率。
  • PLL_M 是PLL输入分频系数。
  • PLL_N 是PLL倍频系数。

系统时钟(SYSCLK)可以从PLL_VCO分频得到,其公式为: 

SYSCLK=\frac{PLL_{VCO}}{PLL_P}

如果HSE为8MHz,PLL_M设置为8,为了达到STM32F407的最大频率168MHz,需要选择合适的PLL_N和PLL_P值。STM32F4系列的标准配置,PLL_N通常设置为336,PLL_P设置为2,这样计算出来的SYSCLK为:SYSCLK=\frac{(8MHz/8)\times 336}{2}=168MHz.

这时候我的板子HSE=8MHz,但库例程里面的PLL_M=25,这样实际的systick就变成了接近1/3倍。

而波特率的设置依赖于USART的时钟源和USARTDIV的值,而USARTDIV是通过以下公式计算得出的:USARTDIV=时钟源频率/(波特率×16)  

实际波特率=SYSTICK/(USARTDIV × 16),在其他不变的情况下,SYSTICK变小 导致了实际波特率变小。

这个时候我只要将代码system_stm32f4xx.c中的PLL_M设置为8,可以使最大频率依然到达168Mhz

再将stm32f4xx.h文件中的HSE_VALUE的值改为8000000

编译下载即可使用115200波特率通信

STM32F407是ST公司生产的一款高性能的ARM Cortex-M4微控制器,它支持多种串行通信接口。使用STM32F407进行RS-485串口通信时,设置波特率通常涉及以下几个步骤: 1. 选择合适的时钟源:STM32F407有多个时钟源,首先需要确保你已经配置好了一个合适的时钟源(例如内部高速时钟HSE、外部高速时钟HSE或者内部低速时钟LSE、外部低速时钟LSE),并且该时钟源已经被用于APB1或APB2总线(取决于串口所在的总线)。 2. 配置串口(USART/UART):在软件中找到对应串口的配置函数,比如USART1、USART2或USART3等,然后初始化串口,设置好串口模式为异步模式(异步模式适用于RS-485通信),并配置好数据位(通常是8位)、停止位(通常是1位)、校验位(可选,通常不使用)。 3. 计算波特率分频:根据你希望设置波特率以及选定的时钟源频率,计算出波特率分频值(BRR),公式大致为:BRR = 时钟频率 / (波特率 * 16)。如果要得到115200波特率,时钟源为16MHz,那么分频值为:BRR = 16,000,000 / (115200 * 16) ≈ 8.68。由于分频值必须是整数,实际编程时需要进行取整。 4. 设置波特率:将计算好的分频值写入到USART的波特率寄存器(BRR)。同时,确保串口的使能位已经设置,允许串口开始工作。 5. 配置RS-485模式:如果你的硬件是RS-485模块,还需要在软件中配置对应的RS-485模式设置,这可能包括发送使能和接收使能的控制。 以下是一段简化代码示例(假设使用HAL库): ```c // 假设系统时钟已经配置好,并且APB1时钟为42MHz // 设置波特率115200 uint32_t baudrate = 115200; uint32_t clockrate = 42000000; uint32_t BRR = clockrate / (baudrate * 16); // 理论计算值,实际可能需要调整 USART_HandleTypeDef huart2; huart2.Instance = USART2; huart2.Init.BaudRate = baudrate; huart2.Init.WordLength = USART_WORDLENGTH_8B; huart2.Init.StopBits = USART_STOPBITS_1; huart2.Init.Parity = USART_PARITY_NONE; huart2.Init.Mode = USART_MODE_TX_RX; huart2.Init.HwFlowCtl = USART_HWCONTROL_NONE; huart2.Init.OverSampling = USART_OVERSAMPLING_16; HAL_USART_Init(&huart2); // RS-485模式设置,根据硬件进行配置 // 例如,设置为发送模式 HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_SET); ``` 请注意,上述代码需要根据实际硬件连接和库函数进行调整,实际开发中还需要包含必要的头文件,并且根据实际情况初始化时钟系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值