实验4 定时器实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四定时器实验

班级:姓名:学号:

一、实验目的:

1、掌握定时器初始化的步骤;

2、掌握定时器控制寄存器(TCR)的含义和使用;

3、掌握定时器工作原理,学习定时器中断的设计方法,掌握1S间隔的定时器的处理。

4、熟悉ARM的中断原理,并产生中断。

二、实验设备:

1.硬件PC机

2.软件ADS1.2、PROTUES

三、实验内容及原理:

实验内容:本实验要求编写一个简单的定时器中断程序,设置一定的周期控制(1S)与某一个引脚(P0.0)相连的LED指示灯。当定时器中断产生时可以观察到LED周期性闪烁。

实验原理:定时器控制(中断方式)。

采用11.0592MHz晶振,使用PLL部件,cclk=Fosc*4=11.0592MHz*4=442368MHz,外围时钟使用复位默认的Fpclk=fcclk/4=44.2368MHz/4=11.0592MHz,定时器0进行100分频(即PR=99,MR0=110592),实现1S定时控制LED点亮或熄灭。另外,使用VIC的向量IRQ功能。

首先设置定时器为向量IRQ中断,分配优先级并使能向量,然后设置相关向量地址寄存器VICVectAddr0及中断使能,在中断服务程序里完成LED的亮灭,在处理完毕后写向量地址寄存器为0,通知VIC中断处理结束。

四、实验步骤

1、在PROTUES里搭建好硬件电路平台,处理器采用LPC2106,如下图所示。

D1

LED-YELLOW

XTAL111XTAL2

12

DBGSEL

27

RTCK

26

P0.0/TxD0/PWM113P0.1/RxD0/PWM314P0.2/SCL/CAP0.018P0.3/SDA/MAT0.021P0.4/SCK/CAP0.122P0.5/MISO/MAT0.123P0.6/MOSI/CAP0.224P0.7/SSEL/PWM228P0.8/TxD1/PWM429P0.9/RxD1/PWM630P0.10/RTS1/CAP1.035P0.11/CTS1/CAP1.136P0.12/DSR1/MAT1.037P0.13/DTR1/MAT1.141P0.14/DCD1/EINT144P0.15/RI1/EINT245P0.16/EINT0/MAT0.246P0.17/CAP1.2/TRST 47P0.18/CAP1.3/TMS 48P0.19/MAT1.2/TCK 1P0.20/MAT1.3/TDI 2P0.21/PWM5/TDO 3P0.22/TRACECLK 32P0.23/PIPESTAT033P0.24/PIPESTAT134P0.25/PIPESTAT238P0.26/TRACESYNC 39P0.27/TRACEPKT0/TRST 8P0.28/TRACEPKT0/TMS 9P0.29/TRACEPKT2/TCK 10P0.30/TRACEPKT3/TDI

15P0.31/EXTIN0/TDO

16

V185RST

6

VSS 7

VSS 19VSS 31VSS 43V317

V340U1

LPC2106

+1.8v

+3v

2、打开ADS1.2的CodeWarrior 编译环境,新建一个工程(ARM Executable Image )工程,工程名为Time0。在新建一个文件Time0.c ,添加到工程里。

3、在工程空白处右击,添加工程所需的文件(config.h, target.h, LPC2106.h, Startup.s, IRQ.s, target.c)。如下图所示。

4、编写Time0.c,实现定时器1s 定时,LED 灯闪烁。

5、配置DebugRel Seteings , 打开Target Settings ,设置如下图所示。

6、设置ARM Linker,在Output 下选择Scatterec,添加可映射文件mem.scf.在Equivalent Command Line 下修改入口地址:-entry 0x00000000.设置效果如下图所示。

7、配置ARM fromELF 输出格式Output format为Intel32 bit Hex. Output file name为Time0.hex.如下图所示。

8、配置完成后,点击OK.

9、在PROTUES里下载Time0.hex(路径为:E:\time0\time0_Data\DebugRel\Time0.hex)

10、运行观察LED灯闪烁的效果。

五、实验参考程序

Time0Init()定时器初始化流程图

IRQ_Time0中断服务子程序设置T0的分频值和MR0的值

启动定时器并复位

选择定时器中断为IRQ

分配定时器向量IRQ最高优先设置中断复位程序的地址

匹配通道0中断并使能

T0使能

Main()主程序流程

六、实验结果

定时器控制(中断方式)实验结果:每隔1秒LED取反一次。

七、实验结论

学习定时器中断的设计方法,掌握长时间间隔的定时器的处理。在一定程度上掌握了VIC的基本操作,当设置IRQ/FIQ中断,若是IRQ中断则可以设置为向量中断并分配中断优先级,否则为向量IRQ。然后可以设置中断允许,以及向量中断对应地址或非向量中断默认地址。当有中断后,若是IRQ中断,则可以读取向量地址寄存器,然后跳转到相应代码。

当要退出中断时,对向量地址寄存器写0,通知VIC中断结束。当发生中断时,处理器将会切断处理器模式,同时相关的寄存器也将会映射。

/************************************************************************** * 文件名:TimerOut.C

* 功能:使用定时器0实现1秒定时,控制LED闪烁。(中断方式)

* 说明:将跳线器JP9短接,JP4断开。

**************************************************************************/ #include "config.h"

#define LEDFLASH 0x00000001 /* P0.0引脚控制LED,高电平点亮*/

/************************************************************************** * 名称:IRQ_Time0()

* 功能:定时器0中断服务程序,取反LEDFLASH控制口。

* 入口参数:无

* 出口参数:无

**************************************************************************/ void __irq IRQ_Time0(void)

{

while((T0IR&0x01)==0); //匹配中断,等待定时时间到

if((IOSET&LEDFLASH)==0)

IOSET=LEDFLASH; //控制LED点亮

else

IOCLR=LEDFLASH; //控制LED熄灭

T0IR=0x01; //清除中断标志

VICVectAddr = 0x00; // 通知VIC中断处理结束}

/************************************************************************** * 名称:Time0Init()

* 功能:初始化定时器0

* 入口参数:无

* 出口参数:无

**************************************************************************/ void Time0Init(void)

{ /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz

Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz */

T0PR = 99; // 设置定时器0分频为100分频,得110592Hz

T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC

T0MR0 = 110592/4; // 比较值(1S定时值)

T0TCR = 0x03; // 启动并复位T0TC

相关文档
最新文档