ARM实验报告.docx

上传人:b****2 文档编号:2015234 上传时间:2023-05-02 格式:DOCX 页数:16 大小:297.05KB
下载 相关 举报
ARM实验报告.docx_第1页
第1页 / 共16页
ARM实验报告.docx_第2页
第2页 / 共16页
ARM实验报告.docx_第3页
第3页 / 共16页
ARM实验报告.docx_第4页
第4页 / 共16页
ARM实验报告.docx_第5页
第5页 / 共16页
ARM实验报告.docx_第6页
第6页 / 共16页
ARM实验报告.docx_第7页
第7页 / 共16页
ARM实验报告.docx_第8页
第8页 / 共16页
ARM实验报告.docx_第9页
第9页 / 共16页
ARM实验报告.docx_第10页
第10页 / 共16页
ARM实验报告.docx_第11页
第11页 / 共16页
ARM实验报告.docx_第12页
第12页 / 共16页
ARM实验报告.docx_第13页
第13页 / 共16页
ARM实验报告.docx_第14页
第14页 / 共16页
ARM实验报告.docx_第15页
第15页 / 共16页
ARM实验报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARM实验报告.docx

《ARM实验报告.docx》由会员分享,可在线阅读,更多相关《ARM实验报告.docx(16页珍藏版)》请在冰点文库上搜索。

ARM实验报告.docx

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2