欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    ARM实验三-ARM的串行口实验(共10页).doc

    • 资源ID:13850202       资源大小:133.50KB        全文页数:10页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARM实验三-ARM的串行口实验(共10页).doc

    精选优质文档-倾情为你奉上实验三 ARM的串行口实验 一、实验目的1掌握ARM的串行口工作原理。2学习编程实现ARM的UART通讯。3掌握CPU利用串口通讯的方法。二、实验内容学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯:ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。三、预备知识1用EWARM集成开发环境,编写和调试程序的基本过程。2ARM应用程序的框架结构。3、了解串行总线。四、实验设备及工具硬件:ARM嵌入式开发平台、PC机Pentium100以上、用于ARM920T的JTAG仿真器、串口线。软件:PC机操作系统Win2000或WinXP、EWARM集成开发环境、仿真器驱动程序、超级终端通讯程序。五、实验原理及说明1异步串行IO异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行IO可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行IO方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。图2-1 串行通信字符格式图2-1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:1)奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。2)帧格式错:一个字符从起始位到停止位的总位数不对。3)溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。每一种错误都会给出相应的出错信息,提示用户处理。2串行接口的物理层标准通用的串行IO接口有许多种,现仅就最常见的两种标准作简单介绍。1)EIA RS232C这是美国电子工业协会推荐的一种标准(Electronic industries Association Recoil-mended Standard)。它在一种25针接插件(DB25)上定义了串行通信的有关信号。这个标准后来被世界各国所接受并使用到计算机的IO接口中。信号连线在实际异步串行通信中,并不要求用全部的RS232C信号,许多PCXT兼容机仅用15针接插件(DB15)来引出其异步串行IO信号,而PC中更是大量采用9针接插件(DB9)来担当此任,因此这里也不打算就RS232C的全部信号作详细解释。图3-2给出两台微机利用RS232C接口通信的联线(无MODEM),我们按DB25的引脚号标注各个信号。下面对图3-2中几个主要信号作简要说明。保护地 通信线两端所接设备的金属外壳通过此线相联。当通信电缆使用屏蔽线时,常利用其外皮金属屏蔽网来实现。由于各设备往往已通过电源线接通保护地,因此,通信线中不必重复接此地线(图中用虚线表示)。例如使用9针插头(DB9)的异步串行IO接口就没有引出保护地信号。TXDRXD 是一对数据线,TXD称发送数据输出,RXD称接收数据输入。当两台微机以全双工方式直接通信(无MODEM方式)时,双方的这两根线应交叉联接(扭接)。信号地 所有的信号都要通过信号地线构成耦合回路。通信线有以上三条(TXD、RXD和信号地)就能工作了。其余信号主要用于双方设备通信过程中的联络(握手信号),而且有些信号仅用于和MODEM的联络。若采取微型机对微型机直接通信,且双方可直接对异步串行通信电路芯片编程,若设置成不要任何联络信号,则其它线都可不接。有时在通信线的同一端将相关信号短接以“自握手”方式满足联络要求。这就是如图2-2(a)所示的情况。图2-2 实用RS-232C连线RTSCTS 请求发送值号RTS是发送器输出的准备好信号。接收方准备好后送回清除发送信号CTS后,发送数据开始进行,在同一端将这两个信号短接就意味着只要发送器准备好即可发送。DCD 载波检测(又称接收线路信号检测)。本意是MODEM检测到线路中的载波信号后,通知终端准备接收数据的信号,在没有接MODEM的情况下,也可以和RTS、CTS短接。相对于MODEM而言,微型机和终端机一样被称为数据终端DTE(Data Terminal Equipment)而MODEM被称为数据通信装置DCE(Data Communications Equipment),DTE和DCE之间的连接不能像图3-2中有“扭接”现象,而应该是按接插件芯号,同名端对应相接。此处介绍的RS232C的信号名称及信号流向都是对DTE而言的。DTRDSR 数据终端准备好时发DTR信号,在收到数据通信装置装备好DSR信号后,方可通信。图3-2(a)中将这一对信号以“自握手”方式短接。R1 原意是在MODEM接收到电话交换机有效的拨号时,使RI有效,通知数据终端准备传送。在无MODEM时也可和DTR相接。图3-2(b)给出了无MODEM情况下,DTE对DTE异步串行通信线路的完整连接,它不仅适用于微型机和微型机之间的通信,还适用于微型机和异步串行外部设备(如终端机、绘图仪、数字化仪等)的连接。 (2) 信号电平规定RS232C规定了双极性的信号逻辑电平:-3V到-25V之间的电平表示逻辑“1”。+3V到+25V之间的电平表示逻辑“0”。因此这是一套负逻辑定义。以上标准称为EIA电平。PCXT系列使用的信号电平是-12V和+12V,符合EIA标准,但在计算机内部流动的信号都是TTL电平,因此这中间需要用电平转换电路。常用芯片MCl488或SN75150将TTL电平转换为EIA电平,MCl489或SN75154将EIA电平转换为TTL电平。PCXT系列以这种方式进行串行通信时,在波特率不高于9600的情况下,理论上通信线的长度限制纽为15米。2)20mA电流环20mA电流环并没有形成一套完整的标准,主要是将数字信号的表示方法不使用电子的高低,而改用20mA电流的有无:“1”信号在环路中产生20mA电流;“0”信号无电流产生。当然也需要有电路来实现TTL电平和20mA电流之间的转换。图3-3是PCXT微机中使用的一种20mA电流环接口。当发送方SOUT1时,便有20mA电流灌入接收方的光耦合器,于是光耦合器导通,使SIN1。反之当发送方SOUT0时环路电流为零,接收方光耦合器截止,SIN0。显然,当要求双工方式通信时,双方都应各有收发电路,通信联线至少要4根。由于通信双方利用光耦合器实现电气上隔离,而且信号又是双端回路方式,故有很强的抗干扰性,可以传送远至1千米的距离。图2-3 20mA电流环接口“0”、“1”信号的表示方法不同外,其他方面(如字符的传输格式)常借用RS232C标准。因此PCXT微机中的异步串行信道接口往往将这两种标准做在一起,实际通过跨接线从二者中择一使用。 (3) ARM自带的串行口寄存器ARM自带三个UART端口,每个UART通道都有16字节的FIFO(先入先出寄存器)用于接受和发送。用系统时钟最大波特率可达230.4K,如果用外部时钟(UCLK)UART可以以更高的波特率运行。S3C2410X UART包括可编程波特率,红外发送/接收,插入一个或两个停止位,5字节,6字节,7字节,或8字节数据宽度和奇偶校验。其特点是:-基于DMA或者中断操作的RxD0,TxD0,RxD1,TxD1,RxD2,TxD2。-包括IrDA 1.0和16字节FIFO的UART通道0,1,2。-包括nRTS0,nCTS0,nRTS1和nCTS1的UART通道。-支持握手方式的接收/发送UART包括三个波特率因子寄存器UBRDIV0, UBRDIV1 and UBRDIV2,存储在波特率因子寄存器(UBRDIVn)中的值决定串口发送和接收的时钟数率(波特率),计算公式如下:UBRDIVn = (round_off)(MCLK / (bps x 16)+0.5) 1其中MCLK是系统频率,例如在40MHz的情况下,当波特率取时,UBRDIVn = (int)( / ( x 16)+0.5) -1= (int)(21.7+0.5) -1= 22 -1 = 21六、实验步骤1新建工程,将“Exp2 ARM 串口实验”中的文件添加到工程中,这些是启动时所需要 的文件。 2定义与UART 有关的各个寄存器地址和一些特殊的位命令。主要有以下各寄存器(44b.h): /* UART 的全部功能寄存器 */ #define rULCON0 (*(volatile unsigned *)0x1d00000) #define rULCON1 (*(volatile unsigned *)0x1d04000) #define rUCON0 (*(volatile unsigned *)0x1d00004) #define rUCON1 (*(volatile unsigned *)0x1d04004) #define rUFCON0 (*(volatile unsigned *)0x1d00008) #define rUFCON1 (*(volatile unsigned *)0x1d04008) #define rUMCON0 (*(volatile unsigned *)0x1d0000c) #define rUMCON1 (*(volatile unsigned *)0x1d0400c) #define rUTRSTAT0 (*(volatile unsigned *)0x1d00010) #define rUTRSTAT1 (*(volatile unsigned *)0x1d04010) #define rUERSTAT0 (*(volatile unsigned *)0x1d00014) #define rUERSTAT1 (*(volatile unsigned *)0x1d04014) #define rUFSTAT0 (*(volatile unsigned *)0x1d00018) #define rUFSTAT1 (*(volatile unsigned *)0x1d04018) #define rUMSTAT0 (*(volatile unsigned *)0x1d0001c) #define rUMSTAT1 (*(volatile unsigned *)0x1d0401c) #define rUBRDIV0 (*(volatile unsigned *)0x1d00028) #define rUBRDIV1 (*(volatile unsigned *)0x1d04028)#ifdef _BIG_ENDIAN /大端摸式 #define rUTXH0 (*(volatile unsigned char *)0x1d00023) #define rUTXH1 (*(volatile unsigned char *)0x1d04023) #define rURXH0 (*(volatile unsigned char *)0x1d00027) #define rURXH1 (*(volatile unsigned char *)0x1d04027) #define WrUTXH0(ch) (*(volatile unsigned char *)(0x1d00023)=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char *)(0x1d04023)=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)(0x1d00027)  #define RdURXH1() (*(volatile unsigned char *)(0x1d04027) #define UTXH0 (0x1d00020+3) /byte_access address by BDMA  #define UTXH1 (0x1d04020+3) #define URXH0 (0x1d00024+3) #define URXH1 (0x1d04024+3)  #else /小端摸式 #define rUTXH0 (*(volatile unsigned char *)0x1d00020) #define rUTXH1 (*(volatile unsigned char *)0x1d04020) #define rURXH0 (*(volatile unsigned char *)0x1d00024) #define rURXH1 (*(volatile unsigned char *)0x1d04024) #define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch) #define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch) #define RdURXH0() (*(volatile unsigned char *)0x1d00024) #define RdURXH1() (*(volatile unsigned char *)0x1d04024) #define UTXH0 (0x1d00020) /byte_access address by BDMA #define UTXH1 (0x1d04020) #define URXH0 (0x1d00024) #define URXH1 (0x1d04024) #endif3 编写串口驱动函数(MyUart.c):图2-4 为串口初始化的实现流程。 图3-4 发送数据 图3-5 接收数据4在主函数中实现将从串口0 接收到的数据发送到串口0(Main.c):图2-7 为主函数流程图。 图3-6 主函数流程图七、 实验结果 实验程序:main.c#include"uhal.h"#include"myuart.h"#pragma import(_use_no_semihosting_swi) / ensure no functions that use semihosting int main(void)char c11;char err;ARMTargetInit();/开发版初始化while(1) Uart_SendByte(0,0xa);/换行 Uart_SendByte(0,0xd);/回车 err=Uart_Getch(c1,0,0);/从串口采集数据 Uart_SendByte(0,c10);/显示采集的数据return 0;MyUart.c#include <stdarg.h>#include "def.h"/#include "isr.h"#include "44b.h"void Uart_SendByte(int Uartnum, U8 data)/ok eric rongif(Uartnum=0) while(!(rUTRSTAT0 & 0x2); /Wait until THR is empty.Delay(1);WrUTXH0(data); else while(!(rUTRSTAT1 & 0x2); /Wait until THR is empty.Delay(1);WrUTXH1(data); void Uart_Init(int Uartnum, int mclk,int baud)int i;if(mclk=0)mclk=MCLK;if(Uartnum=0)/UART0rUFCON0=0x0; /FIFO disablerUMCON0=0x0;/UART0rULCON0=0x3; /Normal,No parity,1 stop,8 bitrUCON0=0x245; /rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or pollingrUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );elserUFCON1=0x0;rUMCON1=0x0;/UART1rULCON1=0x3;rUCON1=0x245;rUBRDIV1=( (int)(mclk/16./baud + 0.5) -1 ); for(i=0;i<100;i+);void Uart_SendString(int Uartnum, char *pt)while(*pt)if(*pt='n')Uart_SendByte(Uartnum, 'r');Uart_SendByte(Uartnum, *pt+);elseUart_SendByte(Uartnum, *pt+);/if you don't use vsprintf(), the code size is reduced very much.void Uart_Printf(char *fmt,.) va_list ap; char string256; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(0, string); va_end(ap);void Uart_TxEmpty(int Uartnum)if(Uartnum=0)while(!(rUTRSTAT0 & 0x4); /wait until tx shifter is empty.elsewhile(!(rUTRSTAT1 & 0x4); /wait until tx shifter is empty.char Uart_Getch(char* Revdata, int Uartnum, int timeout)int i=0;if(Uartnum=0)while(!(rUTRSTAT0 & 0x1); /Receive data read*Revdata=RdURXH0();return TRUE;elsewhile(!(rUTRSTAT1 & 0x1);/Receive data read*Revdata=RdURXH1();return TRUE;实验心得:这次的实验,通过运行示例程序对串口的输入有了一定的概念,在修改程序实现加法输出结果的过程中,遇到了一些问题。不过后来在同学的帮助下解决了这些问题,得到了正确的程序。专心-专注-专业

    注意事项

    本文(ARM实验三-ARM的串行口实验(共10页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开