UART配置流程

        S3C2440A 的通用异步收发器(UART)配有3 个独立异步串行I/O(SIO)端口,每个都可以是基于中断或基于DMA 模式的操作。换句话说,UART 可以通过产生中断或DMA 请求来进行CPU 和UART 之间的数据传输。UART 通过使用系统时钟可以支持最高115.2Kbps 的比特率。如果是外部器件提供UEXTCLK 的UART,则UART可以运行在更高的速度。每个UART 通道包含两个的64 字节的FIFO 给发送和接收。

        作为最基本的外设,S3C2440A 的通用异步收发器(UART )配有3 个独立异步串行I/O 端口。不同于51,2440的每个UART均不占用定时器来产生波特率。并且每个UART都拥有一个独立用于收发的缓冲区FIFO。本节我们就使用mini2440携带的uart0,实现一个与pc双向通信的串口程序。实现波特率为9600,n,8,1。为了方便,本次实验不使用FIFO。

FIFO模式中,缓冲寄存器的64字节都用于FIFO寄存器。

非FIFO模式中,只有1个字节用于保持寄存器。

        上图所示的外设总线是指地址控制总线,也就是我们访问寄存器时使用的地址转换为实际信号的总线。通过该总线可以访问到控制单元,其实就是之后我们要用的一堆寄存器。它们可以用来控制波特率发生器,读取收到的数据,写入我们要发送的数据。数据进入发送保持寄存器之后,会自动进入发送位移器,然后数据就按照串口通信的时序从硬件引脚上逐次发送出去了。

上图UART线路控制寄存器ULCONn决定通信所需的奇偶校验位、数据位、停止位等信息。红外模式是2440专门为红外设备设计的,这里我们使用普通模式。

UART控制寄存器是一个非常重要的寄存器,内容比较多,而且中文手册不全。我们参考英文手册并从后向前分析这个寄存器的作用。

UART控制寄存器的低四位用于指定串口收发时的工作方式,分别是不使能接收,中断或查询方式和DMA方式。这里我们不用DMA方式,并且还要允许接收,自然是设置为01了。[3:2]两个比特于此类似,不过是用于设置发送的。之后我们将模仿在51中的做法,用查询方式发送,用中断方式接收。

UART控制寄存器UCONn的4~9位就比较简单了,分别设置为正常传输、正常操作、不产生接收错误状态中断和脉冲方式。使用脉冲而不是电平很显然是因为不能在正在收数据的时候产生中断,而是应该在数据接收完整之后再产生中断。

UART控制寄存器UCONn的10~15比特看着很复杂的样子,起始这一块主要是用于设置波特率的。[11:10]用于选择uart的时钟源的。分别是PCLK,UEXTCLK和FCLK。这里的UEXTCLK指的是外部时钟,PCLK和FCLK在时钟配置主题中我们设置成了400M和50M。一旦时钟被选择,那么波特率就可以通过公式(int)( 被选时钟/ (波特率* 16)) – 1来计算,并将这个公式计算的结果存入UBRDIVn寄存器。比如我们选择使用PCLK,即50M,波特率为9600,那么公式计算的结果就是324.52,取整得325,把这个数存到UBRDIVn波特率就设置好了,简直不要太方便。如果我们把uart的时钟设置为FCLK,那么uart的实际工作频率就由该寄存器的[15:12]决定,有兴趣的读者可以自行尝试。

uart状态寄存器是用来查询uart的状态的,第2比特可用于判断数据是否发送完毕,类似于51的RI,同理,第1比特和第2比特的区别在于一个是位移寄存器为空,另外一个是位移寄存器不一定为空。


发送数据缓冲寄存器:类似51的SUBF寄存器,要发送的数据写入这个寄存器,2440会自动把数据放入位移寄存器发送。

    接收缓冲寄存器:接收到的数据从这个寄存器读出来。


波特率分频寄存器用于保存我们计算好的那个初值。上面说过,这个初值在9600下是325。
此外,由于需要使用引脚产生实际信号,UART对应的GPIO也要设置好;在数据接收时需要使用中断,所以相关的中断也要配置好。UART在中断设置方面需要注意的是UART中断有子终端掩码和子终端挂起寄存器。因此在设置和处理中断时要加以处理。

至此,时钟的配置已经完成。

void init_uart0(void)
{unsigned int t;GPHCON &= ~(0x0F << 4);GPHCON |= (2 << 4) | (2 << 6);t = ULCON0;t &= ~((1 << 6) | (7 << 3) | (1 << 2)) ;t |= (3 << 0);ULCON0 = t;t = UCON0;t &= ~((3 << 10) | (3 << 8) | (0x0F << 4));t &= ~(0x0F << 0);t |= (1 << 2) | (1 << 0);UCON0 = t;UBRDIV0 = 325;INTSUBMSK &= ~(1 << 0);enable_irq(28);register_irq(28, uart0_handler);pos = 0;
}

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

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

相关文章

CUDA并行架构

一、CUDA简介 CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。 二、串并行模式 高性能计算的关键是利用多核处理器进行并行计算。 串行模式&#…

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…

vue3 vxe-grid 通过数据库返回的列信息,生成columns,并且其中有一列是img类型,进行slots的格式化处理。

1、一般我们写死的列信息的时候&#xff0c;会这样定义&#xff1a; 2、然后我们在template里面&#xff0c;这样这样写slots格式化部分&#xff1a; 这样表格中就会展示出一张图片&#xff0c;并且&#xff0c;我们点击了可以查看大图。 3、那么我们从数据库中返回的列&#…

maxwell 输出消息到 kafka

文章目录 1、kafka-producer2、运行一个Docker容器&#xff0c;该容器内运行的是Zendesk的Maxwell工具&#xff0c;一个用于实时捕获MySQL数据库变更并将其发布到Kafka或其他消息系统的应用3、进入kafka容器内部4、tingshu_album 数据库中 新增数据5、tingshu_album 数据库中 更…

RHCS认证-Linux(RHel9)-Ansible

文章目录 一、ansible 简介二 、ansible部署三、ansible服务端测试四 、ansible 清单inventory五、Ad-hot 点对点模式六、YAML语言模式七、RHCS-Ansible附&#xff1a;安装CentOS-Stream 9系统7.1 ansible 执行过程7.2 安装ansible&#xff0c;ansible-navigator7.2 部署ansibl…

Docker UI强大之处?

DockerUI是一款由国内开发者打造的优秀Docker可视化管理工具。它拥有简洁直观的用户界面&#xff0c;使得Docker主机管理、集群管理和任务编排变得轻松简单。DockerUI不仅能展示资源利用率、系统信息和更新日志&#xff0c;还提供了镜像管理功能&#xff0c;帮助用户高效清理中…

清华大学开源视频转文本模型——CogVLM2-Llama3-Caption

通常情况下&#xff0c;大多数视频数据并不附带相应的描述性文本&#xff0c;因此有必要将视频数据转换为文本描述&#xff0c;为文本到视频模型提供必要的训练数据。 CogVLM2-Caption 是一个视频字幕模型&#xff0c;用于为 CogVideoX 模型生成训练数据。 文件 使用 import i…

计算机毕业设计 校运会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式&#xff0c;这里推荐flvAnalyser。其支持&#xff1a; 1.FLV 文件分析&#xff08;Tag 列表、时间戳、码率、音视频同步等&#xff09;&#xff0c;HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01)&#xff1b; 2.RTMP/HTT…

Linux突发网络故障常用排查的命令

测试环境 系统&#xff1a;Ubuntu 18硬件&#xff1a;单核2G ping 用于测试客户机和目标主机通信状况&#xff0c;是否畅通。以及测量通信的往返时间&#xff0c;判断网络质量的好坏。 它通过发送ICMP回显请求消息到目标主机&#xff0c;并等待返回的ICMP回显回复消息。 pin…

DeiT:Data-efficient Image Transformer(2020),基于新型蒸馏的ViT

Training data-efficient image transformers & distillation through attention&#xff1a;通过注意力训练数据高效的图像转换器和蒸馏 论文地址&#xff1a; https://arxiv.org/abs/2012.12877 代码地址&#xff1a; https://github.com/facebookresearch/deit 这篇论文…

k8s介绍-搭建k8s

官网&#xff1a;https://kubernetes.io/ 应用部署方式演变 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&#xff0c;很难合理地分配计…

简单的spring缓存 Cacheable学习

简单的spring缓存 Cacheable学习 1.需求 项目中有很多的方法查询的数据其实是不会经常变的&#xff0c;但是其整体的查询sql以及调用第三方数据获取数据花费的时间很长&#xff0c;现在考虑对此类型的接口进行优化&#xff0c;首先想到的是对其进行缓存操作&#xff0c;所以简…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中&#xff0c;SEMCMS_Images.php的search参数&#xff0c;以及SEMCMS_Products.php的search参数&#xff0c;存在sql注入漏洞。 &#xff08;这个之前就有两个sql的cve&#xff0c;这次属于是捡漏了&#x1f6…

[vulnhub] Hackademic.RTB1

第一次打靶机&#xff0c;思路看的红队笔记 https://www.vulnhub.com/entry/hackademic-rtb1,17/ 环境&#xff1a;kali Linux - 192.168.75.131&#xff0c;靶机 - 192.168.75.132 主机发现和端口扫描 扫描整个网络有哪台机子在线&#xff0c;不进行端口扫描 nmap -sP 192.16…

JavaSE高级(3)——lombok、juint单元测试、断言

一、lombok的使用 默认jvm不解析第三方注解&#xff0c;需要手动开启 链式调用 二、juint单元测试 下载juint包 public class TestDemo {// 在每一个单元测试方法执行之前执行Beforepublic void before() {// 例如可以在before部分创建IO流System.out.println("befor…

力扣周赛 —— 416

前言 只做出了第一道&#xff0c;第二第三道都超时。 痛&#xff0c;太痛了。 题目 Q1.举报垃圾信息 给你一个字符串数组 message 和一个字符串数组 bannedWords。 如果数组中 至少 存在两个单词与 bannedWords 中的任一单词 完全相同&#xff0c;则该数组被视为 垃圾信息。…

HTML讲解(三)通用部分

目录 1.空格标记 2.特殊文字的标记 3.注释语句 4.对文字字体的设置 5.修改文字形态 6.换行标记 7.居中标记 8.水平线标记 9.设置滚动弹幕 1.空格标记 在HTML中&#xff0c;我们想打印空格并不能直接敲一个空格键&#xff0c;因为如果是敲空格键&#xff0c;那无论你敲…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索&#xff08;解决办法&#xff09; 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢&#xff1f; 几次探索 尝试通过找到节点之后&#xff0c;使用 click 事件&#xff0c;失败了 // 伪代码如下 const handleFindNodeAndClick …