基于中断的UART通信系统设计.docx
- 文档编号:14170119
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:19
- 大小:286.72KB
基于中断的UART通信系统设计.docx
《基于中断的UART通信系统设计.docx》由会员分享,可在线阅读,更多相关《基于中断的UART通信系统设计.docx(19页珍藏版)》请在冰点文库上搜索。
基于中断的UART通信系统设计
西南XX大学XX学院
CollegeofXXUniversityOfXXandXX
设计题目:
基于中断的UART通信系统设计
题目类别:
实训报告
指导教师:
XX
专业班级:
XX
组员姓名:
日期:
20年xx月
XXXXX系制
基于中断的UART通信系统设计
摘要
由于UART串行口的广泛应用,在传统的8位和16位的处理器以及32位的处理器中,一般都带有UART串行口。
传统的基于UART的数据通讯中,采用的方式一共两种,查询式和中断式。
查询方式下CPU的负担比较重,浪费处理器的能力。
不能够很好的处理其他事件,中断方式可以在接收到的信息或需要发送数据时产生中断,在中断服务程序中完成。
当前嵌入式技术发展迅猛,已深入到各个领域,得到了广泛的应用。
嵌入式系统是学科领域知识的综合应用,集计算机、电子、通信和自动控制等多种技术于一体,其应用领域包括科学研究、工业控制、交通通信、医疗卫生、国防军事、消费娱乐等。
几乎所有的电子设备里都有嵌入式系统的影子。
手机、PDA、掌上电脑、机顶盒、智能家电等嵌入式产品正在影响着人们的生活。
本课题设的目的在于掌握简易项目的设计方法。
了解嵌入式系统。
目录
1系统设计2
1.1系统设计目的2
1.2系统设计要求2
1.3UART通信2
1.4UART相关寄存器2
1.5接口要求3
1.6基本原理4
1.7UART的原理方框图5
1.8单元电路的设计6
1.8.1顶层模块的设计6
1.8.2波特率发生器6
1.8.3UART接收器7
1.8.4UART接收器的原理和状态机的设计7
1.8.5UART接收器的仿真9
1.8.6UART发送器10
2系统的具体功能和要求11
2.1基本要求11
2.2硬件设计的相关原理图11
2.3软件设计平台的介绍及实现方法11
2.4程序设计流程图12
3.设计总结13
总结13
参考文献13
附录13
1.系统设计
1.1系统设计目的
本课题设计基于串口的UART通信系统设计,通过本实训掌握嵌入式系统简易项目的设计方法,理解UART的基本原理,了解RS232协议的基本内容,掌握UART驱动程序设计方法,掌握S3C2440处理器中断机制的原理,了解简易嵌入式系统设计流程。
1.2系统设计要求
本课题所设计的系统要求实现以下功能:
1、在理解基本实验代码的基础上,掌握UART接口的工作原理,基于程序查询方式的驱动设计。
2、结合S3C2440处理器的中断处理程序,理解中断机制的原理及实现方法。
3、编写基于中断的UART通信程序,实现宿主机使用超级终端或者DNW软件,实验箱端使用自编的程序,可以进行实时对话。
1.3UART通信
UART(UniversalAsynchronousReceiver/Transmitter,通用异步接收/发送装置)用于异步通信,可以实现全双工发送和接收。
它不仅可以实现不同嵌入式系统之间的通信,还可以实现与PC之间的通信。
1.4UART相关寄存器
S3C2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。
在这里,我们只给出非FIFO模式,即传输数据不利用FIFO缓存,一个字节一个字节地传输。
S3C2440A的UART单元对每个串口使用10多个寄存器,3个串口共使用了30多个寄存器。
ULCONn:
线路控制寄存器,用于设定线路的字长度、停止位个数、奇偶校验方式、是否使用红外模式。
(看的书中翻译成“线性控制寄存器”,我感觉是不正确的)
UCONn:
控制寄存器,用于设定操作模式(中断或轮询/DMA)、环回模式、中断方式、时钟选择。
UFCONn:
FIFO控制寄存器,用于控制FIFO操作方式,如是否使用FIFO以及触发级别。
UMCONn:
Modem控制寄存器,用于设置是否使用AFC(自动流控制)和RTS。
TTL2是不支持流控制的,所以没有UMCON2寄存器。
UTRSTATn:
收发状态寄存器,可从中读取收发保持寄存器的状态,即是否有数据,仅在非FIFO模式下使用。
UFSTATn:
FIFO状态寄存器,可从中读取FIFO状态信息,用于FIFO模式。
UMSTATn:
Modem状态寄存器,可从中读取Modem状态,即CTS信号状态。
TTL2不支持流控制,所以没有UMSTAT2寄存器。
UERSTATn:
错误状态寄存器,可从中读取接收错误状态。
UTXHn和URXHn:
收发保持(对非FIFO模式)和缓冲(对FIFO模式)寄存器,用于收发数据。
UBRDIV:
波特率除数寄存器,用于设定串口通信波特率。
1.5接口要求
在理解基本实验代码的基础上,掌握UART接口的工作原理,基于程序查询方式的驱动设计。
结合S3C2440处理器的中断处理程序,理解中断机制的原理及实现方法。
编写基于中断的UART通信程序,实现宿主机使用超级终端或者DNW软件,实验箱端使用自编的程序,可以进行实时对话。
1.6基本原理
UART即UniversalAsynchronousReceiverTransmitter通用异步收发器,是一种应用广泛的短距离串行传输接口。
往往用于短距离、低速、低成本的微机与下拉机的通讯中。
8250、8251、NS16450等芯片都是常见的UART器件。
常见的UART连接通信图如图6.1.1所示。
图1.1UART三线连接通信示意图
图中两边的TXD、RXD信号是交错的。
TXD是UART发送端,为输出;RXD是UART接收端,为输入。
在TXD、RXD信号线上的电平也不是普通的TTL5V电平,而是RS232的接口电平。
基本UART只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是互不干扰的,也是全双工的,这样就大大降低了传送的费用。
但要求在TXD、RXD指定一定的规则,以使接收、发送之间能协调一致。
UART的基本概念:
(1)在信号线上共有两种状态,可分别用逻辑1和逻辑0来区分。
在发送器空闲时,数据线应该保持在逻辑1状态。
(2)起始位(StartBit)。
发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接收器数据传输即将开始。
(3)数据位(DataBits)。
起始位之后就是传送数据位。
数据位一般为一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。
(4)校验位(parityBit)。
可以认为是一个特殊的数据位。
校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。
在使用中,该位常常取消。
(5)停止位。
停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。
(6)位时间。
即每个位的时间宽度。
起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。
(7)帧。
从起始位开始到停止位结束的时间间隔称之为一帧。
(8)波特率。
UART的传送速率,用于说明数据传送的快慢。
在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。
如波特率9600=9600bps(位/秒)。
UART的数据帧格式为:
START
D0
D1
D2
D3
D4
D5
D6
D7
P
STOP
起始位
数据位
校验位
停止位
UART的整个设计模块分为三个子模块和一个模块:
(1)波特率发生器;
(2)接收模块;(3)发送模块;(4)总模块。
帧的基本时序如图6.1.2所示。
图1.2帧的基本时序
1.7UART的原理方框图
异步收发器的原理框图如图6.2.1所示。
图1.3异步收发器的原理框图
1.8单元电路的设计
1.8.1顶层模块的设计
异步收发器的顶层模块由波特率发生器、UART接收器和UART发送器构成。
UART发送器的用途是将准备输出的并行数据按照基本UART帧格式转为TXD信号串行输出;UART接收器接收RXD串行信号,并将其转化为并行数据,但串并转换的时钟同发送器一样处理,收发设备间的时钟是会累计的,会导致接收数据不正确,波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样,以不断地让接收器与发送器保持同步。
1.8.2波特率发生器
波特率发生器实际上就是一个简单的分频器。
可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子。
已算出的波特率分频因子作为分频器的分频数。
对于波特率发生器中的系数一般在FPGA实现时往往是固定的(同UART专用芯片不同,FPGA具体设计的易改性,而专用芯片不易改动,所以UART专用芯片中还需要加上复杂接口以便在使用时改变波特率),但对于不同的实现,这个系数需要更改。
使用VHDL的Generic语句可使问题获得两全其美的解决。
波特率发生器产生的分频时钟,不是波特率时钟,而是波特率时钟的16倍,目的是为了在接收事实进行精确地采样,以提出异步的串行数据。
仿真波形如图7.2.1所示。
图1.4波特率发生器的仿真波形
1.8.3UART接收器
图1.5UART接收器
1.8.4UART接收器的原理和状态机的设计
由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。
然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。
由于内部采样时钟bclk周期(波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。
如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。
图7.3.1是UART接收器的接收状态机。
图1.6UART接收器的接收状态机
状态机一共有5个状态:
R_START(等待起始位)、R_CENTER(求中点)、R_WAIT(等待采样)、R_SAMPLE(采样)、R_STOP(停止位接收)。
R_START状态:
当UART接收器复位后,接收状态机将处于这一个状态。
在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。
图2.1中的RXD_SYNC信号是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的RXD_SYNC信号。
R_CENTER状态:
对于异步串行信号,为了使每一次都检测到正确的位信号,而且在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。
在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。
另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。
这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。
R_WAIT状态:
当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度(FRAMELEN),如果到来,就说明停止位来临了。
FRAMELEN在设计时是可更改的(使用了Generic),在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。
R_SAMPLE状态:
即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。
R_STOP状态:
无论停止位是1还是1.5位,或是2位,状态机在R_STOP不具体检测RXD,只是输出帧接收完毕信号(REC_DONE<=‘1’),停止位后状态机转回到R_START状态,等待下一个帧的起始位。
状态机的VHDL代码见附录1程序清单。
1.8.5UART接收器的仿真
UART接收器的仿真波形如图1.7所示。
图1.7UART接收器的仿真波形
1.8.6UART发送器
图1.8UART发送器
2系统整体设计
2.1整体要求
本课题所设计的系统要求:
(1)在理解基本实验代码的基础上,掌握UART接口的工作原理,基于程序查询方式的驱动设计。
(2)结合S3C2440处理器的中断处理程序,理解中断机制的原理及实现方法。
(3)编写基于中断的UART通信程序,实现宿主机使用超级终端或者DNW软件,实验箱端使用自编的程序,可以进行实时对话。
2.2硬件设计
图2.1接收机的流程图
2.3软件设计
本设计中采用可编程逻辑设计环境ARMDeveloperSuitev1.2进行设计。
DNW超级终端。
JTAG接口。
2.4程序设计流程图
图2.2接收机的流程图
3.设计总结
总结
通过用实验室的嵌入式教学实验系统进行测试,本设计能很好的完成通讯的功能,各项指标均达到了设计要求。
通过本次实验,小组的各成员深刻理解了有关中断的UART通信系统设计的相关知识和内容,对嵌入式实验系统有了进一步的了解。
本实验让我们每位组员认识了包括了IO口,串口,定时器以及中断的方面知识,实验为我们在日后深入学习嵌入式奠定了坚实的基础。
参考文献
1.潘松,黄继业.EDA技术实用教程[M].北京:
科学出版社,2002.10第一版.
2.赵俊超等.集成电路设计VHDL教程[M].北京:
北京希望点子出版社,2002.8.第一版.
附录
程序:
#include"2440addr.h"
#define_ISR_STARTADDRESS0x33ffff00//总函数的入口地址
#defineUintunsignedint
#definepISR_TIMER1(*(unsigned*)(_ISR_STARTADDRESS+0x4c))//中断函数入口地址
#definerGPBCON(*(volatileunsigned*)0x56000010)//B口控制寄存器入口地址
#definerGPBDAT(*(volatileunsigned*)0x56000014)//B口的数据寄存器入口地址
#definerGPBUP(*(volatileunsigned*)0x56000018)//B口上拉使能入口地址
#definerTCFG0(*(volatileunsigned*)0x51000000)//定时器配置寄存器0(预分频值)入口地址
#definerTCFG1(*(volatileunsigned*)0x51000004)//定时器配置寄存器1(分频值)入口地址
#definerTCON(*(volatileunsigned*)0x51000008)//定时器控制寄存器入口地址
#definerTCNTB1(*(volatileunsigned*)0x51000018)//定时器计数缓冲寄存器入口地址
#defineULCON0(*(volatileunsigned*)0X50000000)//UART线控制寄存器
#defineUCON0(*(volatileunsigned*)0X50000004)//UART控制寄存器
#defineUFCON0(*(volatileunsigned*)0X50000008)//FIFO控制寄存器
#defineUTRSTAT0(*(volatileunsigned*)0X50000010)//UART状态寄存器
#defineUBRDIV0(*(volatileunsigned*)0X50000028)//波特率
#defineUTXH0(*(volatileunsigned*)0X50000020)
#defineURXH0(*(volatileunsigned*)0X50000024)
#defineGPBDAT(*(volatileunsigned*)0X58000054)
charbuf;
void__irqTimer1_ISR(void)
{
rSRCPND=rSRCPND|(0x1<<11);
rINTPND=rINTPND|(0x1<<11);
rGPBDAT&=0xfe;//关蜂鸣器
}
voidtimer1()
{
rGPBCON|=0X0000001;//B0输出,给蜂鸣器;B5~B8输出,给LED
rGPBUP&=0xffe;//GPB口使能
rGPBDAT&=0xffe;//蜂鸣器不响,LED灭
rSRCPND=rSRCPND|(0x1<<11);//中断源挂起寄存器的11位置1
rINTPND=rINTPND|(0x1<<11);//中断状态指示寄存器的11位置1
rINTMSK&=0xfffff7ff;//打开定时器1中断
rTCFG0=255;//prescaler等于255
rTCFG1&=~0x000f0;
rTCFG1|=0x00030;//16分频,则设置定时器1的时钟频率为25kHz
rTCNTB1=484*buf;//让定时器1每隔2秒中断一次,即蜂鸣器响一次的时间
rTCON&=~0x000f00;//定时器1初始化清零
rTCON|=0x000f00;//开启定时器1并自动重装
rTCON&=0xfffdff;//关闭定时器1手动重装
pISR_TIMER1=(Uint)Timer1_ISR;//定时器1的中断入口地址
ULCON0&=0XFFFFFF00;
ULCON0|=0X03;//1位起始位,8位数据位
UCON0=0X0805;//串口时钟PCLK,查询方式
UBRDIV0=0X1A;//波特率115200
}
voidMain(void)
{
timer1();
while
(1)
{
if(UTRSTAT0&0X01)//接收是否完毕=1结束
{
buf=URXH0;//读取数据
while(!
(UTRSTAT0&0X04));//是否允许发送=1允许
rGPBDAT|=0x1;//开蜂鸣器
UTXH0=buf
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 中断 UART 通信 系统 设计