分类: LINUX
2014-04-26 18:51:52
UART:Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置,也就是我们通常所说的串口。学过单片机的同学肯定对串口有很深的了解,对于我来说,这也是我学单片机时所学的第一种通信方式。后来渐渐发现,这种简单的通信方式应用范围非常广。本章来详细介绍一下TQ2440开发板的串口使用方法。
发送数据:CPU将数据写入UART,UART将数据按照一定的格式在一根线上发出;
接收数据:UART检测另一根线上的信号,将串行收集的数据放在缓冲区中,CPU就可以读缓冲区来获得数据。
UART是全双工的通信方式,最简单的只需要3根线,TxD用于发送数据,RxD用于接收数据,GnD用于给双方提供参考地。
RS是英文“推荐标准”的缩写,232为标识号,C表示修改次数):
由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现,一般个人计算机上会有两组 RS-232 接口,分别称为 COM1 和 COM2。逻辑1(MARK)=-3V~-15V;逻辑0(SPACE)=+3~+15V。
逻辑1:5V;3.3V;2.5V;1.8V。
逻辑0:0V。
数据传输通常从最低有效位(LSB)开始。然而,有些UART允许灵活选择先发送最低有效位或最高有效位(MSB)。微控制器中的UART传送数据的速度通常用波特率(b/s,即:位/秒)来表示,常用的波特率有:4800、9600、19200、115200等。例如,在S3C2440微控制器中常用115200bps。UART波特率还受发送和接收线对距离(线长度)的影响。
帧(FRAME)由具有完整意义的、不可分割的若干位组成,包括:开始位、数据位、校验位和停止位。发送数据前,UART之间要约定波特率、数据传输的格式(即要用多少个数据位、是否使用校验位和停止位,如果使用校验位,是奇校验还是偶校验)。
S3C2440有3个独立通道的UART,每个通道都可以工作于中断模式或DMA模式。UART由波特率发生器、发送器、接收器、和控制逻辑组成。
使用系统时钟:波特率可以达到115200.
使用外部时钟,则可以达到更高的波特率。
S3C2440 UART的每个通道有64Byte的接收/发送FIFO(First In First Out)。发送数据时,CPU先将数据写入发送的FIFO中,然后UART会自动的将FIFO中的数据复制到“发送移位器”(Transmit Shifter)中,发送移位器将数据一位一位地发送到TxD数据线上。接收过程,正好与发送相反,接收移位器先从RxD数据线上将数据一位一位的保存在接收FIFO中供CPU读取。其内部结构图如下图:
S3C2440 UART每个通道支持停止位有1位、2位,数据位有5、6、7、8位,支持检验位,另外还支持红外发送/接收功能。
在使用UART之前,我们还要对UART进行一番配置,比如:设置波特率、传输格式、选择相应的引脚功能、选择UART的工作方式(中断或DMA)等等。设置过程其实就是对相关的寄存器进行赋值,下面对主要的寄存器做一下简介,其它详见手册。
1) ULCONn寄存器:用来设置传输格式
具体功能见下表:
功 能 |
位 |
说 明 |
红外模式 |
[6] |
0:正常模式; 1:红外模式 |
检验模式 |
[5:3] |
设置检验位: 0xx:无校验;(x为任意) 100:奇校验; 101:偶校验; 101:偶校验; 110:发送数据时强制为1,接收数据时检查是否为1; 111:发送数据时强制为0,接收数据时检查是否为0. |
停止位宽度 |
[2] |
0:一帧有一个停止位; 1:一帧有两个停止位。 |
数据位宽度 |
[1:0] |
00:5位; 01:6位 10:7位; 11:8位 |
2) UCONn寄存器:用于选择时钟、设置UART中断的方式。
这里只讲一下比较难理解的位:
l [5]:自环模式的选择,有时为了测试,需要将串口的发送和接收连在一起。该位就为我们提供了这个功能,如果此位为0,则串口为正常模式;若此位被置位,则打开了自环模式,UART内部模块就将TxD和RxD连在了一起,用于自发自收。
l [6]:接收错误中断使能。用于当接收过程中发生错误时是否产生中断。
3) UTRSTATn寄存器:用来表明数据是否发送完毕、是否已经接收到数据。
功 能 |
位 |
说 明 |
发送器空 |
[2] |
当发送缓冲区中没有数据,并且最后一个数据也已经发送出去,此位被自动设为1 |
发送缓冲区 |
[1] |
当发送缓冲区中没有数据时,此位被自动置1 |
接收缓冲区数据就绪 |
[0] |
当接收到数据时,此位被自动置1 |
4) UTXHn寄存器:向其写入数据,UART会自动保存在缓冲区中,并自动发送出去。
5) URXHn寄存器:当UART接收到数据时,CPU可以读此寄存器以获得数据。
本章程序在上一章的基础上,减少了中断、按键、led功能,增加了串口的功能。
程序入口依然为head.S文件,依次完成:关看门狗、初始化时钟、初始化SDRAM、代码搬运,重设栈指针,跳转到主函数(MAIN)运行。
在main.c文件中,首先调用uart0_init()函数完成对串口的初始化工作。然后,发送一句话,接着进入死循环,不断的查询是否接收到数据,如果接收到,再判断是否是数字或字母,如果是则将数据+1,再发送出去。
将编译好的.BIN文件烧到NAND FLASH中运行。注意:网上有网友问过为什么程序直接烧到0x30000000中无法运行,这是由于SP指针和.lds链接脚本的设置原因,请网友自行分析,并参考以前的博客。
本章程序运行后,首先在终端或minicom或其它的串口通讯软件上,打印出一句话:
welcome to here
It is happy and easy that studing ARM and Linux follow machoe
大家看得出,现象中的两句话是不在同一行,但第二行并没有在新一行的开头处。有兴趣的读者可以自行修改,提示一下:注意代码中的“\n“。
1.韦东山 《嵌入式LINUX应用开发完全手册》
2.三星 《S3C2440手册》
3.
4.