主题 : 关于6410 定时器问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 72229
精华: 0
发帖: 26
金钱: 130 两
威望: 26 点
综合积分: 52 分
注册时间: 2012-06-18
最后登录: 2012-08-29
楼主  发表于: 2012-08-12 13:34

 关于6410 定时器问题

#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 变化很大。。。我设置了断点。。不懂什么问题。。还想大侠指点。。