2103定时器中断和查询方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的关系