JZ2440开发板——S3C2440的UART的使用

news2024/11/24 9:42:01

以下内容源于韦东山课程的学习与整理,如有侵权请告知删除。

 

一、UART硬件简介

UART,全称是“Universal Asynchronous Receiver Transmitter”,即“通用异步收发器”,也就是我们日常说的“串口”。

它在嵌入式中用途非常广泛,主要包括:

(1)打印调试信息。

(2)外接各种模块,比如GPS、蓝牙等模块。

UART广受欢迎,因为其结构简单、稳定可靠,通过三根线即可,即发送线、接收线、接地线。

二、数据传输流程

2.1 串口的参数

2.2 数据传输流程

2.3 举例说明(传输字符'A')

这里先简单说一下 TTL/CMOS 电平标准、RS232电平标准:

电平信号是用信号线电平减去参考线电平得到电压差,再由这个电压差决定传输值是1还是0。但是在电平信号时多少V代表1,多少V代表0不是固定的,取决于电平标准。有两个电平标准,即RS232 电平标准和 TTL/CMOS 电平标准。

TTL/CMOS电平标准中,+5V表示1,0V表示0(其实应该是一个电压范围表示1,比如+5V~+3V,而不是只有+5V才表示1,同理0也是)。

RS232电平标准中,-3V~-15V(-12V?)表示1,+3~+15V(+12V)表示0。 

电平标准如何表示"1"如何表示“0”
TTL/CMOS电平+5V ~ X0V ~ Y
RS232-3V ~ -15V(-12V)+3~+15V(+12V)

RS232的电平比TTL/CMOS电平高,抗干扰性更强,能传输更远的距离,因此在工业上用的比较多。

比如字符'A',其对应的编码是0x41,或者0b01000001。采用不同电平标准,其传输的流程如下:

步骤细述如下: 

三、看原理图确定硬件如何连接

(1)ARM芯片上的串口都是TTL电平的,然后通过板子上或者外接的电平转换芯片,转换为RS232接口,连接到电脑的RS232串口上。

比如MINI2440开发板,其串口连接方式如下:

(2)现在的电脑很少配置有采用RS232电平的串口接口 ,但几乎都配置有usb口。因此可以使用USB串口芯片,将ARM芯片上的TTL电平,转换为USB串口协议。也就是开发板可以通过USB口与电脑进行通信。

比如JZ2440,串口连接方式如下: 

由原理图可以看出,JZ2440开发板上将三个串口全部引出,其中UART0设置了板载的USB转串口电路,只需连接板上的USB口就可以,所以接下来我们使用UART0进行数据收发实验。 

四、看芯片手册进行寄存器设置

4.1 设置引脚为UART功能(GPHCON)、开启片内上拉(GPHUP)

由原理可知,UART0的TXD0对应着GPH2引脚,RXD0对应着GPH3引脚。

这两个引脚都是普通的GPIO引脚,因此需要设置引脚复用功能,设置为UART0的引脚:

 

由于串口的两根信号线在空闲的时候需要保持高电平,所以要开启这两个引脚的片内上拉电阻:

4.2 设置串口数据帧的格式(ULCONn寄存器)

我们可以通过ULCONn寄存器,来设置串口数据帧的格式。

比如是否采用红外模式、校验模式、停止位宽度、数据位宽度等内容。

这里的n=0,表示设置串口0的数据帧格式,红框圈出的是编程时采用的设置。 

4.3 设置波特率(UBRDIVn寄存器)

比如已知串口所用的时钟源 PCLK=50Mhz,想要设置串口的波特率为115200bit/s,则UBRDIVn的值根据公式可以设置为26,如下所示:

UBRDIVn = (int)(50000000/(115200*16)) - 1
		= (int)(50000000/1843200) - 1
		= (int)(27.13) - 1
		= 27 - 1
		= 26

4.4 设置时钟源、接收/发送模式(UCONn寄存器)

在JZ2440开发板——S3C2440的时钟体系中,我们设置了时钟PCLK=50Mhz,所以这里在此基础上选择PCLK作为UART0的波特率发生器的时钟来源:

为了简单起见,不使用中断模式和DMA模式,直接采用查询模式(polling mode):

4.5 发送 / 接收状态寄存器(UTRSTATn)

如下图所示,发送器包括发送缓冲寄存器、发送移位寄存器。UTRSTATn[2]=1时,表示发送器空,说明不仅发送缓冲寄存器为空,发送移位寄存器中也没有数据;UTRSTATn[1]=1时,只表示发送缓冲寄存器为空。因此我们一般通过判别 UTRSTATn[2] 是否为1,来判断是否发送完成(发送移位寄存器中没有数据,才说明发送完成)。另外我们通过 UTRSTATn[0] 是否为1,来判断是否收到数据。

4.6 发送缓冲寄存器(UTXHn)、接收缓冲寄存器(URXHn)

值得注意的是,在使用指针访问这两个寄存器时,不能使用int型指针,因为int型指针访问的是4个字节的数据,而此处只能访问 1 个字节数据,所以要使用char型指针

#define UTXH0	(*(volatile unsigned char *)(0x50000020))  //UART 0 transmission hold 
#define URXH0	(*(volatile unsigned char *)(0x50000024))  //UART 0 receive buffer    

五、编程实践

5.1 相关代码文件

1、start.S文件

内容与JZ2440开发板——S3C2440的时钟体系中的start.S文件完全一致。

2、main.c文件

文件内容如下:

#include "s3c2440_soc.h"
#include "uart.h"

int main(void)
{
	unsigned char c;
	
	uart0_init();
	puts("Hello, world!\n\r");
	
	while(1)
	{
		c = getchar();
        
        //有些系统回车可能是'\r',则输出'\n'来换行
		if (c == '\r')
		{
			putchar('\n');
		}
        //有些系统回车可能是'\n',则输出'\r'来换行
		if (c == '\n')
		{
			putchar('\r');
		}

		putchar(c);
	}
	return 0;
}

3、uart.c文件

对GPHCON、GPHUP等寄存器进行的是位操作;对UCON0等寄存器,则是利用寄存器位查看小工具计算好之后对其进行赋值。这两者有什么区别或者优劣之分吗? 

#include "s3c2440_soc.h"

/* 115200,8n1 */
void uart0_init()
{
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));
	
	/* 使能内部上拉 */
	GPHUP &= ~((1<<2) | (1<<3));  
	
	/* PCLK,中断/查询模式 */
	UCON0 = 0x00000005; 
	
	/* 设置波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
	UBRDIV0 = 26;

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

}

//通过串口0输出显示数字c对应的字符
int putchar(int c)
{
	/* UTRSTAT0、UTXH0 */
	//UTRSTAT0[2]为0时(表示发送器不为空),这个while会一直循环下去
	//这意味着发送器还在忙着其他发送任务,你要等它把其他数据发送结束,
    //才能接受你这次的数据传输
	while (!(UTRSTAT0 & (1<<2)));//某个数字m的第n位,其表达式是 m&(1<<n)
    //退出循环,表示上一次数据发送完毕了,可以开始你这次的数据传输了
	UTXH0 = (unsigned char)c;  //将数值写入UTXH0即可,会自动发送出去
                               //UTXH0是 unsigned char 类型,所以要转换
	
}

//通过串口0获取字符
int getchar(void)
{
	while (!(UTRSTAT0 & (1<<0)));//注意这个分号不能少(其实可以换一行写分号)
	return URXH0;
}

int puts(const char *s)
{
	while (*s)
	{
		putchar(*s);//这里*s是一个字符,即char类型,但putchar的参数是int类型
                    //传递时会自动转换?
		s++;
	}
}

5.2 烧写与运行

在uboot的shell界面选择n菜单,通过dnw+usb下载线的方式,(要想编译成功,Makefile文件中arm-linux-gcc命令后要添加-nostdlib选项)将上面编译生成的uart.bin文件烧写到NandFlash中,然后以NandFlash方式启动,显示如下:

Hello, world!  #固定输出这行内容。
abcdefg        #下面是你敲什么内容就显示什么内容。
123
38324ajlkdjalk
dasdjakdakjd

六、总结

1、理解了串口通信的协议(串口的参数、数据传输流程);

2、掌握S3C2440这颗芯片的串口使用方法(如何编程使用串口);

3、通过这个案例,掌握了分析某个芯片模块方法,即:
(1)看原理图确定硬件如何连接;

(2)看芯片手册进行寄存器设置。

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

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

相关文章

LabVIEW提高开发效率技巧----VI服务器和动态调用

VI服务器&#xff08;VI Server&#xff09;和动态调用是LabVIEW中的两个重要功能&#xff0c;可以有效提升程序的灵活性、模块化和可扩展性。通过这两者的结合&#xff0c;开发者可以在运行时动态加载和调用VI&#xff08;虚拟仪器&#xff09;&#xff0c;实现更为复杂的应用…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …

全面掌握 Jest:从零开始的测试指南(下篇)

在上一篇测试指南中&#xff0c;我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性&#xff0c;包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…

办了房屋抵押经营贷,空壳公司不怕被查吗?续贷不上怎么办?

很多有房的朋友&#xff0c;想必都办理过抵押经营贷款。但是&#xff0c;当办完房屋抵押经营贷款之后&#xff0c;钱到手了&#xff0c;别光顾着乐呵&#xff0c;贷后管理可是门大学问&#xff0c;稍有不慎&#xff0c;麻烦就找上门了。咱得确保资金用得对路&#xff0c;征信亮…

windows 使用wsl安装docker

前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;比如安装 Docker 容器来实现代码隔离&#xff0c;然而问题是大部分同学的电脑都是 Windows 系统&#xff0c;这时就会出现大量报错&#xff0c;经历过的同学一定是边踩坑边落泪。 如何免费拥有一台 Linux 服务器呢&…

什么是即时通讯平台

在当今数字化时代&#xff0c;高效的沟通和协作是企业成功的关键。为了满足企业的沟通需求&#xff0c;即时通讯平台应运而生。WorkPlus作为一款企业级即时通讯平台&#xff0c;提供了丰富的功能和安全性&#xff0c;助力企业实现高效协作、数字化办公以及推动业务发展。本文将…

为什么直播要用RTMP?

为什么要选RTMP 直播使用RTMP&#xff08;Real-Time Messaging Protocol&#xff09;协议的原因主要有以下几点&#xff1a; 1. 低延迟特性 RTMP被设计为实时消息传递协议&#xff0c;通过优化传输机制&#xff0c;可以实现较低的传输延迟。这对于直播来说至关重要&#xff…

LeetCode_sql_day26(184,1549,1532,1831)

描述 184.部门工资最高的员工 表&#xff1a; Employee ----------------------- | 列名 | 类型 | ----------------------- | id | int | | name | varchar | | salary | int | | departmentId | int | -----------------…

22章 开发高效算法

1.编写一个程序&#xff0c;提示用户输入一个字符串&#xff0c;然后显示最大连续递增的有序子字符串。分析你的程序的时间复杂度。 import java.util.Scanner;public class Test {public static void main(String[] args) {System.out.println("请输入字符串&#xff1a…

这个公司可以做点什么呢?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

国学盛典 致敬先贤 《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕

9月10日&#xff0c;《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕。中国著名表演艺术家、曾饰演央视86版电视剧《西游记》中“孙悟空”的六小龄童先生与两百余人传统文化传播者、践行者、爱好者齐聚一堂&#xff0c;共同交流。本次会议由中国文化促进会福文化工作委…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一&#xff0c;PyQt5 是 Python 绑定 QT5 应用的框…

phpstudy 建站使用 php8版本打开 phpMyAdmin后台出现网页提示致命错误:(phpMyAdmin这是版本问题导致的)

报错提示&#xff1a; 解决方法&#xff1a;官网下载phpmyadmin 5.2.1版本。 下载地址&#xff1a;phpMyAdmin 将网站根目录phpMyAdmin4.8.5里面的文件换成 官网下载的5.2.1版本即可。 重启网站&#xff0c;打开phpMyAdmin后台即可&#xff08;若打不开更改 mysql密码即可&am…

传知代码-KAN卷积:医学图像分割新前沿

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 在本文中深入探讨KAN卷积在医学图像分割领域的创新应用&#xff0c;特别是通过引入Tokenized KAN Block&#xff08;Tok Kan&#xff09;这一突破性设计&#xff0c;将深度学习中的图像分割技术推向了新的高…

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…

Typora安装,使用,图片加载全流程

文章目录 前言&#xff1a;安装&#xff1a;破解&#xff1a;使用typora&#xff1a;关于CSDN加载不出图片&#xff1a;创建OSS&#xff1a;设置PicGo&#xff1a; 前言&#xff1a; ​ Typora是一款非常流行的Markdown编辑器&#xff0c;简单来说就是可以方便我们写博客。拿我…

Linux基础---07文件传输及解决yum安装失效的方法

Linux文件传输地图如下&#xff0c;先选取你所需的场景&#xff0c;若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网&#xff1a; 检查网络是否畅通命令&#xff1a;ping www.baidu.com&#xff0c;若有持续的返回值就说明网络畅通。Ctr…

如何建立一个Webservice WSDL的简单例子(完整例子)

一&#xff1a;根据对方给的wsdl 的接口地址创建Web 的逻辑端口 1&#xff1a;例如这个用C#写的Web 2.我们需要在SAP里建立一个Service Consumers 的服务记得后缀要加?wsdl 2&#xff1a;然后就会生成对应方法的出参 入参 返回的消息根据接口方法来判断 二&#xff1a;如何通…

day21JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…