2103定时器中断和查询方式

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

定时器:

2104有2个定时计数器,T0,T1

IR :定时器中断寄存器 T0IR,T1IR

TCR:定时器控制寄存器

TC:定时器计数器

PR:预分频寄存器

PC:预分频计数器寄存器

MR0-3 匹配寄存器

MCR:匹配控制寄存器

CR0-3:捕获寄存器

CCR:捕获控制寄存器 EMR:外部匹配寄存器

定时器基本操作的方法:

l 计算定时器的时钟频率,设置PR寄存器进行分频操作

l 设置比较匹配通道的初值以及工作模式,若是使用捕获功能,则设置捕获方式

l 若使用定时器的相关中断,则设置VIC,使能中断

l 设置TCR,启动定时器

l 计数时钟频率=Fpclk/(N+1) N 为PR的值

定时器初始化:(定时器0定时0.1S)步骤:

程序使用匹配寄存器,设置T0PR=99,即计数频率为Fplck的1/100,也就是25 000HZ,使用定时器0的MR0进行匹配比较操作,匹配值为2 500,匹配将产生中断复位TC

1,定义T0TC=0;复位定时计数器

2,定时T0PR,即定义器频率进行100分频

3, T0MCR,设置T0MCR匹配后复位T0TC,产生中断

4,定义匹配寄存器T0MR0,置匹配值

5, T0TCR定义,启动定时器0

定时器捕获程序步骤:

1,定义引脚连接,捕获引脚

2,设置捕获控制寄存器T0CCR,设置捕获状态,为上升沿、下降沿、事件中断

3,复位T0TC

4,启动定时器,T0TCR

定时器PWM输出程序步骤:

使用定时器的匹配输出功能实现,当MR1匹配后MAT0.1输出电平翻转,输出的PWM占空比为固定的50%,如果要控制PWM的占空比,只能使用中断处理实现!1,设置匹配寄存器T0MCR1,为匹配后复位

2,设置外部匹配寄存器T0EMR,匹配后MAT0.1输出翻转

3,根据PWM周期,设定匹配值T0MR1

4,启动定时器T0TCR

LPC2103定时器0定时实验-查询方式

今天做lpc2103的定时器定时实验,相关的c语言程序如下:

/***********定时器0定时--查询方式**********************************/

//功能:用定时器0实现0.5秒定时,查询标志位等待定时时间到达,对LED进行控制,让LED每秒钟亮一次

//编写:胡峰

//说明:参照ZLG电子教案

/***********************************************************************************/

#include"inc\config.h"

#define LED 1<<17 //p0.17控制LED,低电平亮

/***********************************************************************************

**函数名称:Init_timer0()

**函数功能:使用定时器T0实现0.5s钟定时,控制LED闪烁

***********************************************************************************/ void Init_timer0(void)

{

T0TC = 0; //定时计数器设置为0

T0PR = 0; //时钟不分频

T0MCR = 0x03; //设置T0MR0匹配后产生中断并且复位T0T C

T0MR0 = Fpclk/2; //0.5秒定时

T0TCR = 0x01; //启动定时器

}

/***********************************************************************************

**函数名称:main()

**函数功能:使用定时器T0实现0.5s钟定时,控制LED闪烁

***********************************************************************************/ void main(void)

{

PINSEL0 = 0x00000000; //设置管脚连接GPIO

IO0DIR = LED; //设置LED控制口输出

Init_timer0(); //定时器0初始化

while(1)

{

while((T0IR & 0x01)==0); //等待定时时间到

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

if((IO0SET & LED)==0) IO0SET = LED;//LED灭

else IO0CLR = LED; //LED亮

}

//return 0;

}

结果我发现一个问题,按照程序中的定时时间应该是0.5秒LED就会转换一次状态,可是实际运行出来的结果并不是这样,其亮和灭的时间似乎已经大于了1s,我的程序是直接烧写到flash中的,不知道这是什么原因造成的?有人遇到过这样的情况吗?请和我交流。

【转】LPC2103定时器0定时实验-中断方式

2010-08-23 09:56

这两天在学LPC2103的定时器,其中要用到中断这一功能,看了例子后,感觉ARM的中断设置可是真复杂啊,看了两天我才稍微有一点明白。

lpc2103的向量中断寄存器(VIC)有32个中断请求输入,可将其分为3类:FIQ(快速中断)、向量IRQ和非向量IRQ,其中FIQ优先级最高,向量IRQ次之,

非向量IRQ最低。

VIC的基本操作方法如下:

1、设置中断是FIQ还是IRQ,若是IRQ,再设置向量中断,并分配中断优先级。

2、设置中断允许,以及乡里向量中断对应地址或非向量中断默认地址。

3、有中断之后,若是IRQ中断,则可读取向量地址寄存器,然后跳转到该地址所在的响应服务代码。

4、当要推出中断时,对向量地址寄存器写0,通知VIC中断结束。

上次做的实验是采用查询的方式实现LED闪烁,因为在查询的时候CPU 只能做一件事,极大地降低了CPU 的使用效率,所以一般情况下,采用中断方式来实现更经济实惠。

程序如下:

#include

#include

#include

// OSC [Hz] 外部晶振

#define FOSC 11059200UL

// Core clk [Hz] 处理器当前时钟

#define FCCLK FOSC

// Per clk [Hz] 外部器件时钟,由VPB分频器决定其与FCCLK的关系

相关文档
最新文档