ARM实验报告.docx
《ARM实验报告.docx》由会员分享,可在线阅读,更多相关《ARM实验报告.docx(16页珍藏版)》请在冰点文库上搜索。
ARM实验报告
ARM实验报告
题目一:
UART通信实验
题目二:
中断实验
学院:
XXXXXXX
专业:
XXXXXXX
班级:
XXXXXXX
学号:
XXXXXXX
姓名:
稻草人
实验题目UART通信实验
一实验目的
l熟悉串行通信控制器UART0工作原理及各个控制寄存器的配置
l熟悉具体的电路板(开发板)UART0电平转换电路
l熟悉ARM芯片中串行通信部件UART和ARMCPU的数据交换方式。
二实验设备
l硬件:
PC机一台EasyARM2131开发板一套串口延长线
l软件:
Windows98/XP/2000系统,ADS1.2集成开发环境EasyARM(PC机串口通信)软件
三实验内容
将PC串口(COM0)的发送信号(TxD)线连接到开发板UART0口中的RxD信号
线,接收信号线RxD连接到开发板UART0口中的TxD信号线,通过PC机串口简单通信软件(EasyARM)向开发板发送字符串,由于交叉连接,开发板将接收到的字符串发送回来,如果EasyARM软件上能够正确的显示到接收到的字符串,表示ARM中的
UART0工作正确,即UART0驱动程序功能正确。
理解芯片中UART0部件与ARMCPU核通过VPB接口连接后,数据交换方式,常用查询方式和中断方式,进一步理解外设和CPU交互数据的方式。
四实验原理
串行通信是一种常用的通信方式,在短距离双机(设备)通信中应用广泛。
LPC2131芯片内部设计含有两个串行通信控制器模块部件UART,一个为UART0、另一个为UART1。
五实验硬件原理图
主要信号TxD0(发送数据信号)、RxD0(接收数据信号),在UART控制器控制下数据
从TxD0串行出去,RxD0是接收。
六实验过程
查询方式PC机串口通信软件发送和接收数据界面如图5.4所示。
对于PC端,感知不到ARMCPU是查询方式与UART0通信,还是UART0连接VIC,VIC连接ARMCPU通过中断方式通信。
对于ARMCPU,显然是中断方式较好,CPU效率较高。
图5.4PC端串口通信程序界面
图5.5PC端串口通信程序界面
七实验参考程序:
/*UniversalAsynchronousReceiverTransmitter0(UART0)*/
/*通用异步串行口0(UART0)的特殊寄存器*/
#defineU0RBR(*((volatileunsignedchar*)0xE000C000))
#defineU0THR(*((volatileunsignedchar*)0xE000C000))
#defineU0IER(*((volatileunsignedchar*)0xE000C004))
#defineU0IIR(*((volatileunsignedchar*)0xE000C008))
#defineU0FCR(*((volatileunsignedchar*)0xE000C008))
#defineU0LCR(*((volatileunsignedchar*)0xE000C00C))
#defineU0LSR(*((volatileunsignedchar*)0xE000C014))
#defineU0SCR(*((volatileunsignedchar*)0xE000C01C))
#defineU0DLL(*((volatileunsignedchar*)0xE000C000))
#defineU0DLM(*((volatileunsignedchar*)0xE000C004))
CPU查询方式
#include"config.h"
/****************************************************************************
**函数名称:
DelayNS()
**函数功能:
长软件延时。
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
#defineUART_BPS115200//串口通讯波特率
/****************************************************************************
**函数名称:
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!
",并发送回上位机显
示。
**调试说明:
需要PC串口显示终端软件如EasyARM.exe。
***************************************************************************
*/
intmain(void)
{
uint8snd[32];
PINSEL0=0x00000005;//设置I/O连接到UART0
UART0_Init();//串口初始化
UART0_GetStr(snd,18);//从串口接收字符串
DelayNS(10);
UART0_SendStr(snd);//向串口发送字符串
DelayNS(10);
while
(1);
return0;
}
中断方式程序:
功能:
UART0通讯实验,中断方式,使用FIFO。
#include"config.h"
/*定义串口模式设置数据结构*/
typedefstructUartMode
{
uint8datab;//字长度,5/6/7/8可选
uint8stopb;//停止位,1/2可选
uint8parity;//奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;
uint8rcv_buf[8];//UART0数据接收缓冲区
volatileuint8rcv_new;//接收新数据标志
/****************************************************************************
**函数名称:
IRQ_UART0()
**函数功能:
串口0接收中断服务程序
**入口参数:
无
**出口参数:
无
******************************************************************************/
void__irqIRQ_UART0(void)
{
uint8i;
if((U0IIR&0x0F)==0x04)
rcv_new=1;//设置接收到新的数据标志
for(i=0;i<8;i++)
{
rcv_buf[i]=U0RBR;//读取FIFO的数据,并清除中断
}
VICVectAddr=0x00;//中断处理结束
}
/****************************************************************************
**函数名称:
UART0_SendByte()
**函数功能:
向串口0发送1字节数据
**入口参数:
dat要发送的数据
**出口参数:
无
****************************************************************************/
voidUART0_SendByte(uint8dat)
{
U0THR=dat;//要发送的数据
}
/****************************************************************************
**函数名称:
UART0_SendBuf()
**函数功能:
向串口发送8字节数据
**入口参数:
无
**出口参数:
无
****************************************************************************/
voidUART0_SendBuf(void)
{
uint8i;
for(i=0;i<8;i++)
UART0_SendByte(rcv_buf[i]);
while((U0LSR&0x20)==0);//等待数据发送完毕
}
/****************************************************************************
**函数名称:
UART0_Init()
**函数功能:
串口初始化,设置工作模式和波特率。
**入口参数:
baud波特率
**set模式设置(UARTMODE数据结构)
**出口参数:
1-初始化成功,0-初始化失败
****************************************************************************/
int8UART0_Init(uint32baud,UARTMODEset)
{
uint32bak;
/*参数过滤*/
if((baud==0)||(baud>115200))return(0);
if((set.datab<5)||(set.datab>8))return(0);
if((set.stopb==0)||(set.stopb>2))return(0);
if(set.parity>4)return(0);
/*设置串口波特率*/
U0LCR=0x80;//DLAB=1
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xFF;
/*设置串口模式*/
bak=set.datab-5;//设置字长
if(set.stopb==2)bak|=0x04;//判断是否为2位停止位
if(set.parity!
=0)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;//设置奇偶校验
U0LCR=bak;
return
(1);
}
/****************************************************************************
**函数名称:
main()
**函数功能:
从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
**调试说明:
需要PC串口显示终端软件如EasyARM.exe。
****************************************************************************/
intmain(void)
{
UARTMODEset;
set.datab=8;
set.stopb=1;
set.parity=0;
rcv_new=0;
PINSEL0=0x00000005;//设置I/O连接到UART0
UART0_Init(115200,set);//串口初始化
U0FCR=0x81;//使能FIFO,并设置触发点为8字节
U0IER=0x01;//允许RBR中断,即接收中断
IRQEnable();//使能IRQ中断
/*使能UART0中断*/
VICIntSelect=0x00000000;//设置所有的通道为IRQ中断
VICVectCntl0=0x20|0x06;//UART0分配到IRQslot0,即最高优先级
VICVectAddr0=(uint32)IRQ_UART0;//设置UART0向量地址
VICIntEnable=1<<0x06;//使能UART0中断
while
(1)
{
if(rcv_new==1)
{
rcv_new=0;
UART0_SendBuf();
}
}
return0;
}
实验题目中断实验
一实验目的
l1理解ARM芯片中断实现方式
l2学会配置VIC部件,连接中断源、配置中断类型、中断优先级
l3学会编写中断服务程序
l4学会调试中断服务程序
l5理解中断工作过程
l6本次实验选用中断源Timer0的工作原理、应用配置方法
l7结合定时器和中断的方式实现精确控制
l8比较CPU对外设数据端口的查询方式和中断方式的异同
二实验设备
硬件:
PC机一台EasyARM2131开发板一套
软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
三实验内容
用LPC2131芯片内部定时器(Timer0)实现1s定时,每当1s,定时器产生一
个中断,控制蜂鸣器蜂鸣一次。
Timer0为芯片内部中断,VIC通道号为4。
四实验参考程序
#include"config.h"
#defineBEEP1<<7/*P0.7控制BEEP,低电平蜂鸣*/
/****************************************************************************
**函数名称:
IRQ_Timer0()
**函数功能:
定时器0中断服务程序,取反LED9控制口。
**入口参数:
无
**出口参数:
无
****************************************************************************/
void__irqIRQ_Timer0(void)
{
if((IO0SET&BEEP)==0)
IO0SET=BEEP;/*关闭BEEP
*/
else
IO0CLR=BEEP;
T0IR=0x01;/*清除中断标志
*/
VICVectAddr=0x00;/*通知VIC中断处理结束
*/
}
/****************************************************************************
**函数名称:
main()
**函数功能:
使用定时器实现1秒钟定时,控制LED9闪烁。
中断方式。
**调试说明:
需要将跳线JP11连接BEEP。
****************************************************************************/
intmain(void)
{
PINSEL1=0x00000000;/*设置管脚连接GPIO
*/
IO0DIR=BEEP;/*设置BEEP控制口输出
*/
IRQEnable();/*IRQ中断使能
*/
/*定时器0初始化*/
T0TC=0;/*定时器设置为0
*/
T0PR=0;/*时钟不分频
*/
T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志
*/
T0MR0=Fpclk/2;/*0.5秒钟定时
*/
T0TCR=0x01;/*启动定时器
*/
/*设置定时器0中断IRQ*/
VICIntSelect=0x00;/*所有中断通道设置为IRQ中断
*/
VICVectCntl0=0x20|0x04;/*设置定时器0中断通道分配最高优先级
*/
VICVectAddr0=(uint32)IRQ_Timer0;/*设置中断服务程序地址
*/
VICIntEnable=1<<0x04;/*使能定时器0中断
*/
while
(1);
return0;
}