您的位置:首页 > 其它

mini2440 定时器中断实验

2011-09-26 13:39 465 查看
Timer定时器主要配置一下寄存器1、TCFG0和TCFG1:分别设为119和0x03 这俩个寄存器用于设置“Control Logic”的时钟,计算公式如下:

Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}

对于TIMER0,prescaler value = TCFG0[7:0],divider value由TCFG[3:0]确定(0b000:2,0b001:4,0b010:8,0b0011:16,0b01xx:使用外部TCLK0)。

对于本实验假设PLCK为50M(需要控制PLL在后面实验才能配置),TIMER0时钟 = 50MHz/(249+1)/(8) = 25Hz (1000/25000=0.04ms)意思为每0.04ms减一个数,需要25000个数才到1000ms。

TCNTB0:设为25000(1000ms/0.04ms=25000),在25Hz的频率下,此值对应的时间为1S

#define GLOBAL_CLK 1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

void beep_init(void)//蜂鸣器初始化

{

rGPBCON =1<<0;// 设置GPB0为输出端口

rGPBUP=1<<0;//禁止GPB0上拉功能

}

void inter_init()//中断初始化函数

{

rINTMSK &=~(1<<10); //屏蔽Timer0以外的中断源

rINTMOD &=~(1<<10);//把Timer0中断设为IRQ模式

}

void Timer0_init()//定时器初始化

{

rTCFG0=119;//设置TCG0

rTCFG1 &=(0x2<<0);//8分频

rTCNTB0 = 25000;//设置TCNTB0数据

rTCON |=(1<<1);//将TCNTBn和TCMPBn的值分别写入TCNTn和TCNPn

rTCON=0x9;//将Timer0设为自动装载并开启Timer0

}

static void __irq Timer0_ISR(void) //TIMER0发生时的中断处理函数

{

static int flag=0;//定义一个标志位

if(flag==0)//为0蜂鸣器

{

rGPBDAT =0x1;//蜂鸣器响

flag=1;//标志位置1

}

else

{

rGPBDAT=0x0;//蜂鸣器不响

flag=0;//标志位置0

}

rSRCPND |=(1<<10);//清除Timer0中断器标记位

rINTPND |=(1<<10);//清除总中断器标记位

}

void Main(void)

{

MMU_Init();//初始化内存,实现内存地址重定向

beep_init();//初始化蜂鸣器

inter_init();//中断初始化

Timer0_init();//配置定时器

pISR_TIMER0 = (U32)Timer0_ISR;//将中断服务函数的地址传给对应的中断向量表位置

while(1); //死循环等待中断的发生

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: