一、UART原理说明

通用异步收发器简称UART(Universal Asynchronous Receiver/Transmitter),它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,将串行数据收集放在缓冲区中,CPU就可以读取UART获得这些数据。串口之间以全双工方式传输数据,最精简的连线只有三根线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平,连线如下图:

UART使用标准的TTL/CMOS逻辑电平(0-5V、0-3.3V、0-2.5V、0-1.8V)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOS逻辑电平转换为RS232逻辑电平,3-12V表示0,-3--12V表示1。

TxD、RxD数据线以‘位’为最小单位传输数据。帧由具体完整意义的、不可分割的若干位组成,它包含开始位、数据位、校验位、停止位。发送数据之前UART之间要约定好数据的传输速率(每位所占用的时间,其倒数称为波特率)、数据的传输格式(有多少数据位、是否使用校验位、是奇校验还是偶校验,有多少个停止位)。

数据传输如下图:

(1)、平时数据线处于“空闲”状态(1状态)
(2)、当要发送数据时,UART改变TxD数据线的状态(变为0状态)并维持1位的时间,这样接收方检测到开始位后,再等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。
(3)、UART一帧中可以有5、6、7、8位数据,发送方一位一位地改变数据线的状态将它们发送出去,首先发送最低位。
(4)、如果使用校验功能,UART在发送完数据后,还要发送1个校验位。有两种校验法:奇校验、偶校验(数据位连同校验位中,“1”的数目是奇数还是偶数)。

(5)、最后,发送停止位,数据线恢复到“空闲”状态。停止位的长度有3种:1位、1.5位、2位。

二、S3C2440 UART的特性
s3c2440中UART,有三个独立的通道,每个通道都可以工作于中断模式或DMA模式,即UART可以发出中断或DMA请求以便在UART、CPU间传输数据。UART由波特率发生器、发送器、接收器和控制逻辑组成。

使用系统时钟时,s3c2440可以达到115.2Kbit/s;s3c2440UART的FIFO深度为64字节。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到“发送移位器”中,发送移位器将数据一位一位地发送到TxD数据线上(根据设定的格式,插入开始位、校验位、停止位)。接收数据时,“接收移位器”将RxD数据线上的数据一位一位接收进来,然后复制到接收FIFO,CPU即可从中读取数据。

UART结构图

三、s3c2440UART的使用

在使用UART之前需要设置波特率、传输格式(有多少个数据位、是否使用校验位、是奇校验还是偶校验、有多少个停止位、是否使用流量控制);对于s3c2440还要设置相应的管脚位UART功能、选择UART通道工作模式为中断模式还是DMA模式,设置好后,往某个寄存器写入数据即可发送,读取某个寄存器即可得到接收到的数据。可以查询状态寄存器或设置中断来获知数据是否已经发送完毕、是否已经接收完毕。

具体操作方法:

1、将所涉及的UART通道管脚设为UART功能
比如UART0,GPH2、GPH3分别用作TxD0、RxD0,要使用串口通道0时,先设置GPHCON寄存器将GPH2、GPH3引脚功能设置为TxD0、RxD0。
2、UBRDIVn寄存器:设置波特率
s3c2440UART的时钟源有三种选择:FLCK/n(n值通过UCON0-UCON2联合设置)、UEXTCLK、PCLK。
根据给定的波特率、所选择的的时钟源的频率。可以通过以下公式计算UBRDIVn寄存器(n为0-2)的值,
给出了计算公式、例子及误差计算

3、ULCONn寄存器:设置传输格式

4、UCONn寄存器:串口控制寄存器

UCONn寄存器用来选择UART时钟源、设置UART中断方式等。

n的值有UCON0、UCON1、UCON2这3个寄存器的[15:12]一起来确定。

5、UFCONn寄存器、UFSTATn寄存器
UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触发阈值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置这个寄存器来复位各个FIFO。
读取USTATn寄存器可以知道各个FIFO是否已满、其中有多少个数据。
不适用FIFO时可以认为FIFO深度为1,使用FIFO时s3c2440FIFO深度64。
6、UMOCONn寄存器、UMSTATn寄存器
这两类寄存器用于流量控制。
7、UTRSTATn寄存器
这个寄存器用来表示数据是否已经发送完毕、是否接收完毕。
8、UERSTATn寄存器
用来表示各种错误是否发生。
9、UTXHn寄存器
CPU将数据写入这个寄存器,UART就会将它保存到缓冲区中,并自动发送出去
10、URXHn寄存器
当UART接收到数据,CPU读取这个寄存器,就可以获取数据。

四、UART使用程序

serial.h

void uart0_init(void);
void putc(unsigned char c);
unsigned char getc(void);
int isDigit(unsigned char c);
int isLetter(unsigned char c);

serial.c

#include "s3c24xx.h"
#include "serial.h"#define TXD0READY   (1<<2)
#define RXD0READY   (1)#define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz
#define UART_CLK        PCLK        //  UART0的时钟源设为PCLK
#define UART_BAUD_RATE  115200      // 波特率
#define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)/** 初始化UART0* 115200,8N1,无流控*/
void uart0_init(void)
{GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0GPHUP   = 0x0c;     // GPH2,GPH3内部上拉ULCON0  = 0x03;     // 8N1(8个数据位,无较验,1个停止位)UCON0   = 0x05;     // 查询方式,UART时钟源为PCLKUFCON0  = 0x00;     // 不使用FIFOUMCON0  = 0x00;     // 不使用流控UBRDIV0 = UART_BRD; // 波特率为115200
}/** 发送一个字符*/
void putc(unsigned char c)
{/* 等待,直到发送缓冲区中的数据已经全部发送出去 */while (!(UTRSTAT0 & TXD0READY));/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */UTXH0 = c;
}/** 接收字符*/
unsigned char getc(void)
{/* 等待,直到接收缓冲区中的有数据 */while (!(UTRSTAT0 & RXD0READY));/* 直接读取URXH0寄存器,即可获得接收到的数据 */return URXH0;
}/** 判断一个字符是否数字*/
int isDigit(unsigned char c)
{if (c >= '0' && c <= '9')return 1;elsereturn 0;
}/** 判断一个字符是否英文字母*/
int isLetter(unsigned char c)
{if (c >= 'a' && c <= 'z')return 1;else if (c >= 'A' && c <= 'Z')return 1;       elsereturn 0;
}

转载于:https://www.cnblogs.com/Ye-Jason/p/7374724.html

s3c2440串口详解相关推荐

  1. STM32开发 -- 串口详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/80708964 讲完GPIO,接下来看一下串口. 串口通信,已经讲了很多次了. ...

  2. python3.6串口编程实例_使用python3实现操作串口详解

    通过引用serial模块包,来操作串口. 1.查看串口名称 在Linux和Windows中,串口的名字规则不太一样. 需要事先查看. Linux下的查看串口命令 root@D2:~# ls -l /d ...

  3. STM32 串口详解

    目录 01.USART的特点 02.USART简介 2.1.数据传输模型 2.2.帧结构 2.3.波特率 03.STM32的USART 04.代码配置 01.USART的特点 USART是通用异步收发 ...

  4. STM32开发 -- 4G模块开发详解(3)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81782682 上面两篇文章,基本上把软硬件部分讲完了.接下来我们就看一下收发 ...

  5. STM32开发 -- 4G模块开发详解(2)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81773782 二.软件部分 1.初始化 模块的波特率为115200,8位数据 ...

  6. delphi 串口通信发送_STM32第五章串口通讯详解

    点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...

  7. PIC单片机精通_A/D转换异步串口通讯实例与详解

    1.前言 串口通信这个话题对于很多做机电一体化.机器人控制等系统协调的同学,根本不陌生.计算机软件(编程技术),近些年飞速发展.尤其是以机器学习.仿生控制.大数据为代表的AI行业.但是,软件及算法永远 ...

  8. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  9. 通过串口来控制网管型交换机的操作步骤详解

    之前我们对网管型交换机的三种管理方式简单的给大家介绍了一下,一.通过串口管理:二.通过web管理:三.通过网管软件管理.今天,飞畅科技的小编来为大家详细介绍下通过串口终端配置是如何对网管交换机进行控制 ...

  10. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

最新文章

  1. 15.文件系统——软RAID的实现(二)(mdadm,watch, RAID1)
  2. 查看删除的帐号的DN名称(活动目录快照配置管理系列六)
  3. 1.4操作系统的变革
  4. Jmeter---jason提取器处理上下游传参(四)
  5. [bzoj3489]A simple rmq problem
  6. Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors
  7. linux服务媒体,安装和使用Jellyfin配置Linux媒体服务器
  8. 字符串和字符串数组和\0
  9. android 按钮旋转等待,android高分段进阶攻略(3)旋转等待UI界面设计
  10. 《众妙之门 JavaScript与jQuery技术精粹》 - 读书笔记总结[无章节版][1-60]
  11. SVN忽略文件和文件夹
  12. 深度学习与计算机视觉教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)(CV通关指南·完结)
  13. 100 句世界哲学语录【句句珠玑细细品味】
  14. resample按时间聚合
  15. IOS开发之延时执行的几种方法
  16. matlab中figure图片大小修改
  17. 关于That command depends on command in Target ... script phase Copy Pods Resources报错解决方案
  18. ImportError: cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘完美解决方法
  19. Tableau 群集部署
  20. w7计算机防火墙无法更改,w7防火墙无法更改该怎么办

热门文章

  1. 动态规划------平均切分数组之和为两部分
  2. centos系统安全设置
  3. [HDU 1003] Max Sum
  4. C#程序员开发WinForm必须知道的 Window 消息大全(转)
  5. Toxophily(hdu2298三分+二分)
  6. PowerPivot 和 SQL Azure 快速入门
  7. token 的设计方案,这个厉害!
  8. 图解 Git,一目了然!
  9. B站游戏大佬飘了?深挖B站辱北邮事件经过:不是第一次
  10. Spring 面试 7 大问题,你顶得住不?