041633第四次ARM实验报告.docx
- 文档编号:27768093
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:19
- 大小:122.02KB
041633第四次ARM实验报告.docx
《041633第四次ARM实验报告.docx》由会员分享,可在线阅读,更多相关《041633第四次ARM实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
041633第四次ARM实验报告
微机原理实验报告
实验名称:
ARM的串行口实验
院系:
物理与机电工程学院
专业班级:
09电子信息工程2班
学号:
20090416
学生姓名:
指导教师:
涂二生李建华
完成时间:
2012年5月26日
报告成绩:
评阅意见:
评阅教师日期
实验四ARM的串行口实验
一、实验目的
1、掌握ARM的串行口工作原理。
2、学习编程实现ARM的UART通讯。
3、掌握CPU利用串口通讯的方法。
二、实验仪器
微型电子计算机(含软件H-JIAOV0.3.1和ADSv1_2)、EasyARM2131开发板、USB接口电源线和JTAG接口线以及部分跳线。
三、实验原理
1.异步串行I/O
异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图2-1串行通信字符格式
图2-1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
每一个数据位的宽度等于传送波特率的倒数。
微机异步串行通信中,常用的波特率为50,
95,110,150,300,600,1200,2400,4800,9600,119200等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
1)奇偶错:
在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
2)帧格式错:
一个字符从起始位到停止位的总位数不对。
3)溢出错:
若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
2.串行接口的物理层标准
通用的串行I/O接口有许多种,现仅就最常见的两种标准作简单介绍。
1)EIARS—232C这是美国电子工业协会推荐的一种标准(ElectronicindustriesAssociation
Recoil-mendedStandard)。
它在一种25针接插件(DB—25)上定义了串行通信的有关信号。
这个标准后来被世界各国所接受并使用到计算机的I/O接口中。
⑴信号连线
在实际异步串行通信中,并不要求用全部的RS—232C信号,许多PC/XT兼容机仅用15针接插件(DB—15)来引出其异步串行I/O信号,而PC中更是大量采用9针接插件(DB—9)来担当此任,因此这里也不打算就RS—232C的全部信号作详细解释。
图2-2给出两台微机利用RS—232C接口通信的联线(无MODEM),我们按DB—25的引脚号标注各个信号。
下面对图2-2中几个主要信号作简要说明。
保护地:
通信线两端所接设备的金属外壳通过此线相联。
当通信电缆使用屏蔽线时,常利用其外皮金属屏蔽网来实现。
由于各设备往往已通过电源线接通保护地,因此,通信线中不必重复接此地线(图中用虚线表示)。
例如使用9针插头(DB—9)的异步串行I/O接口就没有引出保护地信号。
TXD/RXD:
是一对数据线,TXD称发送数据输出,RXD称接收数据输入。
当两台微机以全双工方式直接通信(无MODEM方式)时,双方的这两根线应交叉联接(扭接)。
信号地:
所有的信号都要通过信号地线构成耦合回路。
通信线有以上三条(TXD、RXD和信号地)就能工作了。
其余信号主要用于双方设备通信过程中的联络(握手信号),而且有些信号仅用于和MODEM的联络。
若采取微型机对微型机直接通信,且双方可直接对异步串行通信电路芯片编程,若设置成不要任何联络信号,则其它线都可不接。
有时在通信线的同一端将相关信号短接以“自握手”方式满足联络要求。
这就是如图2-2(a)所示的情况。
图2-2实用RS-232C连线
RTS/CTS:
请求发送值号RTS是发送器输出的准备好信号。
接收方准备好后送回清除发送信号CTS后,发送数据开始进行,在同一端将这两个信号短接就意味着只要发送器准备好即可发送。
DCD:
载波检测(又称接收线路信号检测)。
本意是MODEM检测到线路中的载波信号后,通知终端准备接收数据的信号,在没有接MODEM的情况下,也可以和RTS、CTS短接。
相对于MODEM而言,微型机和终端机一样被称为数据终端DTE(DataTerminalEquipment)而MODEM被称为数据通信装置DCE(DataCommunicationsEquipment),DTE和DCE之间的连接不能像图2-2中有“扭接”现象,而应该是按接插件芯号,同名端对应相接。
此处介绍的RS—232C的信号名称及信号流向都是对DTE而言的。
DTR/DSR:
数据终端准备好时发DTR信号,在收到数据通信装置装备好DSR信号后,方可通信。
图2-2(a)中将这一对信号以“自握手”方式短接。
R1:
原意是在MODEM接收到电话交换机有效的拨号时,使RI有效,通知数据终端准备传送。
在无MODEM时也可和DTR相接。
图2-2(b)给出了无MODEM情况下,DTE对DTE异步串行通信线路的完整连接,它不仅适用于微型机和微型机之间的通信,还适用于微型机和异步串行外部设备(如终端机、绘图仪、数字化仪等)的连接。
⑵信号电平规定RS—232C规定了双极性的信号逻辑电平:
-3V到-25V之间的电平表示逻辑“1”。
+3V到+25V之间的电平表示逻辑“0”。
因此这是一套负逻辑定义。
以上标准称为EIA电平。
PC/XT系列使用的信号电平是-12V和+12V,符合EIA标准,
但在计算机内部流动的信号都是TTL电平,因此这中间需要用电平转换电路。
常用芯片MCl488或SN75150将TTL电平转换为EIA电平,MCl489或SN75154将EIA电平转换为TTL电平。
PC/XT系列以这种方式进行串行通信时,在波特率不高于9600的情况下,理论上通信线的长度限制纽为15米。
2)20mA电流环20mA电流环并没有形成一套完整的标准,主要是将数字信号的表示方法不使用电子的高低,而改用20mA电流的有无:
“1”信号在环路中产生20mA电流;“0”信号无电流产生。
当然也需要有电路来实现TTL电平和20mA电流之间的转换。
图2-3是PC/XT微机中使用的一种20mA电流环接口。
当发送方SOUT=1时,便有20mA电流灌入接收方的光耦合器,于是光耦合器导通,使SIN=1。
反之当发送方SOUT=0时环路电流为零,接收方光耦合器截止,SIN=0。
显然,当要求双工方式通信时,双方都应各有收发电路,通信联线至少要4根。
由于通信双方利用光耦合器实现电气上隔离,而且信号又是双端回路方式,故有很强的抗干扰性,可以传送远至1千米的距离。
图2-320mA电流环接口
“0”、“1”信号的表示方法不同外,其他方面(如字符的传输格式)常借用RS—232C标准。
因此PC/XT微机中的异步串行信道接口往往将这两种标准做在一起,实际通过跨接线从二者中择一使用。
四、实验内容
用ARM开发板做一个简易抢答器。
五、程序框图:
1、编写串口驱动函数(MyUart.c):
图2-4为串口初始化的实现流程。
图2-4串口初始化
2、在主函数中实现将从串口0接收到的数据发送到串口0(Main.c):
图2-7为主函数流程图。
图2-7主函数流程图
六、程序:
//**---------------------------------------------------------------------------
//**Createdby:
Shenfaming
//**Createddate:
2009-05-8
//**Version:
//**Descriptions:
抢答器(GPIO按键输入/LED/数码管/定时器及UART0通信实验。
)
//**---------------------------------------------------------------------------
#include"config.h"
#defineHC595_CS(1<<29)//P0.29口为74HC595的片选
constuint32LEDS8=(0xFF<<18);//P1[25:
18]控制LED8~LED1,低电平点亮
constuint32BEEP=1<<3;//P0.7控制蜂鸣器,低电平蜂鸣
constuint32KEY1=1<<16;//P0.16连接KEY1
constuint32KEY2=1<<17;//P0.16连接KEY2
constuint32KEY3=1<<18;//P0.16连接KEY3
constuint32KEY4=1<<19;//P0.16连接KEY4
constuint32KEY5=1<<20;//P0.16连接KEY5
constuint32KEY6=1<<21;//P0.16连接KEY6
constuint32LED_TBL_1[1]={0x00};//点亮LED1
constuint32LED_TBL_2[1]={0x01};//点亮LED2
constuint32LED_TBL_3[1]={0x02};//点亮LED3
constuint32LED_TBL_4[1]={0x04};//点亮LED4
constuint32LED_TBL_5[1]={0x08};//点亮LED5
constuint32LED_TBL_6[1]={0x10};//点亮LED6
uint8constDISP_TAB1[10]={0x90,0x80,0xF8,0x82,0x92,0x99,0xB0,0xA4,0xF9,0xC0};
//倒计时显示9到0
uint8constDISP_TAB2[1]={0xC0};//显示1
uint8constDISP_TAB3[1]={0xF9};//显示2
uint8constDISP_TAB4[1]={0xA4};//显示3
uint8constDISP_TAB5[1]={0xB0};//显示4
uint8constDISP_TAB6[1]={0x99};//显示5
uint8constDISP_TAB7[1]={0x92};//显示6
#defineUART_BPS115200//串口通讯波特率
/******************************************************************************
**函数名称:
DelayNS()
**函数功能:
长软件延时
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
******************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/******************************************************************************
**函数名称:
MSPI_Init()
**函数功能:
初始化SPI接口,设置为主机。
**入口参数:
无
**出口参数:
无
******************************************************************************/
voidMSPI_Init(void)
{
//PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;//设置管脚连接SPI
PINSEL0=(PINSEL0&(~(0xFF<<8)))|(0x55<<8);
SPCCR=0x52;//设置SPI时钟分频
SPCR=(0<<3)|//CPHA=0,数据在SCK的第一个时钟沿采样
(1<<4)|//CPOL=1,SCK为低有效
(1<<5)|//MSTR=1,SPI处于主模式
(0<<6)|//LSBF=0,SPI数据传输MSB(位7)在先
(0<<7);//SPIE=0,SPI中断被禁止
}
/******************************************************************************
函数名称:
MSPI_SendData()
**函数功能:
向SPI总线发送数据。
**入口参数:
data待发送的数据
**出口参数:
返回值为读取的数据
******************************************************************************/
uint8MSPI_SendData(uint8data)
{
IOCLR=HC595_CS;//片选74HC595
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80));//等待SPIF置位,即等待数据发送完毕
IOSET=HC595_CS;
return(SPI_SPDR);
}
/******************************************************************************
**函数名称:
UART0_Init()
**函数功能:
串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率115200。
**入口参数:
无
**出口参数:
无
******************************************************************************/
voidUART0_Init(void)
{
uint16Fdiv;
U0LCR=0x83;//DLAB=1,允许设置波特率
Fdiv=(Fpclk/16)/UART_BPS;//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/******************************************************************************
**函数名称:
UART0_GetByte()
**函数功能:
从串口接收1字节数据,使用查询方式接收。
**入口参数:
无
**出口参数:
接收到的数据
******************************************************************************/
uint8UART0_GetByte(void)
{
uint8rcv_dat;
while((U0LSR&0x01)==0);
rcv_dat=U0RBR;
return(rcv_dat);
}
/*
*******************************************************************************
**函数名称:
UART0_GetStr()
**函数功能:
从串口接收
**入口参数:
s指向接收数据数组的指针
**n接收的个数
**出口参数:
无
******************************************************************************/
voidUART0_GetStr(uint8*s,uint32n)
{
for(;n>0;n--)
{
*s++=UART0_GetByte();
}
}
/*
*******************************************************************************
**函数名称:
UART0_SendByte()
**函数功能:
向串口发送字节数据,并等待发送完毕,查询方式。
**入口参数:
dat要发送的数据
**出口参数:
无
******************************************************************************/
voidUART0_SendByte(uint8dat)
{
U0THR=dat;
while((U0LSR&0x40)==0);//等待数据发送完毕
}
/*
*******************************************************************************
**函数名称:
UART0_SendStr()
**函数功能:
向串口发送一字符串
**入口参数:
str要发送的字符串的指针
**出口参数:
无
******************************************************************************/
voidUART0_SendStr(uint8const*str)
{
while
(1)
{
if(*str=='\0')break;//遇到结束符,退出
UART0_SendByte(*str++);//发送数据
}
}
/*
*****************************************************************
**函数名称:
main()
**函数功能:
从串口UART0接收字符串"HelloEasyARM2131!
",并发送回上位机显示;使用硬件SPI,74HC595驱动控制7段数码管显示;用P1.18~P1.25控制LEDS8,让LEDS8闪烁。
**调试说明:
需要PC串口显示终端软件如EasyARM.exe;先显示A到0的字模,然后显示抢答选手的座号;需将跳线JP12全部选择LED8~LED1。
******************************************************************************/
uint8rcv_data;
intmain(void)
{uint8snd[32];
uint32i;
PINSEL0=(PINSEL0&(~0x0F))|0x05;//设置I/O连接到UART0
UART0_Init();//串口初始化
PINSEL2=0x00005500;//设置SPI管脚连接
PINSEL1=0x00000000;//设置连接GPIO
//PINSEL2=0x00000005;//设置I/O连接到UART0
IO1DIR=LEDS8;
IO1SET=LEDS8;
IO0DIR=BEEP;
IODIR=HC595_CS;
UART0_GetStr(snd,18);//从串口接收字符串
DelayNS(30);
UART0_SendStr(snd);//向串口发送字符串
DelayNS(50);
MSPI_Init();//初始化SPI接口
/*PWM作为定时器时的初始化*/
PWMTC=0;//定时器设置为0
PWMPR=0;//时钟不分频
PWMMCR=0x03;//设置T0MR0匹配后复位T0TC,并产生中断标志
PWMMR0=Fpclk/0.1;//10秒钟定时
PWMTCR=0x01;//启动定时器
for(i=0;i<10;i++)
{
rcv_data=MSPI_SendData(DISP_TAB1[i]);
DelayNS(200);
};
while
(1)
{
if((IO0PIN&KEY1)==0)//如果KEY1按下
{
IO1CLR=((LED_TBL_1[i=1])<<18);//点亮LED1
IO1SET=~((LED_TBL_1[i=1])<<18);
rcv_data=MSPI_SendData(DISP_TAB2[i=1]);//发送显示数据1
DelayNS(200);
for(i=0;i<10;i++)
{
rcv_data=MSPI_SendData(DISP_TAB1[i]);
DelayNS(200);
};
}
if((IO0PIN&KEY2)==0)//如果KEY2按下
{
IO1CLR=((LED_TBL_2[i=1])<<18);//点亮LED2
IO1SET=~((LED_TBL_2[i=1])<<18);
rcv_data=MSPI_SendData(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 041633 第四 ARM 实验 报告