ARM秒表设计.docx
《ARM秒表设计.docx》由会员分享,可在线阅读,更多相关《ARM秒表设计.docx(13页珍藏版)》请在冰豆网上搜索。
ARM秒表设计
EasyARM2131开发板实验报告
实验名称:
学生姓名:
报告成绩:
图1.18EasyARM2l3l元件布局图
(结合UARTO、定时器0设计的实验)
实验目的:
\.7
2345
1)结合UART0和定时器0,设计一个秒表复习UART0和定时器0的工作原理和应用熟悉掌握ARM中的程序应用,将理论结合实际通过本次实验,将以前学的进行结合使用,以检验自己的学习质量更加熟练了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中的⑤);中断服务完成后,切换回原来的模式,
中的⑥)。
图4J,30憧用VIC的IRQ申範处理过握
2.UARTO查询:
(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时钟(pcik)。
主时钟与UxDLL和UxDLM寄存器所定义的除数相除得到UARTTx模块使用的时钟。
该时钟为16倍过采样时钟NBAUDOUT。
中断接口包含寄存器UxIER和UxIIR。
中断接口接收几个由UxTx和UxRx发出的单时钟宽度的使能信号。
UxTx和UxRx的状态信息保存在UxLSR中。
UxTx和UxRx的控制信息保存在UxLCR中。
UART的结构如图4.16所示:
VPB接口提供CPU或主机与UART之间的通信连接。
PSEl
PSFE
R'jRJTE
*丹严2】
AR
t.lft
荃4花UART方推图
3.定时器:
(1)概述:
LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、4比较路匹配并输出电路。
定时器对外设时钟(pcik)周期进行计数,可选择产生中断或根据4个匹配寄存器的设定,在到达指定的定时值时执行其它动作(输出高/低电平、
翻转或者无动作)。
它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。
可用于对内部事件进行计数的间隔定时器,或者通
过捕获输入实现脉宽调制,亦可作为自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
(2)定时器特性:
带可编程32位预分频器的32位定时器/计数器;
具有多达4路32位的捕获通道-当输入信号跳变时可取得定时器的瞬时值,也可选择使捕获事件产生中断;
4个32位匹配寄存器:
匹配时定时器继续工作,可选择产生中断;
匹配时停止定时器,可选择产生中断;
匹配时复位定时器,可选择产生中断。
多达4个对应于匹配寄存器的外部输出,具有下列特性:
匹配时设置为低电平;
匹配时设置为高电平;
匹配时翻转;
匹配时无动作。
(3)结构
定时器于定时器0)
If
T
和定时器1的方框图,如下图所示:
(注:
捕获寄存器3不能用
1匹£«非帝01
H
[亿LW厚番1
[TSyjflf孚舊2
1且配奇导话31
H
1鬼者【奇#番
1
(蛉難匹虻奇厚爵
[斷寄殍燕
V'ATl-C)
TC
VAMWA-T
•注:
掩莪菇族3疋:
绽羽于定卜:
再打
$4.85建时器方嗨$
(4)定时器基本操作方法:
计算定时器的时钟频率,设置PR寄存器进行分频操作;
设置比较匹配通道的初值及其工作模式,若是使用捕获功能,则设置捕获方式;
若使用定时器的相关中断,则设VIC,使能中断;设置TCR,启动定时器。
如前所述,定时计数器时钟频率计算如下:
计数吋钟频率=冬岂
N+]
结合了UARTO和定时器,自编程序设计的一个可以记录20个时间值的秒表。
五、
实验步骤:
1)
2)
3)
八、
按照开发板说明连接计算机,打开ADS1.2和H-JTAG软件,给开发板上电、调试。
载入编好的程序,运行ADS.12软件;
观察实验现象,看程序是否正常运作,有没有达到实验预计的功能。
实验程序流程图:
七、程序:
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_TimerO()
定时器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++);
/*************
**函数名称**函数功能率115200。
**入口参数**出口参数
:
UART0_Init()
:
串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特
:
无
:
无
****************************************************************************************/
voidUART0_Init(void)
{
uint16Fdiv;
U0LCR=0x83;//DLAB=1,允许设置波特率
Fdiv=(Fpclk/16)/UART_BPS;//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
/****************************************************************************************
UART0_SendByte()向串口发送字节数据,并等待发送完毕,查询方式。
dat要发送的数据
无
UART0_SendStr()向串口发送一字符串str要发送的字符串的指针无
函数名称
函数功能
入口参数
出口参数
****************************************************************************************/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);}
/**
函数名称
函数功能
入口参数
出口参数
****************************************************************************************/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)
{
/*设置管脚连接GPIO*/
PINSEL0=0x00000005;
IRQEnable();
/*IRQ中断使能*/
/*设置定时器0中断IRQ*/
VICIntSelect=0x00;
VICVectCntl0=0x20|0x04;
VICVectAddr0=(uint32)IRQ_Timer0;
VICIntEnable=1<<0x04;
/*所有中断通道设置为IRQ中断*//*设置定时器0中断通道分配最高优先级*//*设置中断服务程序地址*/
/*使能定时器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)
{
spimtf(str,"%2d--%2d:
%2d:
%2d:
%2d",i,h,m,s,ss);
UART0_SendStr(0,i,0x30,str);
i++;
}
}
xianshi();
}
return0;}
EndOfFile
****************************************************************************************/
七、实验现象:
在运行本实验程序后,实验现象如下:
打开DOS窗口:
1)
2)
3)
4)
当按下KEY1键时,秒表开始启动;
当按下KEY2键时,将计数到底时间记录下来;
当按下KEY3键时,秒表停止走动;最多可以记录20个时间值。
八、实验心得体会:
通过本次实验,让我又复习了GPIO、SPI的7段数码管的应用;了解了实时时钟的工作原理及其应用;以及掌握了综合几个小实验实现一个新功能;更加熟练了ARM的实验环境。
通过这次实验也让我学会了如何不断地发现问题并解决问题。
比如,在定时10s时,定时不准,不能实现每倒计时一秒蜂鸣器就响一次、LED灯闪一下和数码管显示相应的数字。
后来想了很久并通过和同学讨论才解决这个问题。
还有就是在一些小细节上也遇到不少问题,不过这些小问题都通过一次又一次的运行仿真解决了。
总的来说,要做到每做一个实验,不但能实现该有的功能还要能学到不少的知识。
这样才能达到了做实验的目的。