UART协议

文章目录

  • UART 协议
    • 主要特点
    • UART控制器
        • 组成部分
        • 工作流程
    • UART寄存器(fs4412)
        • 输入输出重定向

UART 协议

  • UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种串行通信协议,用于在计算机或外设之间进行数据交换。UART协议广泛应用于嵌入式系统和微控制器领域。

主要特点

  1. 异步通信:UART不需要时钟信号来同步发送和接收设备,而是通过预定的波特率来控制数据传输速度。

  2. 全双工通信:UART支持同时发送和接收数据。

  3. 帧结构
    帧 = 起始位 ( 1 位 ) + 数据位 ( 5 到 8 位 ) + 校验位 ( 1 位 ) + 停止位 ( 1 位或 2 位 ) 帧 = 起始位(1位) + 数据位(5到8位) + 校验位(1位) + 停止位(1位或2位) =起始位(1)+数据位(58)+校验位(1)+停止位(1位或2)
    在这里插入图片描述

  4. UART通信通常主要依赖三根线

    • TX(Transmit):发送数据线。
    • RX(Receive):接收数据线。
    • GND(Ground):地线。
      在这里插入图片描述
  5. 单工和双工

    • 单工
      • 数据只单向传输(如广播)
    • 双工
      • 半双工通信:双方可以传输数据,但不能同时进行(如对讲机)。
      • 全双工通信:双方可以同时传输和接收数据(如电话通信)。
  6. 波特率

    • 串行通信中每秒钟传输的符号(信号)数,通常用于衡量数据传输速率
    • 在简单的通信系统中(如UART),每个符号(码元)通常对应1个比特,因此波特率和比特率相同。但是在某些通信系统中,一个符号可能代表多个比特,这时波特率和比特率就不再相等。例如,如果一个符号表示2个比特,那么比特率就是波特率的2倍。
    • 波特率的选择
      • 通信双方的波特率必须匹配
      • 较高的波特率可以提高数据传输速度,但同时可能增加信号的噪声和错误风险,特别是在长距离通信中。
      • 较低的波特率较为稳定可靠,但传输速度较慢。
    • 波特率的计算
      • 波特率通常由时钟频率分频器设置确定。在许多微控制器或通信模块中,波特率由系统时钟频率和预分频寄存器共同决定。
        波特率 = 系统时钟频率 分频值 波特率 = \frac{系统时钟频率}{分频值} 波特率=分频值系统时钟频率
  7. 数据发送先行位

    • I²C:默认情况下,数据总是按 高位先行(MSB First) 传输,即最高位先发出。
    • SPI:默认也是 高位先行,但它可以灵活配置,你可以选择按 低位先行(LSB First) 传输数据。
    • UART:UART 通信协议默认情况下使用低位先行(LSB First)进行数据传输。
  8. 轮询、中断和DMA

    • 轮询:计算机主动发起,定期访问
    • 中断:IO设备发起
    • DMA:解放CPU

UART控制器

  • UART控制器是处理UART通信的硬件模块或芯片,负责在发送和接收设备之间完成数据的串行通信。
  • UART控制器的主要功能是将并行数据转换为串行数据(在发送时),以及将串行数据转换为并行数据(在接收时),并处理通信协议中的各个部分,如波特率控制、数据帧格式等。
    UART接口实物图
组成部分
  1. 发送器(Transmitter)
    • 数据寄存器:在发送数据之前,数据首先存储在发送寄存器(通常称为发送移位寄存器,TX Shift Register)。该寄存器负责把并行数据(通常是一个字节)转换为串行格式。
    • 移位器:控制串行数据的输出顺序。UART发送器将数据按**低位先行(LSB First)**的方式逐位发送。
    • 帧生成器:根据配置好的帧格式(起始位、数据位、校验位、停止位),自动生成符合UART协议的完整数据帧并通过TX线发送出去。
  2. 接收器(Receiver):
    • 接收寄存器:接收的串行数据通过RX引脚输入,并逐位加载到接收寄存器中,通常称为接收移位寄存器(RX Shift Register)。
    • 帧解析器:接收器解析输入的数据帧,识别起始位、数据位、校验位和停止位,并从帧中提取出实际的有效数据。
    • 校验检测:如果启用了校验位,接收器会根据校验位的配置(奇校验或偶校验)对接收的数据进行错误检查。
  3. 波特率生成器(Baud Rate Generator)
    • 波特率生成器负责产生用于控制数据传输速度的时钟信号。确保发送器和接收器能够按预定的波特率同步发送和接收数据。
    • 波特率生成器会确保UART控制器按设定的速率发送每一位数据。
  4. 中断处理(Interrupt Handling)
    • UART控制器通常会与系统的中断机制结合。它可以在发送完一帧数据或接收到完整的数据时触发中断,让主处理器执行相关操作,如读取接收到的数据或发送新的数据。
    • 常见的中断类型包括发送完成中断、接收完成中断和错误中断(例如帧错误、超时、校验错误等)。
  5. FIFO缓冲区(First In First Out Buffer,部分UART支持)
    • 一些UART控制器集成了发送和接收FIFO缓冲区,允许暂存多帧数据以避免数据丢失,尤其在数据传输速率较高或系统忙于处理其他任务时,FIFO缓冲区可以缓解压力。
  6. 状态寄存器(Status Registers):记录当前的通信状态

一般内部逻辑

工作流程
  1. 发送数据:
    • 用户程序将数据写入UART控制器的发送数据寄存器。
    • UART控制器根据设定的波特率和帧格式将数据打包成帧,并通过TX引脚串行发送出去。
    • 如果启用了中断,UART在完成发送时会产生中断通知主处理器,可以发送下一帧数据。
  2. 接收数据:
    • 数据通过接收器的RX引脚逐位输入到UART控制器。
    • 接收的数据被解析,提取有效数据并存储到接收寄存器中。
    • UART控制器可以通过中断通知主处理器接收到新数据,等待处理。
  3. 波特率控制:
    • 波特率生成器根据波特率寄存器中的设置,按设定的速率控制发送和接收的位速率,确保与另一端设备的波特率一致。

UART寄存器(fs4412)

  • 裸机开发示例

在这里插入图片描述

  • 总寄存器
    在这里插入图片描述
  • ULCONn
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 发送寄存器和接受寄存器
    在这里插入图片描述
  • 波特率设置(有误差:四舍五入)
    在这里插入图片描述
#include “exynos4412.h”//要打开这个文件,查看其怎么定义的
/*1.将GPA1_0和GPA1_1分别设置成UART2的接收引脚和发送引脚GPA1CON[7:0]*// 连接起了
GPA1.CON = GPA1.CON & (~(0xFF<<0))|(0x22<<0);//0x22=0010 0010一次设置两个引脚//GPA1.CON & (~(0xFF<<0))低8位清零//|(0x22<<0)第二位和第六位为1
/*2.设置UART2的帧格式ULCON2 8位数据位 1位停止位 无校验位*// 串口寄存器
UART2.ULCON2 = UART2.ULCON2&(~(0x7F<<0))|(0x3<<0);//0000 0011/*3.设置UART2的接收和发送模式为轮询模式UCON[3:0]*/
UART2.UCON2 = UART2.UCON2 & (~(0xF <<0))|(0x5<<0);/*4.设置UART2的波特率为115200,UBRDIVn/UFRACVALn*/
UART2.UBRDIV2 = 53;
UART2.UFRACVALn	= 4;	//利用公式计算
while(1)
{/*将要发送的数据写入发生寄存器UTXH2*/UART2.UTXH2 = 'A';//默认显示字符,不显示数字UART2.UTXH2 = 'B';UART2.UTXH2 = 'C';UART2.UTXH2 = 'D';
}
/*还有许多寄存器*/
/**//**//**/
  • 上面的数据发送时会乱码:CPU往寄存器中写入数据的速度和发送器往外发送数据的速度不一致,故而会造成乱码

解决方法:4.第一张图中的状态寄存器。另类延迟while (!(UART2.UTRSTAT2 & (1<<1)));  // 等待发送完成UART2.UTXH2 = 'A';//默认显示字符,不显示数字while (!(UART2.UTRSTAT2 & (1<<1)));  // 等待发送完成UART2.UTXH2 = 'B';while (!(UART2.UTRSTAT2 & (1<<1)));  // 等待发送完成UART2.UTXH2 = 'C';while (!(UART2.UTRSTAT2 & (1<<1)));  // 等待发送完成UART2.UTXH2 = 'D';
  • 接受数据
// 函数功能:接收UART2的一个字节数据并返回
char UART_Rec_Byte(void)
{char Data = 0;  // 定义变量Data,用于存储接收到的数据// 检查UART2的状态寄存器UTRSTAT2中的位1(接收数据是否准备好)// 假设位0为接收缓冲区是否有数据的标志if (UART2.UTRSTAT2 & 1)  // 如果接收寄存器中有数据可读{Data = UART2.URXH2;  // 从接收寄存器读取数据到Datareturn Data;         // 返回接收到的数据}else{return 0;            // 如果没有数据可读,返回0// 注意:返回0可能与接收字符0冲突,具体应用时需考虑如何处理}
}
输入输出重定向
  • 没有操作系统的时候,只能自己写类似操作系统库函数
void UART_Send_Str(char *pstr)
{while(*pstr !='\0')UART_Send_Byte(*pstr++);
}

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

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

相关文章

java集合进阶篇-《Collection集合》

个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、Collection集合简要概述 Collection的主要实现 Collection的方法 迭代器&#xff08;Iterator&#xff09; 三、单列集合顶层接口Collection CollectionDemo01 CollectionDemo02 CollectionDemo03 Collec…

问题记录:matlab中spatial contact force模块下关于stiffness(刚度)的设定

最近在搞一阶倒立摆&#xff0c;在matlab仿真时遇到这样的问题&#xff1a;stiffness设置为10e5就会发生碰撞后穿透&#xff0c;&#xff08;四个spatial contact force模块是分别连接小车四个轮子和地面的&#xff09; 而设置成10e6就不会有问题&#xff0c; 由于本人也是第一…

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云&#xff0c;对象存储封装库 第一步&#xff0c;下载组件代码&#xff0c;放置到自己的小程序项目中 第二步、 创建上传对象&#xff0c;执行选择图片/视频 var _this th…

【H2O2|全栈】关于CSS(14)如何完成常规的页面布局

目录 基本布局方式 前言 准备工作 管理系统界面 APP界面 区域内的滚动条 结束语 基本布局方式 前言 通过上一次学习如何让页面适应任意屏幕的学习&#xff0c;我们就可以开始学习如何用代码“画”出基本的框架了。本期主要分享如何绘制基本的PC端管理系统和移动端APP的…

新颖的 setTimeout() 替代方案

在前端开发中&#xff0c;长时间运行的JavaScript任务一直是一个棘手的问题。它们会导致页面无响应&#xff0c;影响用户体验。传统上&#xff0c;开发者使用setTimeout()来分割长任务&#xff0c;但这种方法存在明显的缺陷。最近&#xff0c;Chrome 129引入了一种新的、更高效…

机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)

机器学习面试笔试知识点-线性回归、逻辑回归Logistics Regression和支持向量机SVM 一、线性回归1.线性回归的假设函数2.线性回归的损失函数(Loss Function)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归的使…

视频云存储/音视频流媒体视频平台EasyCVR视频汇聚平台在欧拉系统中启动失败是什么原因?

视频监控/视频集中存储/磁盘阵列EasyCVR视频汇聚平台具备强大的拓展性和灵活性&#xff0c;支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xff0c;这为其在各种复杂环境下的部署提供了便利。 安防监控EasyCVR视频汇聚平…

分布式数据库安全可靠测评名录之平凯数据库(TiDB企业版)

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/d052ee0b 2024 年 9 月 30 日&#xff0c;中国信息安全测评中心公布安全可靠测评结果公告&#xff08;2024年第2号&#xff09;&#xff0c;其中包含 6 款集中式数据库和 11 款分布式数据…

鸿蒙网络编程系列30-断点续传下载文件示例

1. 断点续传简介 在文件的下载中&#xff0c;特别是大文件的下载中&#xff0c;可能会出现各种原因导致的下载暂停情况&#xff0c;如果不做特殊处理&#xff0c;下次还需要从头开始下载&#xff0c;既浪费了时间&#xff0c;又浪费了流量。不过&#xff0c;HTTP协议通过Range…

信息安全工程师(58)网络安全漏洞处置技术与应用

前言 网络安全漏洞处置技术与应用是一个复杂而关键的领域&#xff0c;它涉及漏洞的发现、评估、修补以及后续的监控与防范等多个环节。 一、网络安全漏洞发现技术 网络安全漏洞发现技术是漏洞处置的首要步骤&#xff0c;它旨在通过各种手段识别出网络系统中存在的潜在漏洞。这些…

jupyter notebook远程连接服务器

jupyter notebook远程连接服务器 文章目录 jupyter notebook远程连接服务器jupyter是什么配置步骤安装jupyter生成jupyter配置文件编辑jupyter配置文件设置密码ssh隧道 启动顺序jupyter添加kernel下载ipykernel包添加kernel 测试遇到的问题 jupyter是什么 Jupyter Notebook是一…

数据结构之队列(python)

华子目录 1.队列存储结构1.1队列基本介绍1.2队列的实现方式 2.顺序队列2.1顺序队列的介绍2.2顺序队列的简单实现2.3代码实现 3.链式队列和基本操作3.1链式队列数据入队3.2链式队列数据出队3.3队列的链式表示和实现 1.队列存储结构 1.1队列基本介绍 队列的两端都"开口&qu…

FFmpeg 4.3 音视频-多路H265监控录放C++开发三 :安装QT5.14.2, 并将QT集成 到 VS2019中。

一&#xff0c;安装QT&#xff0c; 重点&#xff1a;在安装QT的时候要安装msvc201x版本的组件&#xff0c; 二 &#xff0c; 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三&#xff0c;需要安装过 windows10 SDK&#xff0c;一般我们在安装vs2019的时候就…

餐饮店怎么标注地图位置信息?

随着市场竞争的日益激烈&#xff0c;商家若想在竞争中脱颖而出&#xff0c;就必须想方设法去提高自身的曝光度和知名度&#xff0c;为店铺带来更多的客流量。其中&#xff0c;地图标注便是一种简单却极为有效的方法。通过在地图平台上添加店铺位置信息&#xff0c;不仅可以方便…

电子级异丙醇溶液除硼树脂

电子级异丙醇溶液的净化除杂是一个精细的过程&#xff0c;旨在去除溶液中的杂质&#xff0c;以满足电子行业对高纯度化学品的严格要求。以下是电子级异丙醇溶液净化除杂的相关信息&#xff1a; 净化除杂方法 ● 精馏工序&#xff1a;通过精馏塔进行初步分离&#xff0c;去除大部…

(44)MATLAB读取语音信号进行频谱分析

文章目录 前言一、MATLAB代码二、仿真结果画图三、频谱分析 前言 语音信号是我们最常见的一种信号&#xff0c;本文使用MATLAB读取一段语音信号画出其波形&#xff0c;然后使用FFT变换给出其频谱&#xff0c;对其频谱进行分析。 一、MATLAB代码 读取语音数据并得出频谱的代码…

JMeter如何设置HTTP代理服务器?

1、 2、添加线程组 3、设置HTTP代理服务器&#xff0c;目标控制器选择“测试计划>线程组” 过滤掉不需要的信息 4、设置电脑手动代理 5、点击启动&#xff0c;在浏览器操作就可以了

Halcon实战——基于NCC模板匹配的芯片检测(附源码)

Halcon实战——基于NCC模板匹配的芯片检测&#xff08;附源码&#xff09; 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&am…

OpenCV高级图形用户界面(10)创建一个新的窗口函数namedWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个窗口。 函数 namedWindow 创建一个可以作为图像和跟踪条占位符的窗口。创建的窗口通过它们的名字来引用。 如果已经存在同名的窗口&am…

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…