【STM32】| 01——常用外设 | USART

news2025/2/23 10:54:46

系列文章目录
【STM32】| 01——常用外设 | USART


失败了也挺可爱,成功了就超帅。

文章目录

  • 前言
  • 1. 基础理论
    • 1.1 并行通信和串行通信
    • 1.2 同步通信和异步通信
    • 1.3 单工/半双工/全双工
    • 1.4 电平信号(RS232/TTL)和差分信号(RS485)
    • 1.5 端口(COM)
  • 2. 串口理论
    • 2.1 串口物理连接
      • 2.1.1 多个单片机之间串口连接
      • 2.1.2 单片机和其他设备连接
    • 2.2 串口数据信号
    • 2.3 MCU串口外设
  • 3. 串口实践
    • 3.1 串口查询式收发
      • 3.1.1 Cubemx配置
      • 3.1.2 编写发送代码
      • 3.1.3 编写接收代码
      • 3.1.4 查询式收发的应用场景
    • 3.2 串口中断式收发
    • 3.3 串口DMA收发
    • 3.4 串口DMA空闲空断接收
    • 3.5 环形缓冲区

前言

本文描述串口相关原理、配置及使用
如基础收发功能、串口+DMA+IDEL接收一帧数据、防止数据丢失加入环形缓冲区等
环境:stm32f103zet6 keil HAL库

1. 基础理论

串口能干吗 可以用来通信。串口通信是我们常用的设备通信方式。下面先从涉及的相关概念说起

1.1 并行通信和串行通信

一般通信方式可以分为两类
1、串行通信 如串口、SPI、IIC等
2、并行通信 如SRAM等
在这里插入图片描述

1.2 同步通信和异步通信

在这里插入图片描述

1.3 单工/半双工/全双工

根据数据传输方向可以分为这三种
在这里插入图片描述

1.4 电平信号(RS232/TTL)和差分信号(RS485)

他们都用于串口。TTL、RS232/485都算电器上标准 都是基于串口的 这里简单大概介绍详细的可自行看下哦
在这里插入图片描述
TTL应用:单片机连接电脑通过串口助手通信:单片机如果没板载 串口转TTL的芯片的话 就需要通过 单片机串口接 USB转TLL然后插到电脑上
其他也需要相应的转换器或板载转换芯片

1.5 端口(COM)

一般我们指物理接口 比如DB9
当我们用串口助手 时需要选择 COM几
因为电脑识别到串口设备后显示为端口 COM几
USB-TTL/RS232/485 都会识别为端口

2. 串口理论

串口通信是串行通信的一种。也是全双工异步通信。

2.1 串口物理连接

串口接线 中有最多 5根 TX/RX/RTS/CTS/GND
一般我们只用 TX/RX/GND 3根
其他两根用作流控:即通信过程中 握手

2.1.1 多个单片机之间串口连接

MCU通常带有串口功能 直接使用串口对应引脚连接就可以
在这里插入图片描述

2.1.2 单片机和其他设备连接

串口和电脑连接
1、单片机板载USB转串口 如板载CH340芯片等
在这里插入图片描述

2、单片机通过外部USB转TTL 连接电脑

在这里插入图片描述
单片机和传感器串口连接
1、单片机连接输出RS485信号的传感器
在这里插入图片描述
在这里插入图片描述
以上列举了几种
总结
单片机(TTL)串口连接 RS232/485需要进行相应转换

2.2 串口数据信号

串口数据按照以下方式 每次传输一字节数据 数据按一位一位传输 从数据低位到高位。
1个起始位+8个数据位+1个校验位(有/无)+停止位
下图是串口数据帧组成

在这里插入图片描述
奇校验:数据位中1的个数为奇数 该位为1 反之为0
如数据位 00101101 4个1偶数 奇校验该位为1 偶校验该位为0

用逻辑分析仪抓取串口实际波形
在这里插入图片描述

还有传输最重要的参数 那就是传输速度。
串口的传输速度称为波特率 只有在相同波特率下才可以通信
在这里插入图片描述

所以我们在使用串口时需要配置它的波特率 数据位停止位 校验位这几个参数。

2.3 MCU串口外设

不同厂商的都大同小异 我这里以stm32为例
我们通过看查 STM32参考手册 去看串口详细描述即功能框图
通过看查我们可以了解到 stm32 USART外设 通用同步异步串口收发器
也就是说这个串口也可以同步用也可以异步全双工 它还有其他额外功能
比如 支持IRDA SIR(串行红外)、智能卡模拟还有一些检测校验等。
下面我们详细看下他的功能框图

在这里插入图片描述

在这里插入图片描述

发送一个数据 先给到发送数据寄存器 通过移位寄存器一位一位送走
接收一个数据从接收数据寄存器获取
具体一些含义通过阅读相关寄存器描述可以很清楚了解这里就步多说了
总的来说 我们使用这个串口外设时候有很多功能 比如发送完成会产生中断
接收也可以 空闲检测等等这些在一些数据处理或应用中极其有用。
多读参考手册 多翻寄存器 对底层了解清楚那么遇到一些问题就很容易解决

3. 串口实践

主要讲述 HAL库所以 使用Cubemx生成 记录如何配置以及使用起来

3.1 串口查询式收发

3.1.1 Cubemx配置

新建好对应芯片工程后
首先配置时钟系统 使用HSE外部晶振 系统时钟设置为最高 STM32F103 72MHZ请添加图片描述

开始配置串口 我们用串口1
我们可以看到配置波特率 停止位 校验位 数据位选项 然后
软件自动帮我们配置了串口1默认引脚
请添加图片描述

3.1.2 编写发送代码

可以通过 functions选项看查usart HAL库函数API
请添加图片描述

每秒发送程序运行次数
请添加图片描述

3.1.3 编写接收代码

可以看到虽然我有时一次发送了好几个字节 实际串口一直是一个一个接收发送的
请添加图片描述

3.1.4 查询式收发的应用场景

查询式发送:发送数据/重定向printf (调用printf即可在串口助手显示相关内容 如输出调试信息等)
查询式接收:我们一般不用这种方式接收数据 因为需要阻塞等待接收/不断检测接收 影响程序执行 占用资源
查询式缺点:实时性差

所以一般没特殊要求的话 发送采用查询式发送 接收采用中断式

重定向printf方法
1、使用 MicroLIB 库
引入微型C标准库 头文件添加 stdio.h 重定义 fputc 即可
在这里插入图片描述
效果
请添加图片描述

2、不用微库 使用自定义kprintf 格式化输出
请添加图片描述

3.2 串口中断式收发

3.3 串口DMA收发

3.4 串口DMA空闲空断接收

3.5 环形缓冲区

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

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

相关文章

基于apache的http文件服务配置

背景: 公司的产品使用的第三方模组可以OTA,厂家提供的是window开启软件,这样就可以在本机做http下载服务器,然后使用端口映射的方式,公开到外网,这样就可以进行4G网络访问内网服务器了。但这个有个弊端&am…

【C++】—— 工厂模式详解

目录 (一)工厂模式的特点 (二)工厂模式分类 1、简单工厂模式 2、工厂方法模式 3、抽象工厂模式 (三)总结与回顾 (一)工厂模式的特点 1、优势 ⼯⼚模式是⼀种创建型设计模式&a…

【大数据进阶第三阶段之Hue学习笔记】Hue的安装和使用

1、 Hue的安装 1.1 上传解压安装包 Hue的安装支持多种方式,包括rpm包的方式进行安装、tar.gz包的方式进行安装以及cloudera manager的方式来进行安装等,我们这里使用tar.gz包的方式来进行安装 Hue的压缩包的下载地址: http://archive.cloude…

C++|19.C++类与结构体对比

类和结构体 类和结构体本质上并没有太大区别。 但两者在默认上有所区别。 类默认成员变量是私有的,而结构体默认成员变量是公有的。 也就是说,对于一个类来说,会默认使用private去保护其内部成员变量使得无法直接访问到其内部的变量。 同时从…

CANoe中的AutoSequence

简单介绍: AutoSequence是一种简单的,快速的类似脚本的一个可视化自动脚本插件。使用起来非常方便,甚至在很多时候能够代替一些简单的脚本。 1:Automation工程的创建 (1.1)打开Automation插件,双击这个插…

TypeScript进阶(一)深入理解类和接口

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的超集,意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript,使其更适合大型项目和团队开发。 在TypeS…

【2024最新-python3小白零基础入门】No2.python基础语法

文章目录 1 编码2 标识符规则3 python保留字4 注释5 行与缩进6 多行语句7 数字(Number)类型8 字符串(String)9 空行10 等待用户输入11 同一行显示多条语句12 import 与 from...import 环境准备,打开pycharm,新建一个python文件 文件名称随便,可中文可英文…

golang 记录一次协程和协程池的使用,利用ants协程池来处理定时器导致服务全部阻塞

前言 在实习的项目中有一个地方遇到了需要协程池的地方,在mt推荐下使用了ants库。因此在此篇记录一下自己学习使用此库的情况。 场景描述 此服务大致是一个kafka消息接收、发送相关。接收消息,根据参数设置定时器进行重发。 通过这里新建kafka服务&a…

ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放

0、作者杂谈 CSDN大多数都是落后的,要么是到处复制粘贴的,对于初学者我来说困惑了很久,大多数CSDN文章都是使用旧的API ,已经被否决了,于是我读一些官方文档,和一些开源项目音视频的输出过程,写…

CCSC,一种CPU架构

core-circuit-separate-computer 核与执行电路的分离,最初是为了省电。 用寄存器实现这种分离。 V寄存器控制着执行电路的供电,V0则不供电,进入省电模式;V1则供电,进入工作模式。 P寄存器是parameter-register&#xf…

Qt应用-实现图像截取功能类似QQ上传头像截取功能

本文演示利用Qt实现图像截取功能类似QQ上传头像截取功能。 效果如下,通过移动中间的裁剪区域可以获得一张裁剪后的图片。 目录

Open3D 搜索某个点的圆柱形邻域点云(11)

Open3D 搜索某个点的圆柱形邻域点云(11) 一、算法介绍二、算法实现1、代码2、结果一、算法介绍 具体而言,search_hybrid_vector_3d方法会以指定的查询点为中心,在给定的半径范围内搜索邻域点。还可以指定近邻点的数量阈值,这对于需要特定数量邻域点的应用非常有用,比如提…

安全技能讲座 - 便携式灭火器 (Portable Fire Extinguishers )

【Transcript 】 火灾随时随地都可能发生,而且毫无征兆。如果您在家中或工作中遇到火灾,便携式灭火器可以帮助您保护自己,并有可能将火灾扼杀在摇篮中。本课程将向您介绍便携式灭火器、其工作原理和使用方法。成功完成本课程后,您…

kubectl常用命令(主题篇)

上一篇是按照操作把全局性的命令给整理出来,但是在实际的使用中,经常需要对某一个主题进行操作,因此这一篇按照对应的主题进行一系列操作。 集群 查看集群基本信息 kubectl cluster-info namespace 命名空间 查看 kubectl get namespace k…

查看Linux系统内存、CPU、磁盘使用率和详细信息

一、查看内存占用 1、free # free -m 以MB为单位显示内存使用情况 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 11852 1250 8668 410 1934 9873 Swap: 601…

大模型学习之书生·浦语大模型3——基于InternLM和LangChain搭建知识库

基于InternLM和LangChain搭建知识库 1 大模型开发范式 LLM的局限性 知识受限:最新知识无法实时获取专业能力有限:有广度无深度定制化成本高:训练成本高 RAG VS Finetune RAG: 无需重新训练组织外挂加入知识容易受基座模型的影响…

Linux中快速搭建RocketMQ测试环境

必要的文件下载 为什么选择RocketMQ | RocketMQ x86_64位JDK下载0jdk/8u391-b13 rocketmq二进制包下载-rocketmq-all-5.1.4-bin-release.zip 编译好的直接可用的dashboard【rocketmq-dashboard-1.0.0.jar】请在文章顶部下载 dashboard配套的配置文件【application.propert…

基于宝塔搭建Discuz!论坛

一、安装宝塔 我是在我的虚拟机上安装图的宝塔 虚拟机版本:Ubuntu 18.04 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 6dca892c安装完成之后在浏览器输入你的地址 https://你的域名(或…

NX二次开发 Block UI 指定方位控件的应用

一、概述 NX二次开发中一般都是多个控件的组合,这里我首先对指定方位控件进行说明并结合选择对象控件,具体如下图所示。 二、实现功能获取方位其在选择面上原点的目标 2.1 在initialize_cb()函数中进行初始化,实现对象选择过滤面 //过滤平…

C++多态(超详解哦)

C多态 引言定义及实现多态的条件虚函数与虚函数的重写接口继承与实现继承函数重载,隐藏,重写的区别 抽象类多态的原理虚函数表(虚表)动态绑定与静态绑定 总结 引言 在生活中不乏这样的例子:成人与儿童在买票时会有不同…