UART 16550的使用

news2024/12/26 23:03:15

前言

本文从操作系统使用 16550 的角度来学习 16550。主要解析通用的串口寄存器的作用。

16550 串口由一系列寄存器控制串口行为。不同的具体设备寄存器的偏移不同,寄存器的长度可能不同。
例如,在 AXI UART 16550中,各寄存器长度都为 32 bit,各寄存器详细信息如下表所示:
在这里插入图片描述
在 byterunner 提供的文档中,各寄存器的长度为 8 bit。详细信息如下所示:

在这里插入图片描述

16550 简介

UART(Universal Asynchronous Receiver/Transmitter)是一种常用的串行通信接口,用于在设备之间进行数据传输。它能够将并行数据转换为串行数据,以便通过一条通信线路发送,并在接收端再将串行数据转换回并行数据。
16550 是 UART 的一种标准实现,它定义了一系列特性,如数据缓冲区、错误检测机制等,以提高数据传输的可靠性。由于其广泛的应用和成熟的技术,16550 成为了事实上的标准,被大多数个人计算机采用。

在这里插入图片描述
上图为一个 16550 实现的引脚图,其兼容当前工业 16550 标准。允许配置 FIFO,队列大小默认为 16,代表输入和发送队列可同时存在的数据为 16 个字节。

16550 数据传输控制

数据传输形式:不论输入或输出,首先以开始一位的 0 bit 打头表示数据传输开始。其次是用户配置的可能为 5bit、6bit、7bit、8bit 的字符数据。若用户配置了使用奇偶校验,奇偶校验位会出现在数据传输中的 bit 位之中。最后是 1bit 或 多 bit 的 stop bit 停止位 用于表示传输结束。

数据传输的更多控制可以通过 LCR 寄存器实现,全称 Line Control Register

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1和 Bit0
LCRdivisor latch Access Bitset breakset parityeven parityparity enablestop bitsword length

1 bit 和 0 bit 的组合: 00、01、10、11分别代表 5bit、6bit、7bit、8bit 的字长。
2 bit 为0,则数据传输结束时的 stop bit 数量为 1。若该位为 1,则除 5bit 字长发送 1.5 个 stop bit 之外,其余字长均发送两个 stop bit。
5bit 到 3bit 的组合:xx0表示禁用奇偶校验,001表示奇校验,011表示偶校验。其余暂不考虑。
6bit 位被设置(即为1),它会在传输线上强制产生一个“断开”(Break)条件。这意味着串行输出引脚(TXD)会被强制到空闲状态(通常是逻辑0)。
7bit 除数值访问位,此bit 置为 1,则可以访问 DLL 寄存器和 DLM 寄存器。下面会详细介绍。

16550 数据传输流

数据传输流中主要涉及三个寄存器:THRRHRLSR 寄存器,全称分别为 Transmit Holding RegisterReceive Holding RegisterLine Status Register,下面会慢慢介绍。

数据输出流程:串口待输出数据位于 THR(Transmit Honding Register) 寄存器。经由 TSR(Transmit Shift Register) 寄存器通过移位为主的操作变为串行数据放在 txd 引脚以串行数据形式送出串口。起始位,停止位以及如果开启奇偶校验,则奇偶校验数据也会随数据发送。

数据输入流程:串口输入数据经由输入引脚 rxd 串行输入,数据由 RSR(Receive Shift Register) 寄存器接收,并通过以移位为主(可能包含奇偶校验等其余操作)的操作把数据还原为字的形式存储在 RSR 中。一旦数据达到用户配置的 5bit、6bit、7bit、8bit 字大小,若 RHR(Receive Holding Register) 寄存器不空,则会把数据送往 RHR 寄存器。

LSR 寄存器负责提供数据传输的状态给 CPU
当数据接收完毕,LSR(Line Status Register) 寄存器的一些 bit 会指示是否在接收过程中发生错误。
同时在数据接收和发送尚未发生时,LSR(Line Status Register) 寄存器的一些 bit 会指示发送和接收寄存器的状态。
具体如下:

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
LSR0/FIFO Errortransmit emptytransmit holding emptybreak interruptframing errorparity erroroverrun errorreceive data ready

0:receive data ready:有数据已经被接收并存储在 RHR 寄存器。
1:Overrun Error:当UART接收到一个新的字符并且试图将其存储在接收缓冲区中时,如果微处理器(或CPU)未能及时从接收保持寄存器(RHR)中读取先前接收到的字符,就会发生溢出错误。
2:parity error:奇偶校验错误
3:framing error:帧格式错误发生在接收端检测到停止位不是预期的逻辑电平(通常是高电平 逻辑1)时。
4:break interrupt:当 RXD(接收数据)引脚被持续保持在一个低电平(逻辑0)超过一个完整字符的时间长度时,就会触发断开中断。
5:transmit holding empty:该 bit 为1,则THR 寄存器为空,否则 THR 寄存器不空
6:transmit empty:该 bit 为 1,则 THR 寄存器和 TSR 寄存器都为空。在 FIFO 模式下该 bit 一直为 1,不论 THR 和 TSR 的状态是否为空。
7:0/FIFO Error:该 bit 为 1,则在 FIFO 中至少发生了四种错误的一种。

波特率配置

波特率表示每秒传输的 bit 数。同一个 16550 设备支持多种不同的波特率配置,用户可自行配置。波特率配置中涉及两个寄存器,DLL 和 DLM,全称分别为 Divisor Latch (Least Significant Byte) Register 除数锁寄存器低位和 Divisor Latch (Most Significant Byte) Register 除数锁寄存器高位。

除数值和时钟频率以及波特率之间的计算公式为: D i v i s i o r = 输入时钟频率 / ( 16 × 所需波特率 ) Divisior={{输入时钟频率} /({16 × 所需波特率})} Divisior=输入时钟频率/(16×所需波特率)

1.8432 M H Z 1.8432MHZ 1.8432MHZ 的输入频率以及 9600 9600 9600 波特率为例,除数值为: 1843200 / ( 16 ∗ 9600 ) = 12 1843200 / (16 * 9600) = 12 1843200/(169600)=12

DLL 寄存器和 DLM 寄存器分别存储除数值的低 8 bit 和 高 8 bit。访问这两个寄存器,需要 LCR 寄存器的最高 bit 置为1。该 bit 含义为 DLAB,全称为 Divisor Latch Access Bit

另外,访问 THR 和 RHR 这两个寄存器时,要始终保持 DLAB 这个 bit 位为 0。否则重叠的寄存器地址会使得寄存器访问到 DLL 和 DLM。

下表为 byteRunner 提供的寄存器偏移供参考,具体的 16550 实现可能不同,以及各寄存器的读写权限。左侧为只读,右侧为只写。
在这里插入图片描述

16550六种信号

信号用于UART 和 调制解调器之间的通信,主要涉及 MCR 调制解调器控制和 MSR 调制解调器状态寄存器,全称分别为 Modem Control Register 和 Modem Status Register。
两种流向调制解调器的信号:
DTR(Data Terminal Ready): DTR信号通常用来告诉调制解调器,终端设备(如计算机)已经准备好通信了。
Request To Send (RTS):RTS信号通常用于通知调制解调器,终端设备希望开始发送数据。

MCR寄存器的 0bit 位用于控制 DTR 信号,其为 1,则发送 DTR 信号。MCR 寄存器的 1bit 用于控制 RTS 信号,其为1,则发送 RTS 信号。

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
MCR000loop backOUT2OUT1RTSDTR

(MCR 寄存器其余 bit 位由后面详细解释)

四种由调制解调器发出的信号:
Clear To Send (CTS):清除发送信号,由调制解调器发出,表明现在可以安全地开始传输数据。
Data Set Ready (DSR):数据设备准备好信号,表明调制解调器已经准备好进行通信。
Ring Indicator (RI):通知计算机或相关设备有呼叫或消息到达。
Carrier Detect (CD):载波检测信号,表明调制解调器检测到了来自远程调制解调器的载波信号。

根据 MSR 寄存器的内容可以读取调制解调器的信号。MSR 寄存器 0bit 用于表示 CTS 信号发生变化,MSR 寄存器 1bit 用于表示 DSR 信号发生变化,MSR 寄存器 2bit 用于表示 RI 信号发生变化,MSR 寄存器 3bit 用于表示 CD 信号发生变化。MSR 寄存器 4bit 用于表示调制解调器的 CTS 信号。MSR 寄存器 5bit 用于表示调制解调器的 DSR 信号。MSR 寄存器 6bit 用于表示调制解调器的 RI 信号。MSR 寄存器 7bit 用于表示调制解调器的 CD 信号。具体如下:

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
MSRCDRIDSRCTSdelta CDdelta RIdelta DSRdelta CTS

16550中断

IER 寄存器控制中断使能,即接收哪种类型的中断。寄存器全称为 Interrupt Enable Register。

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
IER0000modem status interruptreceive line status interrupttransmit holding register interruptData Ready

中断优先级按照从高到底依次为:
1:receive line status interrupt,当接收的数据发生错误时会产生这个中断。其与 LSR 寄存器的 bit 1-4 直接相关。
2:Data Ready / Reception Timeout:两个中断源表示同一种情况:有数据待从接收端的 FIFO 读取。
3:Transmitter Holding Register Empty:若未启用 FIFO,该中断表示 THR 寄存器为空。若启用 FIFO 则 FIFO 队列为空。
4: Modem Status:当调制解调器状态发生变化时会产生此中断,该中断与 MSR 寄存器的 bit 0-3 直接相关。

(TimeOut 的发生是由于 FIFO 模式的 16550 会在 FIFO 中有至少一个数据且超过 4 个字传输时间之后仍未接收到新数据时自动发送超时中断)

ISR 寄存器用于获取中断状态。全称为 Interupt Status Register。关于 ISR 部分实现可能功能上更多,我们此处使用 byteRunner 提供的功能介绍。会存在功能上更加扩展,兼容标准 16550 设备存在,其 ISR 寄存器可能会有更多功能,我们不在此处介绍。

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
ISR1100interrupt prior. bit 2interrupt prior. bit 1interrupt prior. bit 0interrupt status

0bit 为0,则有中断存在。为1,则无中断发生。
bit 3-1 的组合分别为:000,表示 Modem Status Interrupt,优先级最低;001表示 TXRDY (Transmitter Holding Register Empty)010表示Data Ready110 表示 Reception Timeout011 表示 receive line status interrupt

FCR 寄存器用于控制 FIFO 的状态。全称为 FIFO Control Register。

RegisterBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
FCRRCVR trigger MSBRCVR trigger LSB00DMA mode selecttransmit FIFO resetreceiver FIFO resetFIFO enable

0bit 为1,则启用 FIFO。在设置 FIFOtrigger level 之前需要先启用 FIFO。
1bit 用于重置 receiver FIFO,内容清零,计数器清零,重置之后该位置为 0。
2bit 用于重置 transmit FIFO,内容清零,计数器清零,重置之后该位置为 0。
3bit 置 1,设置 transmitreceive 工作在模式 1。此时在启用 FIFO 条件下,tramsmit FIFO 满时,tx ready 信号变为高电平,意义为无效,没有空间再放置待传输字符。receiver FIFO 中的字符数量大于等于 trigger level 时,rx ready 信号有效。直到 receicer FIFO 为空。
bit 7-6 用于设置 trigger level,即在 FIFO 中的字符数量达到某个阈值之后,触发中断。00 表示一个字符,01 表示 4 个字符,10 表示8个字符,11 表示14个字符。

另外,很重要的一点,MCR 寄存器中的 OUT1 和 OUT2 是 generous purpose bit 位,即并没有赋特定含义。但在 16550 默认情况下,会设置 OUT2 bit 位 表示全局中断掩码。
因此,在多数情况下,MCR 的 OUT2 在设备启动时很有必要置为 1,否则任何中断都将不会触发。

总结

16550 串口通用寄存器就是这些,还有一些扩展功能包括 DMA tx End 和 DMA rx End 等等留待大家自己解决。
完结撒花!~

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

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

相关文章

overleaf如何下载论文的pdf

用overleaf写完英文论文后,要将论文保存为PDF格式 点击图片中的下载按钮 然后选择一个路径保存论文的PDF格式即可。

测试通用面试题大全

24年软件测试的发展如何? 1、IT行业还会继续升温,高质量人才需求相对还是短缺。 2、要求变高之后,很难再下降了,学历和经验。 3、功能测试之外的东西,接口、性能和自动化要掌握一点。 4、长远来看,软件…

Android Framework(五)WMS-窗口显示流程——窗口布局与计算

文章目录 relayoutWindow流程概览应用端处理——ViewRootImpl::setView -> relayoutWindowViewRootImpl::setViewViewRootImpl::performTraversalsViewRootImpl::relayoutWindow Surface的创建WindowManagerService::relayoutWindow了解容器类型和Buff类型的SurfaceBuff类型…

并发编程 - GCD的栅栏(dispatch_barrier_async)

引言 Grand Central Dispath(GCD)是苹果提供的强大工具,它几乎涵盖了多线程编程的所有方面。通过GCD,我们可以轻松地创建队列、管理线程,并以更优雅的方式处理并发任务。在前面的博客中,我们已经深入探讨了…

基于SpringBoot+Vue+MySQL的校园健康驿站管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot后端、Vue前端与MySQL数据库的校园健康驿站管理系统。该系统旨在通过数字化手段,全面管理学生的健康信息,包括体温监测、疫苗接种记录、健康状况申报等,为…

【Canvas与表盘】绘制黄蓝两色简约表盘

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>黄蓝卡通手表</title><style type"text/css">…

【我的Android进阶之旅】解决CardView四个圆角有白边的问题

文章目录 一、问题描述二、分析CardView出现白边的原因三、如何解决这个问题?3.1 如何修复?3.2 为什么这样可以修复?3.3 示例代码3.4 总结一、问题描述 在实现一个RecycleView的Item时候,样式需要用到卡片式效果,于是想到用CardView来实现,但是最终发现运行出来的效果,…

(微服务项目)新闻头条——Day1

最近发生了很多事情&#xff0c;躺了一阵子&#xff0c;也是终于振作起来做自己的事情了.... 有的人追求精彩而活&#xff0c;而即使瘦若浮游&#xff0c;仍旧痴迷71种滋味&#xff0c;而有的人寿命明却装醉不得自由虚度自己的光阴&#xff0c;年华终究在最后一刻幡然醒悟&…

Android Studio新建工程(Java语言环境)

一、新建工程流程(java语言环境) 1、File->New->New Project 2、选择“Empty Views Activity” -> Next 3、创建项目名称/项目路径/语言环境 1&#xff09;项目名称&#xff1a;使用默认Name 或 修改Name 2) Package name&#xff1a;每个项目的这个名称唯一&…

MySQL 创建数据库和表全攻略

一、MySQL 创建数据库与表的重要性 MySQL 作为广泛应用的关系型数据库管理系统&#xff0c;创建数据库和表具有至关重要的意义。 在数据存储方面&#xff0c;数据库就如同一个巨大的仓库&#xff0c;为各类数据提供了安全、有序的存储环境。通过创建数据库&#xff0c;可以将相…

计算机毕业设计体育资讯个性化推荐网站网站内容留言评论前台注册后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

一、网站内容 ‌个性化推荐‌&#xff1a;根据用户浏览历史和兴趣&#xff0c;推送相关体育资讯。‌丰富资讯‌&#xff1a;包含体育赛事直播、新闻报道、专栏评论等。 二、留言评论系统 ‌用户互动‌&#xff1a;允许用户对资讯进行留言和评论&#xff0c;增强社区互动性。…

python基础知识 (五)--容器、索引、切片、字符串的遍历、查找、修改元素

目录 容器 容器大总结 索引 切片 字符串的遍历 for循环语法&#xff1a; while循环语法&#xff1a; 查找元素 修改元素 例题 1.验证码 2.抽取大红包 3.a和b互换位置 容器 在Python中&#xff0c;常见容器有&#xff1a; &#xff08;1&#xff09;字符串&#x…

k8s的加密配置secret和应用配置configmap

目录 加密配置 secret的三种类型 创建opaque类型的两种方式 方法一 方法二 如何把secret挂载到pod当中 把secret作为环境变量传到pod当中 指定harbor私有仓库加密的secret配置 应用配置 configmap 创建configmap的方式 在pod里面用configmap做pod的环境变量 **用c…

[Linux入门]---使用exec函数实现简易shell

文章目录 1.简易实现2.人机交互&#xff0c;获取命令行3.命令行分割4.执行命令5.内建命令6.myshell代码 1.简易实现 2.人机交互&#xff0c;获取命令行 代码如下&#xff1a; int quit0; #define LEFT "[" #define RIGHT "]" #define LABLE "#&quo…

如何免费试用OpenAI o1 preview大模型

OpenAI于 2024 年 9 月 12 日推出 o1&#xff08;以前称为 Strawberry 项目&#xff09; 。这一系列新推理模型旨在更有效地解决复杂问题。ChatGPT Plus 和 Team 用户可以访问 o1-preview 和 o1-mini&#xff0c;但消息量有限。 OpenAI o1-preview与 GPT-o对比 o1-previewGPT…

Excel 基础知识-操作手册2

十、查找与引用函数 Excel中的查找与引用函数非常丰富&#xff0c;以下是一些主要的函数及其使用示例&#xff1a; 1. **VLOOKUP** - 语法&#xff1a;VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) - 示例&#xff1a;假设A列是员工编号&#xff0c;B…

27 顺序表 · 链表

目录 一、单链表 &#xff08;一&#xff09;概念 1、节点 2、链表的性质 &#xff08;二&#xff09;单链表的实现 &#xff08;三&#xff09;单链表算法题 1、移除链表元素 2、反转链表 3、链表的中间节点 4、合并两个有序的单链表 5、链表分割 6、链表的回文结构…

pdf怎么加页码?5种pdf添加页码指南分享,快来领取!

如何在一个包含大量页面的大型pdf文件中快速找到特定的页面或信息呢&#xff1f;最简便的方法就是为pdf添加页码。pdf添加页码能够清晰显示页面顺序&#xff0c;帮助读者轻松浏览大型pdf文档&#xff0c;同时也便于寻找特定章节和确定整体长度。然而&#xff0c;并非所有pdf文件…

VirtualBox Install MacOS

环境搭建 git clone https://github.com/myspaghetti/macos-virtualbox 脚本配置 修改macos-guest-virtualbox.sh部分内容为 vm_name"macOS" # name of the VirtualBox virtual machine macOS_release_name"Catalina" # install &quo…

PHP 环境搭建教程

搭建一个稳定的PHP开发环境是开发Web应用的基础。在Linux系统上&#xff0c;LAMP&#xff08;Linux, Apache, MySQL/MariaDB, PHP&#xff09;堆栈是最广泛使用的组合。本文将详细介绍如何在Linux上搭建PHP开发环境&#xff0c;涵盖安装步骤、配置和测试。更多内容&#xff0c;…