【STM32】串口通信乱码(认识系统时钟来源)

本文讲述了在使用STM32F407进行串口通信时遇到乱码问题,通过检查波特率、数据位等设置以及确认时钟源(特别是HSE和PLL)与库函数的一致性,最终发现是外部晶振频率配置错误导致。作者详细介绍了时钟源分析和解决方法。

使用 stm32f407 与电脑主机进行串口通信时,串口助手打印乱码,主要从以下方面进行排查:

  • 检查传输协议设置是否一致(波特率、数据位、停止位、校验位)
  • 检查MCU外部晶振频率是否和库函数设置的一致

最终发现是外部晶振频率和库函数不一致的问题。

一、时钟分析

1、认识时钟源

我们要检查的是 APB2总线的时钟源是否设置正常,因为我们当前使用的串口 USART1 与 APB2 总线(高速总线)相连,从下图看,时钟源有三个:

  • HSI:高速内部时钟,RC振荡器,频率为16MHz
  • HSE:高速外部时钟,接外部时钟源,频率范围为4MHz~26MHz
  • PLL:锁相环倍频输出,其时钟输入源可选择为 HSI/M、HSE/M(本质还是 由HSE或HSI控制)

就结果而言,选择的时钟源是 PLLCLK。(若想了解,可以参考最后一部分)

2、计算系统时钟

现在已经知道了选择的是 PLLCLK 作为时钟源,那么我们就可以顺着这条路线计算系统时钟的值。正点原子 stm32f407 的外设时钟频率 HSE = 8 M

① 输入 HSE

② 经过 M 分频,得到的结果为 HSE / M = 8 / M

③ ④ ⑤ ⑥ 经过 N 倍频,VCO的输出为 (HSE / M ) * N

⑦ 再次 P 分频就得到 SYSCLK = (HSE / M ) * N / P

二、解决外部晶振频率和库函数不一致的问题

从上面可知,选择的系统时钟频率  SYSCLK = (HSE / M ) * N / P,配置文件预期的 SYSCLK = 144MHz,其余参数也都指定了

实际上 HSE 需要视开发板具体情况而定,stm32f4 的 HSE 为 8 MHz,然而配置文件中配置的频率是 25 M,为了不影响原本的SYSCLK,我们需要修改 HSE 和 PLL_M。

  • HSE = 8 M = 8000000
  • PLL_M = (HSE / SYSCLK ) * N / P = 8

1、修改 HSE

HSE 在程序中的体现为宏定义 HSE_VALUE ,该宏定义在 stm32f4xx.h 文件中

这里有两种修改方法,可任选一种修改

2、修改 PLL_M

分频数 M 在程序中的体现是宏定义 PLL_M,该宏定义在 system_stm32f4xx.c 文件中

 

三、为什么可以确定时钟源为 PLLCLK 而不是 HSE

stm32 在启动的时候就会调用 SystemInit 函数,这个函数就包含了初始化外设的时钟源。这个函数定义在 system_stm32f4xx.c 中。我们直接找到 SetSysClock 函数,这之前的都是将控制寄存器位清零的操作。

我们进入到 SetSysClock 函数,首先是HSE使能,等待时钟准备就绪。刚上电的时候 HSE 晶振不稳定,需要等待 6 个晶振时钟周期。

PLL 使能,等待时钟准备就绪。一开始 PLL 处于被锁定状态,这里需要等待 PLL 解锁。

一切准备就绪,然后将 PLL 设为系统时钟。 

 

参考文章:

在串口通信实验中出现通信乱码怎么办-电子发烧友网 (elecfans.com)

<think>好的,用户遇到了在Proteus中使用STM32进行串口通信时出现乱码的问题,需要解决。首先,我需要根据提供的引用资料常见原因来分析可能的问题点。 首先,引用资料中提到在Proteus中添加STM32芯片时需要注意选择支持的型号,比如STM32F103C6[^3]。如果选择的芯片型号与实际工程中的配置不一致,可能导致时钟配置错误,从而引发串口通信问题。因此,首先应该检查STM32CubeMX中的芯片型号是否与Proteus中的一致。 其次,串口通信的波特率设置必须匹配。如果STM32USART波特率与Proteus中虚拟串口的设置不一致,就会导致乱码。需要确认两边的波特率、数据位、停止位校验位是否相同。例如,如果代码中设置为115200,而Proteus中设置为9600,就会出现问题。 接下来,时钟配置是否正确也非常重要。STM32的外设时钟依赖于系统时钟,如果CubeMX中的HCLK配置错误,比如使用外部晶振但未正确设置,可能导致USART的实际波特率偏离预期值。需要检查时钟树配置,确保系统时钟外设时钟正确。 此外,Proteus中的虚拟串口配置是否正确也是一个关键点。用户需要使用VSPD等工具正确绑定COM端口,并确保没有其他软件占用这些端口。同时,串口调试工具如XCOM的参数设置必须与STM32的配置一致。 还有可能的问题包括代码中的中断处理不当,比如未正确启用USART中断或中断服务函数有误,导致数据接收错误。此外,电压或信号干扰在仿真中可能影响通信,但Proteus仿真中这类硬件问题较少,更多是配置问题。 用户可能需要逐步检查这些方面:确认芯片型号一致、核对波特率等参数、检查时钟配置、验证虚拟串口设置,并确保代码正确。通过逐一排查这些常见原因,应该能够找到并解决乱码问题。</think>### Proteus中STM32串口通信乱码问题解决方案 #### 1. 检查芯片型号一致性 在STM32CubeMXProteus中必须选择**完全相同的芯片型号**。例如: - Proteus支持的型号:STM32F103C6 - CubeMX工程配置需对应选择相同型号 若型号不一致会导致时钟树配置错误,最终引发串口波特率偏差。 #### 2. 验证波特率与参数配置 $$ \text{波特率误差} = \left|\frac{\text{理论值} - \text{实际值}}{\text{理论值}}\right| \times 100\% $$ 要求误差应小于2%。具体操作: - **CubeMX配置**:USART参数需包含`波特率`、`数据位`、`停止位`、`校验位` - **Proteus虚拟终端设置**:右键点击虚拟终端→属性→参数与CubeMX配置完全一致 - **串口调试工具**:XCOM等工具参数需同步匹配[^2] #### 3. 时钟树配置检查 在CubeMX中按以下顺序验证: 1. 选择正确的时钟源(HSE/LSE/HSI) 2. 确认`HCLK`频率与外设时钟分配 3. 查看USART时钟源是否启用 例如:若使用APB1总线时钟,需确保其频率满足公式: $$ \text{USARTDIV} = \frac{f_{CK}}{16 \times \text{波特率}} $$ #### 4. Proteus串口链路配置 使用`VSPD`创建虚拟COM口对: 1. 添加COM1↔COM2虚拟端口对 2. Proteus中USART引脚连接`COMPIM`元件 3. `COMPIM`属性设置与代码完全匹配 #### 5. 代码层排查 ```c // 示例:CubeMX生成的USART初始化代码片段 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; ``` 需检查: - 是否调用了`HAL_UART_Init()` - 中断服务函数是否正确注册 - 是否存在未处理的接收中断 #### 6. 特殊案例处理 若使用`printf`重定向,需检查: ```c // 确保已添加以下代码 int fputc(int ch, FILE *f){ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100); return ch; } ``` 并勾选CubeMX的`Use MicroLIB`选项[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值