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

使用 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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因果推断(五)基于谷歌框架Causal Impact的因果推断

因果推断(五)基于谷歌框架Causal Impact的因果推断 除了传统的因果推断外,还有一些机器学习框架可以使用,本文介绍来自谷歌框架的Causal Impact。该方法基于合成控制法的原理,利用多个对照组数据来构建贝叶斯结构时间…

docker 安装 redis

目录 1、下载镜像文件 2、创建实例并启动 3、使用 redis 镜像执行 redis-cli 命令连接 4、redis持久化操作 5、然后按照第3点,再试一试,看看redis持久化是否配置成功。 6、最后与redis可视化工具测试连接 大家先 su root,这让输入命令就…

Redis系列(四):哨兵机制详解

首发博客地址 https://blog.zysicyj.top/ 前面我们说过,redis采用了读写分离的方式实现高可靠。后面我们说了,为了防止主节点压力过大,优化成了主-从-从模式 思考一个问题,主节点此时挂了怎么办 这里主从模式下涉及到的几个问题&a…

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例

支持向量机(Support Vector Machine,SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。当数据…

opencv-手势识别

# HandTrackingModule.py import cv2 import mediapipe as mpclass HandDetector:"""使用mediapipe库查找手。导出地标像素格式。添加了额外的功能。如查找方式,许多手指向上或两个手指之间的距离。而且提供找到的手的边界框信息。"""…

vscode 安装勾选项解释

1、通过code 打开“操作添加到windows资源管理器文件上下文菜单 :把这个两个勾选上,可以对文件使用鼠标右键,选择VSCode 打开。 2、将code注册为受支持的文件类型的编辑器:不建议勾选,这样会默认使用VSCode打开支持的相…

【Java从0到1学习】10 Java常用类汇总

1. System类 System类对读者来说并不陌生,因为在之前所学知识中,需要打印结果时,使用的都是“System.out.println();”语句,这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法,它所提供的属性和…

PyCharm PyQt5 开发环境搭建

环境 python:3.6.x PyCharm:PyCharm 2019.3.5 (Community Edition) 安装PyQT5 pip install PyQt5 -i https://pypi.douban.com/simplepip install PyQt5-tools -i https://pypi.douban.com/simple配置PyCharm PyQtUIC Program :D:\Pytho…

Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

Unity版本:2019.2.3f1 目录 安装InputSystem 1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向 安装InputSystem 菜单栏/Window/Package Manager/Input Syst…

网络编程(三次握手、四次挥手)

一、Wireshark 窗口介绍 二、 wireshark与对应的OSI七层模型 服务器和客户端的代码不能都运行在ubuntu,因为wireshark抓的是流经真实网卡的数据包。 若将服务器客户端都运行在ubuntu,数据直接经过虚拟网卡通信,而不会经过真实网卡。 三、以太…

监控 FTP 服务器

文件传输协议 (FTP) 用于在 TCP/IP 网络中的服务器和客户端之间传输文件,它是一种标准协议,广泛用于在各个垂直行业的组织之间从集中位置存储和分发数据。FTP协议的其他一些安全版本如下: SSH 文件传输协议 &#xff…

问道管理:股票印花税是多少?印花税降低有何影响?

股票印花税,是指对证券商场上买卖、承继、赠与所确立的股权转让根据,按买卖额纳税。那么,我国股票印花税是多少?印花税下降有何影响?问道管理为我们预备了相关内容,以供参考。 股票印花税是多少&#xff1f…

如何让智能搜索引擎更灵活、更高效?

随着互联网的发展和普及,搜索引擎已经成为人们获取信息、解决问题的主要工具之一。 然而,传统的搜索引擎在面对大数据时,往往存在着搜索效率低下、搜索结果精准度不够等问题。 为了解决这些问题,越来越多的企业开始采用智能搜索技…

无涯教程-Perl - warn函数

描述 此函数将LIST的值打印到STDERR。基本上与die函数相同,除了不对出口进行任何调用并且在eval语句内不引发异常。这对于引发错误而不导致脚本过早终止很有用。 如果变量$包含一个值(来自先前的eval调用),并且LIST为空,则$的值将以。\t.caught打印。附加到末尾。如果$和LIST…

智能在线客服系统,客户问题接待更及时

优质的客户服务可以提高客户的满意度和忠诚度,从而为企业带来更多的商业机会。智能在线客服系统,是指通过人工智能技术和自然语言处理技术,将客户的问题自动化地分配给相应的客服人员,从而实现客户问题的快速解答。相比传统的客服…

初识Node.js

什么是node.js? node.js是一个基于chrome V8引擎的javascript运行环境 浏览器是js前端的运行环境 node是js后端的运行环境 什么是终端? 用于实现人机交互的方式 Windows系统有两种打开终端的方式 1.windowsR输入cmd(旧版) 2.在文件所处…

Matlab 在一张图中画多个机械臂

在matlab中第一次画机械臂时,可能会出现的问题是Link函数不识别(如出现Link输入参数不对等) 这大概率是因为缺少matlab工具箱,如图 需要下载该软件包,然后用Matlab打开,就能自动安装到matlab中。下载地址在这个超链接…

【网络安全】跨站脚本(xss)攻击

跨站点脚本(也称为 XSS)是一种 Web 安全漏洞,允许攻击者破坏用户与易受攻击的应用程序的交互。它允许攻击者绕过同源策略,该策略旨在将不同的网站彼此隔离。跨站点脚本漏洞通常允许攻击者伪装成受害者用户,执行用户能够…

区块链与算力网络:创造未来网络的安全与共享

在数字革命的浪潮下,网络技术正焕发着前所未有的活力,而算力网络以其独特的区块链技术应用,为网络的安全性和资源共享带来了新的可能性。本文将带您深入探索算力网络中区块链技术的神奇应用,为您呈现这个充满活力和创新的网络未来…

Android设置顶部状态栏颜色

Android设置顶部状态栏颜色_wx637304bacd051的技术博客_51CTO博客