/*
本程序的功能是通过定时1S来改变LED的显示状态以及让蜂鸣器根据TOUT0的输出响和停。
出现的问题:程序在GT2440板上运行时执行不了定时器里面的程序,好像是中断进不去似的,
似乎定时器的中断没设置好,但我检查了很多遍觉得都设置好了啊,就是不行,不知道
为什么,我的另一外部中断的程序也是这样。
定时器我通过设置它的TOUT0功能设置测试时是可以输出PWM波形,说明定时器运行正常,
我想问题应该是出在中断这边,但就是找不出具体出在哪一步上。
我现在一直卡在中断上都好几天了,所以麻烦大家帮忙解决下,谢谢大家。
*/
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
//================================
U32 data;
void clock_init(void)
{
U8 key;
U32 mpll_val=0;
mpll_val = (42<<12)|(1<<4)|(1);// FCLK=2*(M+8)*Fin/((P+2)*2^S);
//init FCLK=200M, so change MPLL first
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);//(0x5c,1,1)
ChangeClockDivider(key, 12);
MMU_DisableICache();
MMU_DisableDCache();
}
void __irq Timer0Handle(void)
{
ClearPending(BIT_TIMER0);
data = ~data; //四个灯状态取反
rGPBCON = 0x155556; //设置TOUT0功能,使蜂鸣器响,其中蜂鸣器由rGPBDAT的第一位控制
}
void Timer0_Init()
{
U32 div;
rTCFG0=249;//设置预分频器分频值,TIME0/1=250,TIME2/3/4=0
div = (PCLK / 250 / 4 ) / 1;// div=(PCLK/256/4)/freq; 1HZ,1S
rTCON=0x0;
rTCNTB0=div;
rTCMPB0=(199*div)/200; //根据占空比调小蜂鸣器的声音,闲太吵
ClearPending(BIT_EINT0);
pISR_TIMER0= (U32)Timer0Handle; //中断进不去
rINTMSK &= ~BIT_TIMER1;//取消对定时器0的屏蔽
rTCON=0xa; //手动装定时器的计数值
rTCON=0xd; //启动定时器,倒相开启
}
void Main(void)
{
clock_init();
Timer0_Init();
data = 0x00;
rGPBCON = 0x155555;// 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
while(1)
{
rGPBDAT = (data<<5);
}
}
/* 这是2440addr.h中ClearPending函数的定义,少了一句"rINTPND",如果加上这一句就编译不过,不知道为什么
#define ClearPending(bit) {\
rSRCPND = bit;\
rINTPND = bit;}
*/ |