S3C2440的串口通信(UART)

news2024/11/28 19:01:59

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、UART
  • 二、2440的uart资源
    • 2.1.uart配置流程
    • 2.2 RS232
    • 2.3 RS232接口
  • 三. UART编程实现(无缓存)
  • 四. UART编程实现(中断)
  • 总结


前言


UART是通用异步收发器,它可以用作中断和主机之间的通信,因此得到了极其广泛的应用;

一、UART

uart是异步收发器,按照异步串行通信标准进行数据收发的电路;

异步串行通信标准 :115200(传输波特率)   
								  8(8bit传输) 
								  n(n表示无校验,e表示偶校验,o表示奇校验)
								  1 表示1为停止位
				  闲时为高   低位先发

start +  数据 + 校验 + stop
1位    5-8位    1位    1 、1.5 、2
低             可以无    高

二、2440的uart资源

2.1.uart配置流程

2440 有3个独立的uart

条件:
1. 协议初始化  115200  8  n  1
		ULCONn  8  n  1
 UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
2. 发送和接收数据缓存区
	UTXH  URXH
3. 发送和接收的操作时刻
	UTRSTATn  第1位 发送操作 0 正在发送  1发送完毕  
					    第0位 接收操作 0没有数据  1接收到数据
4. 电路使能  UCON 第3-2位发送使能  1-0位接收使能

2.2 RS232

rs232 异步串行全双工点对点通信协议,完成主机间通信;
电气特性如下:
-3v — -15v 表示1
+3v — +15v 表示0

rs232传输距离需要在15米以内距离短是rs232的缺点之一。实际使用其实就是1m左右;

RS-232还具有的缺点:

(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接(2440用到了max232芯片,将单片机输出的TTL电平转换成PC机能接收的232电平或将PC机输出的232电平转换成单片机能接收的TTL电平。)。
(2)传输速率较低,在异步传输时,波特率为20Kbps;
(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。

2.3 RS232接口

RS232接口是PC机上串行接口标配,有DB9和DB25两种,通常为DB9;在本期分享中我也正是使用db9来实现串口通信的;下面是rs232的接口定义;
在这里插入图片描述
接下来看一下DB9接口的定义:
在这里插入图片描述
这里主要用到的实际是:2-rx 3-tx 5-gnd

uart有三个中断信号:uart使用中断的方式实现;
rx中断–》接收够数据 超时
tx中断–》发完数据
出错–》接收出错
从图上可知,GPH2和GPH3为UART的发送和接受引脚;
在这里插入图片描述
在这里插入图片描述

三. UART编程实现(无缓存)

这里先给出代码的原理,uart初始化的流程:
(1)配置具有uart功能的口为uart功能;如下图所示:
在这里插入图片描述
(2)设置uart的通信波特率,数据位,校验以及停止位;
UBRDIV0:设置分频倍数,这里设置为115200,结果取整数为26;
在这里插入图片描述
ULCON0:用来控制数据位,校验以及停止位;
UCON0:设置为中断轮询模式,且为pclk工作(50M)
在这里插入图片描述
UTRSTAT0:用来查看缓存区状态;
在这里插入图片描述
URXH0和UTXH0分别为发送和接收的缓冲寄存器,发送数据和接收到的数据都通过这两个寄存器进行运输;
在这里插入图片描述
代码如下:

#include "uart.h"

void uart_init()
{
	//IO 功能
	GPHCON &= ~0xf0;
	GPHCON |= 0xa0;     //设置GPH2/GPH3为 uart功能
	ULCON0 = 0x3; 		//8  n  1
	UBRDIV0 = 26;		//115200
	UCON0 = 0x5;  		//pclk工作 使能电路
}

void send_byte(char info)
{
	while(!(UTRSTAT0&2));  //阻塞等待发送完毕
	UTXH0 = info;		   //uart会自动发送
}

char recv_byte()
{
	char info = -1;
	while(!(UTRSTAT0&1));  //阻塞等待接收完毕
	info = URXH0;
	send_byte(info);	   //回显
	return info;
}

测试代码如下:

int main(void)
{
	char info = 'a';
	led_init();
	uart_init();
	while(1)
	{
		if (info > 'z')
		{
			info = 'a';
			send_byte('\n');
			send_byte('\r');
		}
		send_byte(info);
		delay(0x5ffff);
		info ++;
}

串口打印的现象为a-z的循环输出;

四. UART编程实现(中断)

大家到这里先可以了解一下中断的实现方式,到后续会具体对中断的实现机制做出详细介绍;

#include "uart.h"


void uart_init()
{
	//IO 功能
	GPHCON &= ~0xf0;
	GPHCON |= 0xa0; //设置GPH2/GPH3为 uart功能
	ULCON0 = 0x3; //8  n  1
	UBRDIV0 = 26;//115200
	UCON0 = 0x5;  //pclk工作 使能电路
	INTSUBMSK &= ~0x1; //使能uart0的rx中断
	INTMSK &= ~(1<<28);//使能uart0中断
}

void send_byte(char info)
{
	while(!(UTRSTAT0&2));  //阻塞等待发送完毕
	UTXH0 = info;//uart会自动发送

}


char recv_byte()
{
	char info = -1;
	while(!(UTRSTAT0&1));  //阻塞等待接收完毕
	info = URXH0;
	send_byte(info);
	return info;
}

void puts_(char * info)
{
	while(1)
	{
		if (*info == '\0')
			break;
		send_byte(*info);
		info++;
	}
}

void do_uart()
{
	char info = -1;
	info = URXH0;
	send_byte(info);
	SUBSRCPND |= 1;
	SRCPND |= 1<<28;
	INTPND |= 1<<28;		
}

总结

本期主要分享的是关于S3C2440的UART编程以及UART的硬件相关知识,它是一种非常常用的通信方式,有了这个串口通信方式,在后续学习中就可以对程序进行调试;希望小伙伴们掌握好UART的编程流程,加油哦!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

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

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

相关文章

Python多线程 threading 和多进程 multiprocessing

1. 并发 vs 并行 线程是程序执行的最小单位&#xff0c;一个进程可以由一个或多个线程组成&#xff0c;各个线程之间也是交叉执行。 并发&#xff0c;相当于单核CPU&#xff0c;宏观同时执行&#xff0c;微观高速切换 交替执行。多线程、高并发这些词语更多地出现在服务端程序…

机器学习(十七):实操_在Sklearn中的实现CART树的基本流程

全文共8000余字&#xff0c;预计阅读时间约16~27分钟 | 满满干货(附代码)&#xff0c;建议收藏&#xff01; 代码下载点这里 一、介绍 CART&#xff08;Classification and Regression Trees&#xff09;即分类回归树&#xff0c;是一种重要的机器学习算法&#xff0c;既可以…

3.8 Bootstrap 面包屑导航(Breadcrumbs)

文章目录 Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; Bootstrap 面包屑导航&#xff08;Breadcrumbs&#xff09; 面包屑导航&#xff08;Breadcrumbs&#xff09;是一种基于网站层次信息的显示方式。以博客为例&#xff0c;面包屑导航可以显示发布日期、类别或…

解决win10系统中ping localhost被解析为 ::1的问题

目录 问题描述 问题分析 解决方案 一、修改host文件 二、修改注册表 三、修改IPv6的优先级 问题描述 本机为win10系统&#xff0c;在命令行窗口ping localhost时&#xff0c;本机IP127.0.0.1被解析为了 ::1的问题 1、在命令行窗口 ping 127.0.0.1 2、在命令行窗口 ping…

Linux常用命令——ed命令

在线Linux命令查询工具 ed 单行纯文本编辑器 补充说明 ed命令是单行纯文本编辑器&#xff0c;它有命令模式&#xff08;command mode&#xff09;和输入模式&#xff08;input mode&#xff09;两种工作模式。ed命令支持多个内置命令&#xff0c;常见内置命令如下&#xff…

leetcode 59.螺旋矩阵

记录一下&#xff0c;觉得倒水思想来做 总体看起来还是比较清晰的。 class Solution { public:vector<vector<int>> generateMatrix(int n) {int a[4][2] {{0,1}, {1,0}, {0,-1},{-1,0}};int direction0; //方向int num0;int S n*n;int x 0;int y 0;vector<…

解析基因影响:孟德尔随机化的创新思维

一、引言 在当今的遗传学和生物学研究中&#xff0c;我们对基因对个体特征和性状的影响的理解变得更加深入。然而&#xff0c;基因影响的复杂性和多样性给我们带来了巨大的挑战。为了更好地揭示基因影响的本质和机制&#xff0c;我们需要采用创新的研究思维和方法。 本文的目的…

听GPT 讲K8s源代码--pkg(四)

/pkg/controlplane、/pkg/credentialprovider、/pkg/kubeapiserver是Kubernetes中的三个核心包&#xff0c;它们分别实现了不同的功能。 /pkg/controlplane包 /pkg/controlplane是Kubernetes的一个包&#xff0c;它包含了控制平面组件的实现&#xff0c;例如API Server、Contro…

妙记多 Mojidoc 模版投稿活动招募

妙记多 Mojidoc 开始征集模板啦! 快来投稿吧&#xff01;&#x1f389;&#x1f389;&#x1f389; 优秀模板将被选录进官方模板中心&#xff0c;让你的灵感和创意被更多人看见&#xff01;选录后&#xff0c;你可直接解锁「高级体验官」称号&#xff0c;并有机会获得妙记多 M…

IDELAYG/ODELAY/IDELAYCTRL

如下是7系列FPGA HP Bank I/O 资源&#xff1a; 其中ILOGIC是由许多的数据选择器和一个IDDR触发器构成。 在HP BANK中&#xff0c;ILOGIC被称为ILOGICE2&#xff0c;在HR BANK中&#xff0c;ILOGIC被称为ILOGICE3 IDELAY 简单介绍 输入信号延迟模块。每个I/O模块都包含了一…

内存分区,编译链接,ARCMRC,消息传递消息转发,对象的底层

文章目录 前言内存分区栈区堆区全局区文字常量区程序代码区运行之前运行之后 编译&#xff0c;链接编译的过程链接 ARC&#xff0c;MRC在编译期干了什么 对象的底层消息传递&#xff0c;消息转发消息转发消息传递IMP指针IMP与SEL的区别与联系 前言 对第一周学习内容做个概括 提…

no module named paddle pip install paddlepaddle报错

!python -m pip install paddlepaddle2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Python实战项目——餐厅订单数据分析(一)

项目背景 餐厅经营的好坏需要用数据来说明&#xff0c;如果一个餐厅生意惨淡&#xff0c;那么应该先收集最近的数据&#xff0c;然后进行数据分析&#xff0c;再对应相应出现的问题进行解决和做出对应的商业调整。今天开始我们分析一来家餐厅的数据。 认识数据并预处理 拿到…

GUI-Menu菜单实例

运行代码&#xff1a; //GUI-Menu菜单实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window…

Appium+python自动化(十二)- Android UIAutomator终极定位凶器(超详解)

简介 乍眼一看&#xff0c;小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了&#xff0c;其实不然&#xff0c;上次介绍和分享的大哥是uiautomatorviewer&#xff0c;是一款定位工具。今天介绍的是一个java库&#xff0c;提供执行自动化测试的各种API。 Android团队在4…

小程序控制台警告:DevTools failed to load SourceMap(控制台报错DevTools 无法加载来源映射)

在调试项目的时候&#xff0c;控制台报错:**DevTools failed to load SourceMap: Could not load content for http://xxx.js. 这段报错的意思是dev工具未能成功加载source map&#xff08;文件映射&#xff09;。这里的报错实际上和项目本身的代码没有任何关系&#xff0c;而是…

基于 Fedora 38 的预期版本 Nobara 38 发布

导读基于 Fedora 38 的预期版本 Nobara 38 终于发布了&#xff0c;它带来了一系列用户友好的修复和功能增强。Nobara 是 Fedora Linux 的修改版本&#xff0c;旨在解决用户面临的常见问题&#xff0c;并提供开箱即用的顺滑的游戏、流媒体和内容创建体验。凭借一系列附加软件包和…

HTTP 缓存机制 强制缓存/协商缓存

Web 缓存大致可以分为&#xff1a;数据库缓存、服务器端缓存&#xff08;代理服务器缓存、CDN 缓存&#xff09;、浏览器缓存。 浏览器缓存也包含很多内容&#xff1a; HTTP 缓存、indexDB、cookie、localstorage 等等。这里我们只讨论 HTTP 缓存相关内容。 在具体了解 HTTP …

美国电动汽车公司Lucid在中国市场的投资机会

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;Lucid计划进入快速增长的中国电动汽车市场&#xff0c;未来可能会加速交付和收入增长。 &#xff08;2&#xff09;中国人口众多&#xff0c;电动汽车采用率高&#xff0c;政府…

深度学习开发环境

Ubuntu搭建深度学习开发环境(Pytorch Tensorflow GPU版本) 显卡驱动系列 深度学习主要涉及到显卡的使用(如开发时使用GPU版本库&#xff0c;就需要提前安装好显卡驱动方可使用)&#xff0c;所以这里主要说明显卡驱动的安装。 显卡驱动(Driver) | 官网:显卡驱动下载CUDA(NVID…