03:2440--UART

目录

一:UART

1:概念

2:工作模式

3:逻辑电平

4:串口结构图

5:时间的计算

二:寄存器

1:简单的UART传输数据

A:GPHCON--配置引脚  

B:GPHUP----使能内部上拉​编辑

C: UCON0---设置频率115200

D: ULCON0----数据格式8n1

E:发送数据

A:UTRSTAT0

B:UTXHO--发送数据输缓冲寄存器

F:接收数据

A:UTRSTAT0​​​​​​​

B:URXH0 ---接收缓冲区寄存器

三:代码

1:UART的简单实现


一:UART

1:概念

        S3C2440A通用异步收发器(UART)提供三个独立的异步串行I/O (SIO)端口,每个端口都可以在基于中断或基于dma的模式下工作。换句话说,UART可以生成中断或DMA请求来在CPU和UART之间传输数据。使用系统时钟,UART可以支持高达921.6Kbps的波特率。如果外部设备为UART提供UEXTCLK,则UART可以以更高的速度运行。每个UART信道包含两个64字节的fifo,分别用于接收和发送。

        S3C2440A UART包括可编程波特率,红外(IR)发送/接收,一个或两个停止位插入,5位,6位,7位或8位数据宽度和奇偶校验。

        每个UART包括波特率发生器、发送器、接收器和控制单元。波特率发生器可以通过PCLK, FCLK/n或UEXTCLK(外部输入时钟)进行时钟。

        发射器和接收器包含64字节的fifo和数据移位器。数据被写入FIFO,然后在传输之前复制到传输移位器。然后通过传输数据引脚(TxDn)将数据移出。同时,接收数据从接收数据引脚(RxDn)转移,然后从移位器复制到FIFO。

        1:波特率 : 双方约定每一位占用的时间

        2:格式 : 数据位, 停止位, 校验位, 流量控制

        校验分为奇校验和偶校验, 以前的电解技术没有那么稳定, 使用采用了;  不过现在使用比较少;

        

        数据位+校验位为 " 1"的个数

eg: 数据位为8位--0001 0001 --采用奇校验 使用校验位为1;   3个1所以是奇校验

       如果采用偶校验,  校验位为0----2个1就是偶校验 

        作用 :  串口不仅可以为我们打印调式信息, 还可以连接需要外设模块,  实现之间的通信 (GPS, 蓝牙,  mpu6050......)

       这个和STM32发送的基本一样详情可以参考我的 : 09:STM32-------USART串口通信+串口数据包

2:工作模式

假设2440现在需要向外面的pc端口发送一个数据,  他的工作模式如下

发送 "A" 0x41 0b0100 0001

2440向pc段发送数据  

        A : 首先逻辑电平是高电平

        B : ARM被拉低(开始位)---告诉pc段我要开始发送数据了;  在这里会停留1bit的时间,  也就是我们双方约定的波特率.

        C:通过拉低逻辑电平电平的方式传输数据.  每一位停留一个波特率的时间.  一般数据为采用8位

        D:在一个数据位发送介绍拉高电平告诉, pc段我们发送完了

pc段读取数据:

        在数据位中间的位置开始读取数据

3:逻辑电平

        TTL电平传输方式-----我们2440采用的就是这种的传输方式;      当电平高在某一个范围的时候他就会被判定位高电平, 同理在电平低于某一个范围的时候被判定为低电平. 

          RS232电平传输----我们pc段采用这种方式的传输

2种不同的电平协议是不能相互传输数据的,  我们的2440添加了电平转化芯片或者USB串口芯片. 

原理图:

        可以看到我们引脚需要我们的配置, 来把他变为发送和接收引脚.  而不是普通的GPIO口

4:串口结构图

简单理解:

2440向pc段发送数据:

          A:FIFO会向内存中取到需要发送的数据

          B:在这个UART单元中FIFO把数据发送到移位器里面去,  移位器通过逐步发送,把数据发送到了pc段.

pc段向2440发送数据:

        A:pc段把数据发送给我移位器, 移位器逐步接收.

        B:移位器再把数据发送给我FIFO, FIFO,  程序从FIFO把数据取出来写入内存. 

可以使用中断或者不断查看标志位的方式来查看数据是否发送完毕.

5:时间的计算

二:寄存器

1:简单的UART传输数据

A:GPHCON--配置引脚  

        注意我们使用的发送和接收的是0号,  在下面选择寄存器是也应该选择0号.

        可以看到了我们需要把GPH2 GPH3配置使他为发送和接收引脚,  而不是普通的GPIO口

GPHCON &= ~((3 << 4) | (3 << 6));
GPHCON |= ((2 << 4) | (2 << 6));

B:GPHUP----使能内部上拉

	GPHUP &= ~((1 << 2) | (1 << 3));  /* 使能内部上拉 */

把GPH2和GPH3的接收引脚上拉

C: UCON0---设置频率115200

UART块中有三个UART控制寄存器,包括UCONO、UCON1和UCON2。

        时钟我们选择默认的PCLK时钟----在上一节中我们调节PCLK的频率为50MHZ

        UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1

        我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZ

        UBRDIVn=(5000 0000 /(115200*16))-1=26

UBRDIV0 = 26;

        我们只需要最简单的实现---所以只有打开发送和接收模式

UCON0 = 0x00000005;

全部代码----实现了频率为11520, 打开接收和发送模式

UCON0 = 0x00000005;
UBRDIV0 = 26;

D: ULCON0----数据格式8n1

/*数据格式*/
	ULCON0 = 0x00000003;  //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/

E:发送数据

A:UTRSTAT0

        发射机空;    当传输缓冲寄存器没有有效数据要传输且传输移位寄存器为空时,自动设置为1。

0 =不空        1=发射机(传输缓冲区和移位寄存器)空

while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));

B:UTXHO--发送数据输缓冲寄存器

        在UART块中有三个UART传输缓冲寄存器,包括UTXHO、UTXH1和UTXH2。UTXHn有一个8位的数据用于传输数据。

return URXH0;

全部代码

while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));

UTXH0 = (unsigned char)c;

F:接收数据

A:UTRSTAT0
	while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
B:URXH0 ---接收缓冲区寄存器

        在UART块中有三个UART接收缓冲区寄存器,包括URXHO, URXH1和URXH2。URXHn对接收的数据有一个8位的数据。

return URXH0

全部代码

while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
return URXH0;

全部的代码见---三:代码 1:UART的简单实现

三:代码

1:UART的简单实现

#include "sc2440_so.h"
/*在UART块中有三个UART线路控制寄存器,包括ULCONO、ULCON1和ULCON2。
	我们使用的是--ULCONO
	*/
//115200 8n1
void UART_init()
{
	/*引脚设置*/
	GPHCON &= ~((3 << 4) | (3 << 6));
	GPHCON |= ((2 << 4) | (2 << 6));

	GPHUP &= ~((1 << 2) | (1 << 3));  /* 使能内部上拉 */

	/*设置波特率---设置波特率位115200*/
	/*
	 UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1
	 我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZ
	UBRDIVn=(5000 0000 /(115200*16))-1=26
	*/
	UCON0 = 0x00000005;
	UBRDIV0 = 26;

	/*数据格式*/
	ULCON0 = 0x00000003;  //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/
}
int putchar(int c)
{
	/*发送数据*/
	while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));
	

	UTXH0 = (unsigned char)c;
}

int getchar(void)
{
	/*接收数据*/
	while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
	

	return URXH0;
}

int puts(const char* s)
{
	while (*s)
	{
		putchar(*s);
		s++;
	}

}



#ifndef __UART_H
#define __UART_H

void UART_init();
int putchar(int c);
int getchar(void);
int puts(const char* s);


#endif

#ifndef __SC2440_SO_H
#define __SC2440_SO_H

#define ULCON0 (*((volatile unsigned int*)0x50000000))
#define UCON0 (*((volatile unsigned int*)0x50000004))
#define UBRDIV0 (*((volatile unsigned int*)0x50000028))
#define GPHCON (*((volatile unsigned int*)0x56000070))
#define GPHUP (*((volatile unsigned int*)0x56000078))
#define UFCON0 (*((volatile unsigned int*)0x50000008))
#define UTRSTAT0 (*((volatile unsigned int*)0x50000010))
#define UTXH0 (*((volatile unsigned char*)0x50000020))
#define URXH0 (*((volatile unsigned char*)0x50000024))

#endif

#include "uart.h"
#include "sc2440_so.h"
int main(void)
{
	unsigned char c;

	UART_init();
	puts("Hello, world!\n\r");

	while (1)
	{
		c = getchar();
		if (c == '\r')
		{
			putchar('\n');
		}

		if (c == '\n')
		{
			putchar('\r');
		}

		putchar(c);
	}
	return 0;
}

分析makefile文件

我们要使用makefile文件交叉编译来生成bin文件

all:
	
	arm-linux-gcc -c -o uart.o uart.c
	arm-linux-gcc -c -o main.o main.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o  uart.o main.o -o uart.elf
	arm-linux-objcopy -O binary -S uart.elf uart.bin
	arm-linux-objdump -D uart.elf > uart.dis
clean:
	rm *.bin *.o *.elf *.dis
	

        A: 先把所以的c语言和汇编语言全部, 编译为.o文件

        B:链接: 这是一个链接命令,用于将三个目标文件(start.o、uart.o、main.o)链接成一个可执行文件(uart.elf)。其中-Ttext 0指定了链接地址的起始地址为0,start.o是程序的入口地址。这个命令会将三个目标文件中的符号解析出来,并将它们放到正确的位置上,生成可执行文件

        C:这个命令的作用是将uart.elf文件转换为uart.bin文件。其中,-O binary表示输出格式为二进制文件,-S表示去掉所有的符号信息。这个命令通常用于将可执行文件转换为裸机程序,以便在嵌入式系统中运行。(把连接生成的elf文件转换为单板使用的bin文件)

        D:对连接生成的elf文件进行反汇编,调试错误时用。生成.dis文件

1:UART每发送完一个数据发送停止位, 还是发送完想要发送的数据在发送停止位?

        根据引用中的定义,UART协议的数据传输包括起始位、数据位和终止位。其中,起始位是低电平,终止位是高电平。在UART发送一段数据时,每个数据字节后面都会跟随一个停止位。停止位的数量取决于UART协议的设置,通常为1个或2个。因此,UART发送一段数据,一共发送的停止位数量为1个或2个,具体取决于UART协议的设置

2:UART发送数据是发送完毕,接收端在读取, 还是一边发送, 接收端一边读取

        根据提供的引用内容,UART是一种通用异步接收器/发送器,其主要目的是发送和接收串行数据。在UART发送数据时,数据包以串行方式从发送UART送至接收UART,接收UART以预配置的波特率对数据线进行采样。因此,在UART发送数据时,接收端需要一边接收一边读取数据,否则数据将会丢失

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二维数值型数组例题2

1、内部和 题目描述 给定一个m行n列的二维矩阵&#xff0c;求其内部元素和 输入要求 第一行为两个整数&#xff1a;m和n&#xff08;0<m,n<10&#xff09;&#xff0c;接下来输入m*n的二维矩阵 输出要求 二维矩阵内部元素和 输入样例 3 3 1 2 3 4 5 6 7 8 9 …

基于python+Django+SVM算法模型的文本情感识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介1. 简介2. 技术栈3. 系统架构4. 关键模块介绍5. 如何运行 二、功能三、系统四. 总结 一项目简介 # 基于 Python Django SVM 算法模型的文本情感识别系统介…

芯片安全和无线电安全底层渗透技术

和传统网络安全不同&#xff0c;硬件安全、芯片安全、无线电安全属于网络底层安全的重要细分领域&#xff0c;是网络安全的真正基石&#xff0c;更是国家安全的重要组成部分&#xff0c;“夯实网络底层安全基础&#xff0c;筑牢网络强国安全底座”&#xff0c;是底网安全重要性…

基于51单片机的百叶窗控制系统设计

**单片机设计介绍&#xff0c; 基于51单片机的百叶窗控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的百叶窗控制系统设计可以分为硬件设计和软件设计两个方面。下面是一个简要的设计介绍&#xff1a; …

阿里云服务器安装mysql数据库之后无法远程连接

目录 一、mysql安装完成后直接远程远程连接阿里云服务器上的MySQL会报下述错误&#xff1a; 1、修改root用户的host 为% 登录MySQL 后 执行 2、修改完成后执行 3、退出mysql 重启mysql服务 exit; 4、修改完成后需要设置阿里云的安全规则。 二、dbaver测试链…

docker devicemapper: Error running DeleteDevice dm_task_run failed

docker 删除容器&#xff0c;遇到&#xff1a; devicemapper: Error running DeleteDevice dm_task_run failed 异常 [hadoophadoop02 ~]$ sudo docker rm 5ede1280f0bf Error response from daemon: container 5ede1280f0bf791e91d40038b15decd42e8923546ae578abd96e08114c76…

JVM——垃圾回收(方法区中的垃圾回收和(堆回收)自动垃圾回收)

目录 1.自动垃圾回收介绍1.C/C的内存管理2.Java的内存管理3.垃圾回收的对比 2.方法区的回收方法区的回收 – 手动触发回收 3.堆回收1.引用计数法2.可达性分析算法 1.自动垃圾回收介绍 1.C/C的内存管理 ⚫ 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再…

【差旅游记】走进新疆哈密博物馆

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 前些天在新疆哈密时&#xff0c;有天下午有点时间&#xff0c;看离住的宾馆不远就是哈密博物馆&#xff0c;便去逛了逛博物馆&#xff0c;由于接下来的一段时间没顾上记录&#xff0c;趁今天有些时间简单记录下那短暂的…

蓝桥杯每日一题2023.11.25

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题目最开始是递归想法&#xff0c;但发现题意中的匹配次数实际上是指在这8个字母中这8个字母每个字母对应的个数是否相同&#xff0c;如果相同则匹配。 此处我们可以使用subsrtr函数&#xff0c;每次循环截取8个字…

值得看的书--《全宋词》节选

(https://img-blog.csdnimg.cn/5d5fe2844f6646b5b7b415f0a9e80f6c.jpg)

基于uniapp的 电子书小程序——需求整理

前言 想开发一个很简单的 电子书阅读小程序&#xff0c;要怎么做的。下面从功能、数据库设计这一块来说一下。说不一定能从某个角度提供一些思路 开发语言 springcloud uniapp 小程序&#xff08;vue2&#xff09;mysql 说明 电子书的主题是电子书&#xff0c;我们在日常…

Elasticsearch集群部署 head监控插件 Kibana部署 Nginx反向代理 Logstash部署

一、组件介绍1、Elasticsearch&#xff1a;2 、Logstash3、Kibana4、Kafka&#xff1a;5、Filebeat: 二、 Elasticsearch集群部署服务器创建用户安装ES修改配置文件创建数据和日志目录设置JVM堆大小 #7.0默认为4G修改安装目录及存储目录权限系统优化&#xff08;1&#xff09;增…

2024年天津天狮学院专升本护理学专业《内外科护理学》考试大纲

天津天狮学院2024年护理学专业高职升本入学考试《内外科护理学》考试大纲 一、考试性质 《内外科护理学》专业课程考试是天津天狮学院护理专业高职升本入学考试的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《内外科护理学…

完蛋!我被ConcurrentHashMap源码包围了!(一)

文章目录 1. 引言2. 使用3. 初始化4. 存储流程5. 取值流程6. 扩容流程 1. 引言 ConcurrentHashMap是一个线程安全的HashMap&#xff0c;在JDK1.7与JDK1.8&#xff0c;无论是实现还是数据结构都会有所不一样。这促使了ConcurrentHashMap有着HashMap一样的面试高频考点。 接下来…

【Linux】进程间通信——system V共享内存、共享内存的概念、共享内存函数、system V消息队列、信号量

文章目录 进程间通信1.system V共享内存1.1共享内存原理1.2共享内存数据结构1.3共享内存函数 2.system V消息队列2.1消息队列原理 3.system V信号量3.1信号量原理3.2进程互斥 4.共享内存的使用示例 进程间通信 1.system V共享内存 1.1共享内存原理 共享内存区是最快的IPC形式…

递归剪枝题

期中考终于考完了&#xff0c;整道题奖励下自己 我一北大同学问我的&#xff0c;说他递归超时了&#xff0c;叫我想一个办法 后面他说他加了个剪枝就过了&#xff0c;然后我自己尝试了一个方法&#xff1a; 就是先把城市按1到n排列&#xff0c;然后考虑互换&#xff0c;如果互…

02 _ 架构分层:我们为什么一定要这么做?

在系统从0到1的阶段&#xff0c;为了让系统快速上线&#xff0c;我们通常是不考虑分层的。但是随着业务越来越复杂&#xff0c;大量的代码纠缠在一起&#xff0c;会出现逻辑不清晰、各模块相互依赖、代码扩展性差、改动一处就牵一发而动全身等问题。 这时&#xff0c;对系统进…

基于OGG实现Oracle实时同步MySQL

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Python---函数定义时缺省参数(参数默认值)---放最右边

缺省参数也叫默认参数&#xff0c;用于定义函数&#xff0c;为参数提供默认值&#xff0c;调用函数时 可 不传该默认参数的值&#xff08;注意&#xff1a;所有位置参数必须出现在默认参数前&#xff0c;包括函数定义和调用&#xff09;。 比如&#xff1a;原先的代码&#…

[修订版][工控]SIEMENS S7-200 控制交通红绿灯程序编写与分析

下载地址>https://github.com/MartinxMax/Siemens_S7-200_Traffic_Light 特别鸣谢接线过程实验目的题目要求I/O分配公式公式套用示例 程序分析分割块[不是必要的,自己分析用]左侧梯形图 [B1-B5]B1 [东西绿灯亮25s]B2 B3 B23 [东西绿灯闪烁3s]B4 [东西黄灯亮2s]B5 [东西红灯…
最新文章