STM32 串口打印乱码(Cubemx)

news2024/7/6 17:43:36

STM32 串口打印乱码(Cubemx)

  • 时钟配置错误,CubeMX默认的外部晶振是25MHz,而板载的晶振为8MHz
  • STM32F407修改程序将外部25M晶振修改为8M(标准库、HAL库)

核心问题

  • 芯片型号与晶振配置:使用的STM32F407ZGT6芯片默认的系统时钟配置在标准库中假设为25 MHz的外部晶振。但实际上,硬件板子上使用的是8 MHz的晶振。
  • 影响的范围:系统时钟(包括PLL设置)错误会直接影响到所有依赖系统时钟的外设,包括但不限于UART(串口通信)。由于PLL(相位锁定环)用于倍频处理,晶振的频率直接影响到最终的系统时钟输出,如果晶振设置错误,计算出来的系统时钟频率也将错误。

通信现象解释

  • 接收无误,发送乱码:当串口调试助手发送数据到单片机时,接收部分仍然能够正常工作,可能是因为UART接收部分对时钟不精确度的容忍性相对更高。但在发送数据时,如果系统时钟频率不准确,将导致波特率计算错误,进而使得发送数据时序不正确,从而产生乱码。
  • 调试助手正常工作:由于单片机接收正确的数据并能正确回传到PC,说明PC端的串口调试助手设置是正确的,问题主要出在单片机发送部分的时钟配置。

解决步骤

  1. 时钟配置调整:需要重新配置STM32F407的时钟系统,确保基于实际的8 MHz晶振来设置。这包括调整PLL的参数,以确保系统核心时钟(HCLK)、外设时钟(PCLK1、PCLK2)和其他相关时钟正确设置。
  2. 标准库时钟配置:在使用STM32标准库时,通常需要修改system_stm32f4xx.c文件中的时钟设置部分,具体为修改宏定义HSE_VALUE(定义外部高速晶振的值),从默认的25000000更改为8000000
  3. 重新编译和下载:调整时钟设置后,重新编译程序,并下载到单片机中进行测试。

总结来说,确保单片机的系统时钟配置正确是关键步骤,特别是在使用不同于标准设置的硬件配置时。这将确保所有时钟敏感的外设,如UART,能够在正确的时钟下正常工作。

晶振配置错误后果

晶振配置错误导致的问题主要与单片机内部时钟源的设置密切相关。晶振是微控制器的主要时钟源之一,提供了系统运行的基础频率。这里是详细的解释:

晶振的角色和作用

晶振(Crystal Oscillator)在微控制器系统中充当基础时钟源,提供精确的、稳定的振荡频率。这个频率用作微控制器的主要时钟输入,影响系统的运行速度和各种外设的功能。

如何影响系统时钟

在STM32微控制器中,外部晶振的频率是系统时钟配置的基础。通过使用PLL(相位锁定环),这个频率可以被倍增,生成用于核心处理器(CPU)、存储器和外设的时钟信号。例如,如果晶振配置为8 MHz,但系统设置错误地认为是25 MHz,使用相同的PLL倍频设置将得到完全不同的输出频率。这会导致所有依赖这些时钟的微控制器功能出现问题。

对UART的具体影响

UART(通用异步接收/发送器)是依赖精确时钟来同步数据传输的外设。UART波特率,即每秒传输的位数,需要基于系统时钟精确计算。如果系统时钟不正确,将导致:

  • 发送的每个位的持续时间错误:如果系统时钟过高或过低,实际的波特率将与设置的波特率不匹配,导致接收端无法正确解析发送的数据。
  • 接收时钟容错:虽然UART接收逻辑设计有一定的容错能力,能在一定程度上适应波特率的偏差,但过大的时钟误差仍然会导致接收错误。

示范和验证

如果一个系统设计为使用25 MHz晶振,但实际装配了8 MHz晶振,没有相应调整时钟设置,则系统实际运行的核心频率可能远低于预期,或者PLL无法锁定导致系统不稳定。对于UART,这意味着如果预期的通信速率为115200波特率,实际的波特率可能完全不同,从而导致发送乱码。

结论

正确配置晶振和系统时钟是确保微控制器及其外设正常运行的关键。对于任何依赖精确时钟的应用,如串口通信、USB通信或任何形式的同步数据传输,确保晶振设置正确是至关重要的。这不仅影响系统的稳定性和性能,也是可靠通信的基础。

解决

  • 正确配置如下,注意红框部分

在这里插入图片描述

  • 错误配置如下,注意红框部分

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1622109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划---斐波那契数列模型

目录 一、斐波那契数列的基本概念 二、动态规划在斐波那契数列中的应用与优势 三、实际案例:使用动态规划解决斐波那契数列问题 四、动态规划问题的做题步骤 五、例题 1、第N个泰波那契数---点击跳转题目 2、三步问题----点击跳转题目 3、最小花费爬楼梯---…

kafka启动报错(kafka.common.InconsistentClusterIdException)

文章目录 前言kafka启动报错(kafka.common.InconsistentClusterIdException)1. 查找日志2. 定位问题/解决 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不…

JVM支持的可配置参数查看和分类

JVM参数大致可以分为三类: 标注指令:-开头。 这些是所有的HotSpot都支持的参数。可以用java-help 打印出来。 非标准指令: -X开头。 这些指令通常是跟特定的HotSpot版本对应的。可以用java -X打印出来。 不稳定参数: -XX 开头。 这一类参数是跟特定HotSpot版本对应的&#x…

sql题目练习

cookie注入 解题思路和之前的整数型注入一样,只是比整数型注入多了一步,题目没有给输入框,提示“尝试找找cookie吧”cookie的中文翻译是曲奇,小甜饼的意思。cookie其实就是一些数据信息,类型为“小型文本文件”&#…

9、案例实战【处理百万级交易无压力】:JVM栈内存与永久代大小又该如何设置?

9.1、前文回顾 上一篇文章通过案例分析,向大家介绍了在准备上线新系统时,如何根据预估的业务量和访问量来推算系统每秒的并发量。接下来,我们将探讨如何根据这个并发量来估算每秒钟请求对内存空间的占用,进而得出整个系统运行期间的JVM内存运转模型。 在得到这个JVM内存运…

如何部署 wfs 分布式服务

说明: wfs是海量小文件存储系统。wfs1.x不直接支持分布式存储,但为了应对大规模部署和高可用需求,推荐采用如Nginx这样的负载均衡服务,通过合理的资源配置和定位策略,可以在逻辑上模拟出类似分布式的效果。也就是说&am…

浅谈免杀下的持久化

文章目录 前记注册表计划任务COM劫持后记reference 前记 实战中持久化的手段常用的就是加服务、添改注册表、加计划任务、劫持等,这里探索c/c下的维权免杀 注册表 用户级 \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run \HKEY_CURRENT_USER…

POJO,Entity,model,domain,view,DTO,VO,Param这些分别都是什么含义?怎样理解?

目录 1. 前言 2. POJO的含义 3. entity(实体) 4. model(模型) 5. domain(域) 6. view(视图) 7. DTO(数据传输对象) 8. VO(真正视图层) 9. Param(参数) 10. 总结 1. 前言 在日常开发的过程中,如果我们接手一个新的项目之后,通常会有各种各样的…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数: -Xss:每个线程的栈大小(单位kb)-Xms:堆的初始大小,默认物理内存的1/64,示例:-Xms:4g -Xms:10m-Xmx:堆的最大可用大小,默认物…

vue cli3开发自己的插件发布到npm

具体流程如下: 1、创建一个vue项目 vue create project 2、编写组件 (1)新建一个plugins文件夹(可自行创建) (2)新建Button组件 (3)组件挂载,为组件提供 in…

Opencv | 边缘检测 轮廓信息

目录 一. 边缘检测1. 边缘的定义2. Sobel算子 边缘提取3. Scharr算子 边缘提取4. Laplacian算子 边缘提取5. Canny 边缘检测算法5.1 计算梯度的强度及方向5.2 非极大值抑制5.3 双阈值检测5.4 抑制孤立弱边缘 二. 轮廓信息1. 获取轮廓信息2. 画轮廓 一. 边缘检测 1. 边缘的定义…

css中新型的边框设置属性border-inline

一、概念与背景 border-inline 是 CSS Logical Properties and Values 模块中的一个属性,用于控制元素在流内(inline)方向上的边框。该模块旨在提供与书写模式(writing mode)无关的布局和样式描述方式,使得…

牛客NC216 逆波兰表达式求值【中等 栈 C++/Java/Go/PHP】

题目 题目链接:https://www.nowcoder.com/practice/885c1db3e39040cbae5cdf59fb0e9382 核心 栈 参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** param tokens strin…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

Redis系列:内存淘汰策略

1 前言 通过前面的一些文章我们知道&#xff0c;Redis的各项能力是基于内存实现的&#xff0c;相对其他的持久化存储&#xff08;如MySQL、File等&#xff0c;数据持久化在磁盘上&#xff09;&#xff0c;性能会高很多&#xff0c;这也是高速缓存的一个优势。 但是问题来了&am…

论机器学习(ML)在网络安全中的重要性

机器学习是什么&#xff1f; 机器学习(ML)是人工智能的一个分支&#xff0c;它使用算法来使计算机系统能够自动地从数据和经验中进行学习&#xff0c;并改进其性能&#xff0c;而无需进行明确的编程。机器学习涉及对大量数据的分析&#xff0c;通过识别数据中的模式来做出预测…

Python | 获取PCD点云数据强度等信息

最近工作需要&#xff0c;需要获取PCD点云数据的强度等信息&#xff0c;给出open3d和pypcd两种方法获取强度信息。读取的PCD数据头格式如下&#xff1a; VERSION 0.7 FIELDS x y z intensity laserid timeoffset yawangle SIZE 4 4 4 1 2 8 4 TYPE F F F U U F F COUNT 1 1 1 …

Spring Boot | Spring Boot 实现 “Redis缓存管理“

目录 : Spring Boot 实现 "Redis缓存管理" :一、Spring Boot 支持的 "缓存组件" &#xff08; 如果 “没有” 明确指定使用自定义的 "cacheManager "或 "cacheResolver" &#xff0c;此时 SpringBoot会按照“预先定义的顺序” 启动一个…

浅谈本地缓存的几种方案选型

一、摘要 说到缓存&#xff0c;面试官基本上会绕不开以下几个话题&#xff01; 项目中哪些地方用到了缓存&#xff1f;为什么要使用缓存&#xff1f;怎么使用它的&#xff1f;引入缓存后会带来哪些问题&#xff1f; 这些问题&#xff0c;基本上是互联网公司面试时必问的一些…

STM32,复位和时钟控制

外部时钟 HSE 以后需要用到什么就这样直接拿去配就行了