ARM秒表设计.docx
- 文档编号:9266262
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:322.94KB
ARM秒表设计.docx
《ARM秒表设计.docx》由会员分享,可在线阅读,更多相关《ARM秒表设计.docx(16页珍藏版)》请在冰豆网上搜索。
ARM秒表设计
EasyARM2131开发板实验报告
实验名称:
秒表
系部:
物理与机电工程学院
专业班级:
07电子信息工程
(2)班
学生姓名:
阙开灿
学号:
2006050427
指导教师:
涂二生老师
完成时间:
2010年5月6日
报告成绩:
秒表
(结合UART0、定时器0设计的实验)
一、实验目的:
1)结合UART0和定时器0,设计一个秒表
2)复习UART0和定时器0的工作原理和应用
3)熟悉掌握ARM中的程序应用,将理论结合实际
4)通过本次实验,将以前学的进行结合使用,以检验自己的学习质量
5)更加熟练了ARM的实验环境
二、实验仪器:
硬件:
Easy-ARM实验开发板一套
计算机一台(内装有ADS1.2及EasyJTAG仿真器)
软件:
Windowsxp系统,ADS1.2集成开发环境
三、实验原理:
1.中断:
LPC2131通过向量中断控制器(VIC)管理中断。
外设中断信号需要经过2个开关才能到达ARM内核,真正产生异常,逻辑示意图如图4.129所示。
如果在VIC中使能了相应外设的中断,外设中断才能到达VIC并向内核发送中断请求;只有使能了内核中断IRQ或者FIQ,内核才能真正产生异常。
使用VIC的IRQ中断处理过程如图4.130所示:
●用户程序首先要初始化VIC使能相关中断,然后正常运行用户程序(如图4.130中的①);
●当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为相应中断服务程序的地址(如图4.130中的②),
●切换处理器工作模式为IRQ模式,并跳转到异常向量表的IRQ中断入口0x00000018处(如图4.130中的③);
●读取VICVectAddr寄存器的值然后放入PC程序指针,跳转到相应中断服务程序(如图4.130中的④);
●中断服务中执行相应的中断处理,清除中断标志,(如图4.130中的⑤);
●中断服务完成后,切换回原来的模式,并返回原中断点(如图4.130中的⑥)。
2.UART0查询:
(1)特性:
●16字节收发FIFO;
●寄存器位置符合16C550工业标准;
●接收器FIFO触发点可为1,4,8和14字节;
●内置波特率发生器;
●LPC2131包含使能实现软件流控制的机制。
(2)结构:
UART接收器模块UxRx监视串行输入线RxD的有效输入。
UARTRx移位寄存器(UxRSR)通过RxD接收有效的字符。
当UxRSR接收到一个有效字符时,它将该字符传送到UARTRx缓冲寄存器FIFO中,等待CPU或主机通过主机接口进行访问。
UART发送器模块UxTx接收CPU或主机写入的数据并将数据缓存到UARTTx保持寄存器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中。
UART的结构如图4.16所示:
VPB接口提供CPU或主机与UART之间的通信连接。
3.定时器:
(1)概述:
LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、4比较路匹配并输出电路。
定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。
它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。
可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
(2)定时器特性:
●带可编程32位预分频器的32位定时器/计数器;
●具有多达4路32位的捕获通道-当输入信号跳变时可取得定时器的瞬时值,也可选择使捕获事件产生中断;
●4个32位匹配寄存器:
Ø匹配时定时器继续工作,可选择产生中断;
Ø匹配时停止定时器,可选择产生中断;
Ø匹配时复位定时器,可选择产生中断。
●多达4个对应于匹配寄存器的外部输出,具有下列特性:
Ø匹配时设置为低电平;
Ø匹配时设置为高电平;
Ø匹配时翻转;
Ø匹配时无动作。
(3)结构:
定时器0和定时器1的方框图,如下图所示:
(注:
捕获寄存器3不能用于定时器0)
(4)定时器基本操作方法:
●计算定时器的时钟频率,设置PR寄存器进行分频操作;
●设置比较匹配通道的初值及其工作模式,若是使用捕获功能,则设置捕获方式;
●若使用定时器的相关中断,则设VIC,使能中断;
●设置TCR,启动定时器。
如前所述,定时计数器时钟频率计算如下:
其中,N为PR的值。
四、实验内容:
结合了UART0和定时器,自编程序设计的一个可以记录20个时间值的秒表。
五、实验步骤:
1)按照开发板说明连接计算机,打开ADS1.2和H-JTAG软件,给开发板上电、调试。
2)载入编好的程序,运行ADS.12软件;
3)观察实验现象,看程序是否正常运作,有没有达到实验预计的功能。
六、实验程序流程图:
七、程序:
1.程序说明:
本程序是结合了UART0和定时器,自编程序设计的一个可以记录20个时间值的秒表。
2.实验程序(表格内和字体加粗部分为增加修改的程序):
#include"config.h"
#include"stdio.h"
#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控制口。
**入口参数:
无
**出口参数:
无
****************************************************************************************/
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;
}
/******************************************************************************************函数名称:
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;
}
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.5秒钟定时*/
/*设置定时器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));
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的实验环境。
通过这次实验也让我学会了如何不断地发现问题并解决问题。
比如,在定时10s时,定时不准,不能实现每倒计时一秒蜂鸣器就响一次、LED灯闪一下和数码管显示相应的数字。
后来想了很久并通过和同学讨论才解决这个问题。
还有就是在一些小细节上也遇到不少问题,不过这些小问题都通过一次又一次的运行仿真解决了。
总的来说,要做到每做一个实验,不但能实现该有的功能还要能学到不少的知识。
这样才能达到了做实验的目的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 秒表 设计