#include"s3c6410_addr.h"
void __irq Isr_Timer0(void);
unsigned long T_value;
unsigned long T_Tconfig;
void GPIO_Init(void)
{
// 初始化LED的IO配置
rGPKCON0 = 0x11111111;
rGPKPUD = 0x0;
rGPKDAT = 0x1F;
// 初始化蜂鸣器IO配置
rGPFCON = rGPFCON & (~(0x1 << (31)));
rGPFCON = rGPFCON | (0x1 << (2*15));
rGPFPUD = rGPFPUD & (~(0x3 << (2*15))) ;
rGPFDAT = rGPFDAT & 0x7FFF;
}
void timer_init(void)
{
rTINT_CSTAT=1<<5; //清除定时器状态位
rTINT_CSTAT |= 1<<0; //开timer0中断,允许timer0中断发生
rVIC0INTENABLE |= 1<<23; //开timer0的使能(相当于关掉mask)
rVIC0VECTADDR23=(volatile unsigned long)Isr_Timer0;
rTCFG0 = 0x00; // 设置分频因子(66分频), 定时器时钟频率为1Mhz
rTCNTB0 = 200000;
rTCON |= 1<<1; //开Manual Update (Update TCNTB0,TCMPB0)设置初值后要更新TCNTB
rTCON |= 1<<3; //Auto Reload on 自动重装开启
rTCON |= 1<<0; //timer0 open;
rTCON &= ~(1<<1); //不再Update TCNTB0,TCMPB0
T_value=rTCNTO0;
T_value=rTCNTO0;
}
// 循环延时
void msDelay(int time)
{
unsigned int i, j;
for(i = 0; i < 2; i++)
{
for (j = 0; j < time; j++);
T_value=rTCNTO0;
}
}
// 打开控件蜂鸣器的三极管
void BeepOff(void)
{
rGPFDAT = rGPFDAT & 0x7fff;
}
// 关闭控件蜂鸣器的三极管
void BeepOn(void)
{
rGPFDAT = rGPFDAT | 0x8000;
}
int i = 0;
// IRQ异常中断
void __irq Isr_Timer0(void)
{
i %= 4;
// 打开一个灯,并闭另外一个灯
rTINT_CSTAT |=1<<5;//清除定时器状态位
rGPKDAT = ~(1<<i++);
BeepOn();
msDelay(5);
BeepOff();
// 清除定时器中断状态位
// while((rTINT_CSTAT & 0x20)) rTINT_CSTAT |= (1 << 5);
rVIC0INTENCLEAR |=1<<23;
}
/*void __irq Isr_Int0(void)
{
rEINT0PEND = 1; //写1清除中断标志
GPIOKDAT=0xef; //LED1闪烁
rVIC0INTENLEAR |=1; //中断结束
}*/
void main()
{
GPIO_Init();
timer_init();
T_value=0;
while(1)
{
T_value=rTCNTO0;
T_Tconfig=rTCON;
msDelay(5);
}
}
代码如上,T_value 变化很大。。。我设置了断点。。不懂什么问题。。还想大侠指点。。