JZ2440开发板——S3C2440的UART

news2024/11/13 15:07:55

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

一、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/2152113.html

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

相关文章

【计算机网络篇】物理层

本文主要介绍计算机网络第二章节的物理层&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.基本概念及公式 &#x1f383;基本概念…

力扣-1035不相交的线(Java详细题解)

题目链接&#xff1a;力扣-1035不相交的线 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一…

安全基础学习-AES128加密算法

前言 AES&#xff08;Advanced Encryption Standard&#xff09;是对称加密算法的一个标准&#xff0c;主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度&#xff0c;其中AES-128是最常用的一种&#xff0c;它使用128位&#xff08;16字节&#xff09;的密钥进…

充电宝什么品牌比较好?五大性价比高充电宝品牌推荐!

在这个电子设备无处不在的时代&#xff0c;充电宝已成为我们生活中不可或缺的重要配件。无论是通勤、旅行还是户外休闲&#xff0c;充电宝都能为我们的手机、平板等提供及时的电量补充&#xff0c;确保我们时刻保持在线。一个安全可靠的充电宝&#xff0c;不仅能为我们的设备提…

GRU(门控循环单元)的原理与代码实现

1.GRU的原理 1.1重置门和更新门 1.2候选隐藏状态 1.3隐状态 2. GRU的代码实现 #导包 import torch from torch import nn import dltools#加载数据 batch_size, num_steps 32, 35 train_iter, vocab dltools.load_data_time_machine(batch_size, num_steps)#封装函数&…

VScode开发GD32移植(标准库通用),保姆级!!!!!!!

VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…

[产品管理-30]:NPDP新产品开发 - 29 - 产品生命周期管理 - 可持续产品创新

目录 一、可持续开发与可持续创新 可持续开发 可持续创新 可持续开发与可持续创新的关系 二、循环经济 1、循环经济的定义 2、循环经济的起源与发展 3、循环经济的原则 4、循环经济的实践案例 5、循环经济的意义与展望 三、三重底线 1. 财务底线 - 企业。赚钱 2. …

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后&#xff0c;我们必然要和微调打交道。现在大模型的微调有非常多的方法&#xff0c;过去的文章中提到的微调方法通常依赖于问题和答案对&#xff0c;标注成本较高。 2023 年所提出的 Direct Preference Optimization&#xff08;DPO&#xff09;为我们提供了一…

卡牌抽卡机小程序:市场发展下的创新

今年以来&#xff0c;卡牌成为了行业中的黑马&#xff0c;在国内迅速流行&#xff0c;成为消费者的心头好。小小的卡牌创下了百亿的市场规模&#xff0c;发展前景巨大&#xff01; 不过&#xff0c;随着卡牌市场的不断增长&#xff0c;市场发展也需要进行创新。线上抽卡机小程…

Yocto - 使用Yocto开发嵌入式Linux系统_02 认识 Yocto 项目

Meeting the Yocto Project 本章向你介绍 Yocto 项目。这里讨论的项目主要概念将贯穿全书。此外&#xff0c;我们还将简要讨论 Yocto 项目的历史、OpenEmbedded、Poky、BitBake、元数据和版本模式。系好安全带&#xff0c;欢迎加入我们的行列&#xff01; This chapter introdu…

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念&#xff0c;用于描述两个数在除以某个数时所得的余数相同的情况。具体地&#xff0c;设m是一个正整数&#xff0c;a和b是两个整数&#xff0c;如果a和b除以m的余数相同&#xff0c;则称a和b模m同余&#xff0c;记作a≡b(mod m)。反…

C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const int HIGH_BIT 30;struct Trie {// 左子树指向表示 0 的子节点struct Trie* left;// 右子树指向表示 1 的子节点struct Trie* right; };struct Trie* createTrie() {struct Trie* ret malloc(sizeof(struct Trie));ret->left re…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

CompletableFuture-详解使用及源码解析

背景 上一篇文章我们看了FutureTask&#xff0c;分析了他的问题&#xff0c;异步编程并不方便。 问题1&#xff1a; FutureTask获取执行结果前&#xff0c;主线程需要通过get()方法一直阻塞等待子线程执行完成call方法&#xff0c;才可以拿到返回结果问题2&#xff1a;如果不…

电竞显示器哪个牌子好

电竞显示器哪个好&#xff1f;你想成为电竞选手吗&#xff1f;显示器很关键&#xff0c;下面我就列举7款市面流行的电竞显示器给大家看看&#xff0c;总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

2024/9/21 leetcode 21.合并两个有序链表 2.两数相加

目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD&#xff08;论文链接&#xff1a;[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)&#xff09; 网络流程图&#xff1a; 辅助阅读&#xff1a; 基于大型语言模型的医学图像交互式计算机辅助诊…

【运维自动化-作业平台】如何使用全局变量之字符串类型?

使用变量是脚本很常见的处理场景&#xff0c;作业平台中主要有全局变量和魔法变量两类&#xff0c;全局变量又区分了字符串、命名空间、主机列表、密文、数组5种类型。字符串类型变量 最简单、使用频率最高的全局变量类型&#xff0c;可以跨主机、跨步骤使用。目前在作业平台中…

uniApp微信小程序扫描普通二维码跳转到小程序指定页面操作方法

这篇文章主要给大家介绍了关于微信小程序扫描普通二维码跳转到小程序指定页面操作的相关资料,需要的朋友可以参考下 1、首先我们需要在微信公众平台的开发管理——>开发设置&#xff0c;找到&#xff08;扫普通链接二维码打开小程序&#xff09;&#xff0c;点击添加,根据提…

vue3-05-Element-plus中表单校验:校验对象中的对象的属性,校验对象中的数组中的对象的属性,校验嵌套对象

目录 一、校验对象中的普通属性二、校验对象中对象的属性三、校验对象中的数组中的对象的属性 这两天写vue3项目&#xff0c;用了element-plus库&#xff0c;到了表单规则验证的环节&#xff0c;我发现我只会校验对象中的普通属性&#xff0c;如果校验嵌套对象&#xff0c;我就…