文档介绍:该【ARM——秒表设计 】是由【秋江孤影】上传分享,文档一共【12】页,该文档可以免费在线阅读,需要了解更多关于【ARM——秒表设计 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:.
EasyARM2131开发板实验报告
实验名称:秒表
系部:物理与机电工程学院
专业班级:07电子信息工程(2)班
学生姓名:阙开灿
学号:2006050427
指导教师:涂二生老师
完成时间:2010年5月6日
报告成绩:
1:.
秒表
(结合UART0、定时器0设计的实验)
一、实验目的:
1)结合UART0和定时器0,设计一个秒表
2)复****UART0和定时器0的工作原理和应用
3)熟悉掌握ARM中的程序应用,将理论结合实际
4)通过本次实验,将以前学的进行结合使用,以检验自己的学****质量
5)更加熟练了ARM的实验环境
二、实验仪器:
硬件:Easy-ARM实验开发板一套
计算机一台()
软件:Windowsxp系统,
三、实验原理:
:
LPC2131通过向量中断控制器(VIC)管理中断。外设中断信号需要经过
2个开关才能到达ARM内核,真正产生异常,。如
果在VIC中使能了相应外设的中断,外设中断才能到达VIC并向内核发送中断
请求;只有使能了内核中断IRQ或者FIQ,内核才能真正产生异常。
:
用户程序首先要初始化VIC使能相关中断,然后正常运行用户程序(如
①);
当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为
相应中断服务程序的地址(②),
切换处理器工作模式为IRQ模式,并跳转到异常向量表的IRQ中断入
口0x00000018处(③);
读取VICVectAddr寄存器的值然后放入PC程序指针,跳转到相应中断
2:.
服务程序(④);
中断服务中执行相应的中断处理,清除中断标志,(⑤);
中断服务完成后,切换回原来的模式,并返回原中断点(
中的⑥)。
:
(1)特性:
16字节收发FIFO;
寄存器位置符合16C550工业标准;
接收器FIFO触发点可为1,4,8和14字节;
内置波特率发生器;
LPC2131包含使能实现软件流控制的机制。
(2)结构:
UART接收器模块UxRx监视串行输入线RxD的有效输入。UARTRx移位寄
存器(UxRSR)通过RxD接收有效的字符。当UxRSR接收到一个有效字符时,
它将该字符传送到UARTRx缓冲寄存器FIFO中,等待CPU或主机通过主机接口
进行访问。
UART发送器模块UxTx接收CPU或主机写入的数据并将数据缓存到UART
Tx保持寄存器FIF(UxTHR)中。UARTTx移位寄存器(UxTSR)读取UxTHR
中的数据并将数据通过串行输出管脚TxD发送。
UART波特率发生器模块UxBRG产生UARTTx模块所使用的定时。UxBRG
模块时钟源为VPB时钟(pclk)。主时钟与UxDLL和UxDLM寄存器所定义的除
数相除得到UARTTx模块使用的时钟。该时钟为16倍过采样时钟NBAUDOUT。
中断接口包含寄存器UxIER和UxIIR。中断接口接收几个由UxTx和UxRx发出
的单时钟宽度的使能信号。
UxTx和UxRx的状态信息保存在UxLSR中。
UxTx和UxRx的控制信息保存在UxLCR中。
3:.
:
VPB接口提供CPU或主机与UART之间的通信连接。
:
(1)概述:
LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、4比较路匹配
并输出电路。定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据
4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、
翻转或者无动作)。它还包括4个捕获输入,用于在输入信号发生跳变时捕获定
时器值,并可选择产生中断。可用于对内部事件进行计数的间隔定时器,或者通
过捕获输入实现脉宽调制,亦可作为自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
(2)定时器特性:
带可编程32位预分频器的32位定时器/计数器;
4:.
具有多达4路32位的捕获通道-当输入信号跳变时可取得定时器的瞬时
值,也可选择使捕获事件产生中断;
4个32位匹配寄存器:
匹配时定时器继续工作,可选择产生中断;
匹配时停止定时器,可选择产生中断;
匹配时复位定时器,可选择产生中断。
多达4个对应于匹配寄存器的外部输出,具有下列特性:
匹配时设置为低电平;
匹配时设置为高电平;
匹配时翻转;
匹配时无动作。
(3)结构:
定时器0和定时器1的方框图,如下图所示:(注:捕获寄存器3不能用
于定时器0)
5:.
(4)定时器基本操作方法:
计算定时器的时钟频率,设置PR寄存器进行分频操作;
设置比较匹配通道的初值及其工作模式,若是使用捕获功能,则设置捕
获方式;
若使用定时器的相关中断,则设VIC,使能中断;
设置TCR,启动定时器。
如前所述,定时计数器时钟频率计算如下:
其中,N为PR的值。
四、实验内容:
结合了UART0和定时器,自编程序设计的一个可以记录20个时间值的秒表。
五、实验步骤:
1)按照开发板说明连接计算机,-JTAG软件,给开发板上电、
调试。
2)载入编好的程序,;
3)观察实验现象,看程序是否正常运作,有没有达到实验预计的功能。
六、实验程序流程图:
6:.
开始
否
按键1按下?
设置I/O连接UART0
是
IRQ使能中断
开始计时
定时器初始化
否
按键2按下?
设置定时器使能,IRQ中断
是
寄存这个时刻的值
启动定时器
否
按键3按下?
是
暂停计时
七、程序:
:
本程序是结合了UART0和定时器,自编程序设计的一个可以记录20个时间
值的秒表。
(表格内和字体加粗部分为增加修改的程序):
#include""
#include""
#defineUART_BPS115200//串口通讯波特率
uint32K1=<<16;
uint32K2=<<17;
uint32K3=<<18;
uint32h=0,m=0,s=0,ss=0,i=1;
charstr[20],strr[30]
/****************************************************************************************
**函数名称:IRQ_Timer0()
**函数功能:定时器0中断服务程序,取反LED9控制口。
**入口参数:无
**出口参数:无
7:.
****************************************************************************************/
void__irqIRQ_Timer0(void)
{
s++;
if(ss==100){ss=0;s++;}
if(s==60){s=0;m++;}
if(m==60){m=0;h++;}
if(h==24){h=0;}
T0IR=0x01;/*清除中断标志*/
VICVectAddr=0x00;/*通知VIC中断处理结束*/
}
/****************************************************************************************
**函数名称:DelayNS()
**函数功能:长软件延时。
**入口参数:dly延时参数,值越大,延时越久
**出口参数:无
****************************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/****************************************************************************************
**函数名称: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;
}
/****************************************************************************************
8:.
**函数名称:UART0_SendByte()
**函数功能:向串口发送字节数据,并等待发送完毕,查询方式。
**入口参数:dat要发送的数据
**出口参数:无
****************************************************************************************/
voidUART0_SendByte(uint8dat)
{
U0THR=dat;
while((U0LSR&0x40)==0);//等待数据发送完毕
}
voidPC_DispChar(uint8x,uint8y,uint8chr,uint8color)
{
UART0_StendByte(0xff);
UART0_StendByte(x);
UART0_StendByte(y;
UART0_StendByte(chr);
UART0_StendByte(color);
}
/****************************************************************************************
**函数名称:UART0_SendStr()
**函数功能:向串口发送一字符串
**入口参数:str要发送的字符串的指针
**出口参数:无
****************************************************************************************/
voidUART0_SendStr(uint8x,uint8y,uint8color,char*str)
{
while(1)
{
if(*str=='\0')break;//遇到结束符,退出
PC_DispChar(x++,y,*str++,color);//发送数据
if(x>=80){x=0;y++;}
}
}
voidreset()
{
h=0;m=0;s=0;ss=0;
for(i=1;i<21;i++)
{
spirntf(strr,"%2d--%2d:%2d:%2d:%2d",i,h,m,s,ss);
UART0_SendStr(0,i,0x30,strr);
}
i=1;
9:.
}
voidxianshi()
{
spirntf(str,"%2d:%2d:%2d:%2d",i,h,m,s,ss);
UART0_SendStr(1,0,0x30,str);
}
/****************************************************************************************
**函数名称:main()
**函数功能:使用定时器实现1秒钟定时,控制LED9闪烁。中断方式。
**调试说明:需要将跳线JP11连接BEEP。
****************************************************************************************/
intmain(void)
{
PINSEL0=0x00000005;/*设置管脚连接GPIO*/
IRQEnable();/*IRQ中断使能*/
/*定时器0初始化*/
T0TC=0;/*定时器设置为0*/
T0PR=0;/*时钟不分频*/
T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/
T0MR0=Fpclk/100;/**/
/*设置定时器0中断IRQ*/
VICIntSelect=0x00;/*所有中断通道设置为IRQ中断*/
VICVectCntl0=0x20|0x04;/*设置定时器0中断通道分配最高优先级*/
VICVectAddr0=(uint32)IRQ_Timer0;/*设置中断服务程序地址*/
VICIntEnable=1<<0x04;/*使能定时器0中断*/
rest()
while(IO0PIN&K1);
DelayNs(80);
while(!(IO0PIN&K1));
T0TCR=0x01;/*启动定时器*/
while(1)
{
if((IO0PIN&K1)==0)
{
while(!(IO0PIN&K1));
10:.
DelayNs(80);
T0TCR=0x00;
while((IO0PIN&K1))
{
if((IO0PIN&K3)==0){rest();xianshi();}
}
while(!(IO0PIN&K1));
DelayNs(80);
T0TCR=0x01;
}
if((IO0PIN&K2)==0)
{
while(!(IO0PIN&K2));
DelayNs(80);
if(i<21)
{
spirntf(str,"%2d--%2d:%2d:%2d:%2d",i,h,m,s,ss);
UART0_SendStr(0,i,0x30,str);
i++;
}
}
xianshi();
}
return0;
}
/****************************************************************************************
**EndOfFile
****************************************************************************************/
七、实验现象:
在运行本实验程序后,实验现象如下:
打开DOS窗口:
1)当按下KEY1键时,秒表开始启动;
2)当按下KEY2键时,将计数到底时间记录下来;
3)当按下KEY3键时,秒表停止走动;
4)最多可以记录20个时间值。
八、实验心得体会:
通过本次实验,让我又复****了GPIO、SPI的7段数码管的应用;了解了实
时时钟的工作原理及其应用;以及掌握了综合几个小实验实现一个新功能;更加
熟练了ARM的实验环境。
11:.
通过这次实验也让我学会了如何不断地发现问题并解决问题。比如,在定时
10s时,定时不准,不能实现每倒计时一秒蜂鸣器就响一次、LED灯闪一下和数
码管显示相应的数字。后来想了很久并通过和同学讨论才解决这个问题。还有就
是在一些小细节上也遇到不少问题,不过这些小问题都通过一次又一次的运行仿
真解决了。
总的来说,要做到每做一个实验,不但能实现该有的功能还要能学到不少的
知识。这样才能达到了做实验的目的。
12