
| 串口通信实验 | ||||
| 一、实验目的 1.掌握ARM的串行口工作原理。 2.学习编程实现ARM的UART通讯。 3.掌握CPU利用串口通讯的方法。 二、实验内容 学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯: ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。 三、实验原理介绍 通信方式 在通信过程中,如果通信仅在点对点之间进行,或者 点对多点之间进行,那么,按消息传输的方向和时间的不同,可以将通信分为单工通信、全双工通信以及半双工通信。 (1)单工 消息只能单方向进行传输的一种通信方式称为单工通信。如图8-1所示,通信只能从A传输到B。这好比一条绝对方向的单行道路,不准双向通信也不能逆向行驶。在现代通信系统中,如模拟广播电视系统(不包括现正在研究应用的HFC双向网络)、无线寻呼系统等。信号只能从广播电视台、无线寻呼中心发送到电视机接收机、BB机上。 图8-1 单工通信方式 (2)全双工 全双工通信是指通信双方可以同时进行双向数据传输而互不影响的工作方式。如图8-2所示,在这种工作方式下,通信双方都可以同时进行信息的发送和接收,因此,全双工通信的信道必须是双向信道。如果是有线的全双工方式,通信双方会有两根的信号线分别传输发送信号和接收信号,从而使得发送和接收可同时进行。生活中的普通电话系统、移动通信系统都是全双工方式。 图8-2 双工通信方式 (3)半双工 这种方式允许数据传输做双向操作,即不仅可以发送,亦可以接收信号,但是,在同一时刻,只能进行发送和接收任意一个操作。因此仍然只采用一个信道。如图8-3所示,如果是有线通信,通信双方只需要一根数据线连接,但是比全双工方式耗时会更多。如对讲机系统就是采用的半双工通信方式。 图8-3 半双通信方式 串行同步通信与串行异步方式 在通信过程中,发送方和接收方每次都只发送和接收一位数据的通信方式称为串行通信方式。也就是说,在任意一个时刻,数据线上仅有一位数据。在传输数据过程中,双方需要协商时钟信号,即规定什么时候发送数据和接收数据,以及每位数据所占用的时间宽度。根据双方接收和发送数据所采用的时钟信号是否是同一个时钟源而分为串行异步通信方式和串行同步通信方式。串行异步通信方式中,通信双方采用自己的时钟信号,根据信号的起始位等判断信息,因此接收和发送仅需要两根信号线分别用来传送和接收信号。而串行同步通信方式中,由通信双方的一方(或者另外设备)提供统一的时钟信号,在一定程序上提高通信速率,但这种通信方式需要额外的时钟信号线。另外,这种通信方式不适合远距离传输,因为远距离会使时钟信号受到干扰,出现误码等现象。 (1)串行异步通信方式 在异步传输模式下,传输数据以字符为单位,数据传输速率多在1.2kb/s以下。当发送一个字符代码时: ● 字符前面要加一个起始信号,其长度为一个码元,极性为“0”,即空号极性。 ● 字符后面要加一个终止符号,其长度为1-2个码元,极性为“1”,即传号极性。 加上起始终止信号后,即可区分出所传输的字符,传送时,字符可以连续发送,也可以单独发送,不发字符时线路保持“1”状态,如图8-4所示为起止式同步传输序列,每个字符由8bit组成,加上起止位,信号共11位,两字符之间的间隔长度可以不固定。实现起来比较简单。 图8-4 异步传输模式帧格式 异步串行通信协议规定字符数据的传输规范总结起来有以下几点: 起始位: 通信线上没有数据被传送时处于逻辑“1”状态,当发送设备要发送一个字符数据时,首选发送一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收机,接收设备检测到这低电平后,就开始准备接收数据位信号。起始位所起的作用就是使设备同步,通信双方必需在传送数据位前一致同步。 数据位: 当接收设备收到起始位后,开始接收数据位。数据位的个数可以是5-9位,PC机中经常采用7-8位数据传送。在字符传送过程中,数据位从最低有效位开始传送,依次在接收设备中被转换为并行数据。 奇偶校验位: 数据位发送完后,为了保证数据的可靠性传输,常传送奇偶校验位。奇偶校验用于有限差错检测。如果选择偶校验,则数据位和奇偶位的逻辑“1”的个数必须为偶数,相反,如果是奇校验,逻辑“1”的个数为奇数。 停止位: 在奇偶位或者数据位(当无奇偶校验时)之后发送停止位。停止位是一个字符数据的结束,可以是1-2位的低电平,接收设备收到停止位后,通信线路便恢复逻辑“1”状态,直到下一个字符数据的起始位到来。 波特率设置: 通信线路上传送的所有位信号都保持一致的信号持续时间,每一位的宽度都由数据的码元传送速率确定,而码元速率是单位时间内传送的码元的个数,即波特率。 (2)串行同步通信方式 在同步通信中,通信双方使用同一个时钟源,这个时钟信号可以由通信方式的一方提供或者由第三方提供。其时序图如图8-5所示,所有要传输的数据都需要与此时钟信号同步,即每个传输的数据所占用的时间宽度都需要与一个时钟变换所用时间相等。即数据在时钟跳变(上升沿和下降沿)后一段时间内有效。相应的,接收方根据时钟跳变来确定何时接收一位数据。同步传输使用不同的方式来表示一次传输的开始和结束。 图8-5 串行同步通信方式 S3C2410芯片UART 基于ARM9内核架构的嵌入式处理器的S3C2410的UART(Universal Asynchronous Receiver and Transmitter)单元拥有3个SIO(saynchronous serial I/O),每个单元都可以工作在中断模式以及DMA(Direct Memory Access)模式。UART最大速率可以达到230.4kbps。如果外部设备提供一个时钟信号,其可以工作在更新的通信速率。每个UART通道都包含两个16bit的FIFO来接收和发送数据。 S3C2410处理器的UART支持可编程波特率、IR(infra-red)传输,1~2位停止位,5~8位数据宽度,同时支持奇偶校验。 S3C2410芯片UART结构图 如图8-11所示为S3C2410芯片UART结构图。 图8-11 S3C2410芯片UART结构图 数据发送 S3C2410芯片UART支持可编程数据传输帧格式。在数据帧中包含起止位、5~8位数据位、一位奇偶校验位以及1~2位停止位。具体设置可以在控制寄存器(ULCONn)设置。同时,传输装置支持中断方式,即在传输的时候强制输出逻辑0中断信号。此中断信号在完成一个字符传输后传输,之后传输器继续传输数据至Tx FIFO。 数据接收 同理,接收器亦支持可编程方式,同样包含起止位、5~8位数据位、一位奇偶校验位以及1~2位停止位,具体设置可以在控制寄存器(ULCONn)设置。接收器亦可以探测到数据溢出错误、奇偶校验错误、帧错误以及中断信号,并且每种情况都可置相应的错误标识。 数据溢出错误:在上一字符没有接收完成时新的数据已经到达,从而覆盖了原来的数据。 奇偶校验错误:奇偶位不满足奇偶条件。 帧错误:接收数据没有有效的停止位。 中断信号:RxDn输出持续逻辑0信号(持续时间超过一帧)。 功能寄存器 (1)列控制寄存器 S3C2410的UART单元包含三个列控制寄存器,分别是ULCON0, ULCON1和ULCON2。其说明如表8-6所示。 表8-6 列控制寄存器 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| ULCON0 | 0x50000000 | 可读/写 | UART0列控制寄存器 | 0x00 |
| ULCON1 | 0x50004000 | 可读/写 | UART1列控制寄存器 | 0x00 |
| ULCON2 | 0x50008000 | 可读/写 | UART2列控制寄存器 | 0x00 |
表8-7 ULCONn各位功能描述
| ULCONn | 位 | 说明 | 初始化状态 |
| 保留位 | 7 | 0 | |
| 红外模式 | 6 | 设置是否采用红外模式。0=普通模式,1=红外模式 | 0 |
| 奇偶校验模式 | [5:3] | 设置在奇何偶校验模式方式:0XX:=无;100=奇校验;101=偶校验;110=强制为1;111=强制为0。 | 000 |
| 停止位 | [2] | 设置每帧停止位位数:0=1位停止位;1=两位停止位。 | 0 |
| 字长度 | [1:0] | 设置每帧数据位长度:00=5位、01=6位、10=7位、11=8位。 | 0 |
S3C2410的UART单元包含三个控制寄存器,分别是UCON0, UCON1和UCON2。其说明如表8-8所示。
表8-8控制寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UCON0 | 0x50000004 | 可读/写 | UART0控制寄存器 | 0x00 |
| UCON1 | 0x50004004 | 可读/写 | UART1控制寄存器 | 0x00 |
| UCON2 | 0x50008004 | 可读/写 | UART2控制寄存器 | 0x00 |
表8-9 UCONn各位功能描述
| UCONn | 位 | 说明 | 初始化状态 |
| 时钟选择 | 10 | 选择时钟来源。0=PCLK,1=UCLK。 | 0 |
| Tx中断类型 | 9 | 中断请求类型。0=Pulse。1=Level。 | 0 |
| Rx中断类型 | 8 | 中断请求类型。0=Pulse。1=Level。 | 0 |
| Rx超时 | 7 | 禁止/允许接收超时终端。0=禁止;1=允许。 | 0 |
| 接收错误状态中断允许 | 6 | 当产生异常时使能UART产生中断中断。如帧错误、奇偶校验错误、溢出错误。0=不产生,1=产生。 | 0 |
| 回环模式 | 5 | 设置是否进入回环模式。0=普通模式;1=回环模式。 | 0 |
| 发送中断信号 | 4 | 设置UART产生中断信号。如果发出一个中断后,此位将自动清0。0=普通传输,1=发送中断信号。 | 0 |
| 传输模式 | [3:2] | 决定当前UART采用何种传输模式。00=禁止;01=中断或者轮流模式;10=DMA0请求(UART0),DMA3请求(UART2);11=DMA1请求(UART0)。 | 00 |
| 接收模式 | [1:0] | 决定当前UART采用何种接收模式。00=禁止;01=中断或者轮流模式;10=DMA0请求(UART0),DMA3请求(UART2);11=DMA1请求(UART0)。 | 00 |
S3C2410的UART单元包含三个FIFO控制寄存器,分别是UFCON0, UFCON1和UFCON2。其说明如表8-10所示。
表8-10 FIFO控制寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UFCON0 | 0x50000008 | 可读/写 | UART0 FIFO控制寄存器 | 0x00 |
| UFCON1 | 0x50004008 | 可读/写 | UART1 FIFO控制寄存器 | 0x00 |
| UFCON2 | 0x50008008 | 可读/写 | UART2 FIFO控制寄存器 | 0x00 |
表8-11 UFCONn各位功能描述
| UFCONn | 位 | 说明 | 初始化状态 |
| Tx FIFO触发方式 | [7:6] | 决定传输FIFO信号标准。00 =空,01 = 4-byte,10 = 8-byte,11 = 12-byte。 | 00 |
| Rx FIFO触发方式 | [5:4] | 决定接收FIFO信号标准。00 = 4-byte,01 = 8-byte,10 = 12-byte,11 = 16-byte。 | 00 |
| 保留 | 3 | 0 | |
| Tx FIFO复位 | 2 | 自动清零。0 = 一般模式 1= Tx FIFO复位。 | 0 |
| Rx FIFO复位 | 1 | 自动清零。0 = 一般模式 1= Tx FIFO复位。 | 0 |
| FIFO使能 | 0 | 0=禁止,1=使能。 | 0 |
S3C2410的UART单元包含三个MODEM控制寄存器,分别是UMCON0, UMCON1和UMCON2。其说明如表8-12所示。
表8-12 MODEM控制寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UMCON0 | 0x5000000C | 可读/写 | UART0 MODEM控制寄存器 | 0x00 |
| UMCON1 | 0x5000400C | 可读/写 | UART1 MODEM控制寄存器 | 0x00 |
| 保留 | 0x5000800C | --- | 保留 | --- |
表8-13 MODEM各位功能描述
| MODEMn | 位 | 说明 | 初始化状态 |
| 保留 | [7:5] | 这些位必须为0 | 00 |
| AFC | 4 | 1=使能,0=禁止 | 0 |
| 保留 | [3:1] | 这些位必须为0 | 000 |
| 请求发送 | 0 | 如果使能AFC,此位将被忽略。S3C2410将自动控制nRTS信号。如果禁止AFC。nRTS必须由软件控制。0=高电平,1=低电平。 | 0 |
S3C2410的UART单元包含三个Tx/Rx状态寄存器,分别是UTRSTAT 0, UTRSTAT1和UTRSTAT 2。其说明如表8-14所示。
表8-14 MODEM控制寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UTRSTAT0 | 0x50000010 | 可读 | UART0 Tx/Rx状态寄存器 | 0x6 |
| UTRSTAT 1 | 0x50004010 | 可读 | UART1 Tx/Rx状态寄存器 | 0x6 |
| UTRSTAT2 | 0x50008010 | 可读 | UART2 Tx/Rx状态寄存器 | 0x6 |
表8-15 UTRSTATn各位功能描述
| UTRSTAT n | 位 | 说明 | 初始化状态 |
| 传输装置空 | 2 | 当传输buffer寄存器没有可用数据传输或者传输移位寄存器为空时自动设置为1。0=非空;1=空。 | 1 |
| 传输Buffer空 | 1 | 当传输寄存器为空时自动设置为1。0=非空,1=空。 | 1 |
| 接收Buffer数据准备好 | 0 | 当接收buffer寄存器有有效数据通过RxDn端口接收数据。0=空,1=有接收数据。 | 0 |
S3C2410的UART单元包含三个错误状态寄存器,分别是UERSTAT0, UERSTAT1和UERSTAT2。其说明如表8-16所示。
表8-16 错误状态寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UERSTAT 0 | 0x50000014 | 可读 | UART0 错误状态寄存器 | 0x0 |
| UERSTAT 1 | 0x50004014 | 可读 | UART1 错误状态寄存器 | 0x0 |
| UERSTAT 2 | 0x50008014 | 可读 | UART2 错误状态寄存器 | 0x0 |
表8-17 UERSTAT n各位功能描述
| UERSTAT n | 位 | 说明 | 初始化状态 |
| 保留 | 3 | 0=接收时无帧错误;1=帧错误。 | 0 |
| 帧错误 | 2 | 在接收操作时无论何时出现错误将自动置1。0=无帧错误。1=帧错误。 | 0 |
| 保留 | 1 | 0=无帧错误。1=帧错误。 | 0 |
| 溢出错误 | 0 | 无论何时发生溢出错误将置此位为1。0=无错误。1=溢出错误。 | 0 |
S3C2410的UART单元包含三个FIFO状态寄存器,分别是UFSTAT0, UFSTAT1和UFSTAT2。其说明如表8-18所示。
表8-18 FIFO状态寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UFSTAT 0 | 0x50000018 | 可读 | UART0 FIFO状态寄存器 | 0x00 |
| UFSTAT 1 | 0x50004018 | 可读 | UART1 FIFO状态寄存器 | 0x00 |
| UFSTAT 2 | 0x50008018 | 可读 | UART2 FIFO状态寄存器 | 0x00 |
表8-19 UFSTAT n各位功能描述
| UFSTAT n | 位 | 说明 | 初始化状态 |
| 保留 | [15:10] | 0=接收时无帧错误;1=帧错误。 | 0 |
| Tx FIFO满 | 9 | 如果传送FIFO满将自动设置此位为1。0=0位<=Tx FIFO数据<=15位;1=FULL。 | 0 |
| Rx FIFO满 | 8 | 如果接收FIFO满将自动设置此位为1。0=0位<=Tx FIFO数据<=15位;1=FULL。 | 0 |
| Tx FIFO计数器 | [7:4] | Tx FIFO数据个数。 | 0 |
| Rx FIFO计数器 | [3:0] | Rx FIFO数据个数。 | 0 |
S3C2410的UART单元包含三个MODEM状态寄存器,分别是UMSTAT0, UMSTAT1和UMSTAT2。其说明如表8-20所示。
表8-18 MODEM状态寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UMSTAT 0 | 0x5000001C | 可读 | UART0 FIFO状态寄存器 | 0x00 |
| UMSTAT 1 | 0x5000401C | 可读 | UART1 FIFO状态寄存器 | 0x00 |
| 保留 | 0x5000801C | --- | 保留 | --- |
表8-20 UMSTAT n各位功能描述
| UMSTAT n | 位 | 说明 | 初始化状态 |
| 保留 | 3 | 0 | |
| Delta CTS | 2 | 指示nCTS值相对于上次CPU读取输入状态发生了改变。0=没有发生变化,1=变化。 | 0 |
| 保留 | 1 | 0 | |
| 发送清除 | 0 | 0=CTS信号没有激活(高电平);1=CTS激活(低电平)。 | 0 |
S3C2410的UART单元包含三个传输缓冲寄存器,分别是UTXH0, UTXH1和UTXH2。其说明如表8-21所示。
表8-21 传输缓冲寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UTXH 0 | 0x50000020(L) 0x50000023(B) | 可写(字节) | UART0 传输缓冲寄存器 | |
| UTXH 1 | 0x50004020(L) 0x50004023(B) | 可写(字节) | UART1 传输缓冲寄存器 | |
| UTXH2 | 0x50008020(L) 0x50008023(B) | 可写(字节) | UART2 传输缓冲寄存器 |
S3C2410的UART单元包含三个接收缓冲寄存器,分别是URXH0, URXH1和URXH 2。其说明如表8-22所示。
表8-22 接收缓冲寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| URXH 0 | 0x50000024(L) 0x50000027(B) | 可写(字节) | UART0 接收缓冲寄存器 | |
| URXH 1 | 0x50004024(L) 0x50004027(B) | 可写(字节) | UART1 接收缓冲寄存器 | |
| URXH 2 | 0x50008024(L) 0x50008027(B) | 可写(字节) | UART2 接收缓冲寄存器 |
S3C2410的UART单元包含三个波特率约数寄存器,分别是UBRDIV0, UBRDIV1和UBRDIV2。其说明如表8-232所示。
表8-23 波特率约数寄存器
| 寄存器 | 地址 | 读/写 | 说明 | 复位值 |
| UBRDIV 0 | 0x50000028 | 可读/写 | UART0 波特率约数寄存器 | |
| UBRDIV1 | 0x50004028 | 可读/写 | UART1 波特率约数寄存器 | |
| UBRDIV 2 | 0x50008028 | 可读/写 | UART2 接波特率约数寄存器 |
如图8-13所示为S3C2410芯片UART采用MAX3232进行电平转换,从而输出RS232C标准信号的电路图。MAX3232主要实现电平转换功能。两个DB9硬件接口(UART0、UART1)可以直接与计算机以及其它符合RS232C标准的串行接口直接相连。MAX3232左侧的TXD0、RXD0、TXD1、RXD1分别与S3C2410芯片UART0和UART1相连。
图8-13 S3C2410芯片UART接口电平转换电路
四、串行通信实验及C源代码分析
本处给出一个无操作系统支持的串行通信测试程序及源码分析及试验步骤,此试验步骤以博创UP-NETARM2410为试验平台,其串行通信接口电路图如图8-11所示,软件开发平台为ADS1.2(ARM Developer Suite v1.2)。如果读者选用其它硬件平台,试验步骤可能略有差异。但是,此程序可以不经过任何修改即可直接使用。
因为采用无操作系统支持的方式编译此程序,因此,此程序在上传到试验箱时最好能够有bootloader程序加载。当然,读者也可以采用直接烧写的方式加载。
根据图8-11所示硬件电路,此硬件连接方式中每一个串口有两根信号线(TXD和RXD)分别用来传输和发送数据。因此,本试验采用串口异步通信方式。与此程序相关的源代码如下所示。
(1)与UART相关的寄存器宏定义。
● #define UART_CTL_BASE 0x50000000 /*UART寄存器基地址 */
● #define UART0_CTL_BASE UART_CTL_BASE /*UART0 寄存器基地址 */
● #define UART1_CTL_BASE UART_CTL_BASE + 0x4000 /*UART1 寄存器基地址 */
● #define UART2_CTL_BASE UART_CTL_BASE + 0x8000 /*UART2 寄存器基地址 */
● #define bUART(x, Nb) __REG(UART_CTL_BASE + (x)*0x4000 + (Nb))
● /* Offset */
● #define oULCON 0x00 /* R/W, UART 线性控制寄存器 */
● #define oUCON 0x04 /* R/W, UART 控制寄存器 */
● #define oUFCON 0x08 /* R/W, UART FIFO控制寄存器 */
● #define oUMCON 0x0C /* R/W, UART modem 控制寄存器 */
● #define oUTRSTAT 0x10 /* R , UART Tx/Rx状态寄存器 */
● #define oUERSTAT 0x14 /* R , UART Rx error状态寄存器 */
● #define oUFSTAT 0x18 /* R , UART FIFO 状态寄存器 */
● #define oUMSTAT 0x1C /* R , UART Modem 状态寄存器*/
● #define oUTXHL 0x20 /* W, UART transmit(小端模式) buffer */
● #define oUTXHB 0x23 /* W, UART transmit(大端模式) buffer */
● #define oURXHL 0x24 /* R , UART receive(小端模式) buffer */
● #define oURXHB 0x27 /* R , UART receive(大端模式) buffer */
● #define oUBRDIV 0x28 /* R/W, 波特率约数 寄存器 */
● /* Registers */
● #define ULCON0 bUART(0, oULCON)
● #define UCON0 bUART(0, oUCON)
● #define UFCON0 bUART(0, oUFCON)
● #define UMCON0 bUART(0, oUMCON)
● #define UTRSTAT0 bUART(0, oUTRSTAT)
● #define UERSTAT0 bUART(0, oUERSTAT)
● #define UFSTAT0 bUART(0, oUFSTAT)
● #define UMSTAT0 bUART(0, oUMSTAT)
● #define UTXH0 bUART(0, oUTXHL)
● #define URXH0 bUART(0, oURXHL)
● #define UBRDIV0 bUART(0, oUBRDIV)
● #define ULCON1 bUART(1, oULCON)
● #define UCON1 bUART(1, oUCON)
● #define UFCON1 bUART(1, oUFCON)
● #define UMCON1 bUART(1, oUMCON)
● #define UTRSTAT1 bUART(1, oUTRSTAT)
● #define UERSTAT1 bUART(1, oUERSTAT)
● #define UFSTAT1 bUART(1, oUFSTAT)
● #define UMSTAT1 bUART(1, oUMSTAT)
● #define UTXH1 bUART(1, oUTXHL)
● #define URXH1 bUART(1, oURXHL)
● #define UBRDIV1 bUART(1, oUBRDIV)
● #define ULCON2 bUART(2, oULCON)
● #define UCON2 bUART(2, oUCON)
● #define UFCON2 bUART(2, oUFCON)
● #define UMCON2 bUART(2, oUMCON)
● #define UTRSTAT2 bUART(2, oUTRSTAT)
● #define UERSTAT2 bUART(2, oUERSTAT)
● #define UFSTAT2 bUART(2, oUFSTAT)
● #define UMSTAT2 bUART(2, oUMSTAT)
● #define UTXH2 bUART(2, oUTXHL)
● #define URXH2 bUART(2, oURXHL)
● #define UBRDIV2 bUART(2, oUBRDIV)
(2)发送一个字符
● #define WrUTXH0(ch) (*(volatile unsigned char *) UTXH0)=(unsigned char)(ch)
● #define WrUTXH1(ch) (*(volatile unsigned char *) UTXH1)=(unsigned char)(ch)
● void Uart_SendByten(int Uartnum, U8 data)//向uartnum发送数据data
● { //#define U8 unsigned char
● if(Uartnum==0)
● {
while(!(UTRSTAT0 & 0x4)); // UART0 Tx/Rx状态寄存器,其第2位标识传输buffer寄存器//是否为空(0为空),发送数据直到传输buffer寄存器为空
● hudelay(10); //等待10ms
● WrUTXH0(data); //发送data到传输UTXH0中
● }
● Else //否则选用UART1
● {
● while(!(rUTRSTAT1 & 0x4));
● hudelay(10);
● WrUTXH1(data);
● }
● }
(3)接收字符测试程序
● char Uart_Getchn(char* Revdata, int Uartnum, int timeout)
● { // Revdata为接收的数据,uartnum为串口标识,timeout为超时
● if(Uartnum==0)
● {
● while(!(UTRSTAT0 & 0x1));//UART0 Tx/Rx状态寄存器的第0位标识接收
● //buffer数据是否准备好。1=有接收数据
● *Revdata=URXH0(); // URXH0:UART0的接收缓冲寄存器
● return 1;
● }
● Else //如果从UART1接收数据
● {
● while(!(rUTRSTAT1 & 0x1));//Receive data read
● *Revdata=RdURXH1();
● return TRUE;
● }
● }
(4)测试主程序
● int main(void)
● {
● char c1[1];
● char err;
● ARMTargetInit(); // 初始化ARM2410最小系统
● Uart_SendByten(0,0xa); //换行
● Uart_SendByten(0,0xd); //回车
● Uart_SendByten(0,'t'); //输出test字符
● Uart_SendByten(0,'e');
● Uart_SendByten(0,'s');
● uart_SendByten(0,'t');
● Uart_SendByten(0,'!');
● while(1) //此程序一直执行
● {
● Uart_SendByten(0,0xa); //换行
● Uart_SendByten(0,0xd); //回车
● Uart_SendByten(0,0xa); //换行
● Uart_SendByten(0,0xd); //回车
● err=Uart_Getchn(c1,0,0); //接收字符
● Uart_SendByten(0,c1[0]); //发送字符
● }
写一个程序,用一个链表存储接收的多个字符,只有当遇到回车时标识接收数据完成,并输出此段字符数据。
写一个程序,用串口1发送数据,用串口2接收数据(相同设置)。
写一个程序,用串口1发送数据,用串口2接收数据(不相同设置)。
初始化设置
| (波特率,奇偶校验,数据位) |
