fengyuganyu 发表于 2010-11-27 23:32:12

S3C2440A的定时器 出问题,请教牛人指点

先贴定时器源码 :
void TimeN_Init()
{
        char i=0,j=0;
        rTCON=0;
        rTCFG0=0;
        rTCFG1=0;
        rTCNTB0=0;
        rTCMPB0=0;
        rTCNTB1=0;
        rTCMPB1=0;
        rTCNTB2=0;
        rTCMPB2=0;
        rTCNTB3=0;
        rTCMPB3=0;
        rTCNTB4=0;

        rTCFG0=0xf9f9;// 对两个定时器的预分频值 都为249

        for(i=0;i<4;i++)
        {
                for(j=0;j<4;j++)
                {
                        if(((Div_Val>>j)&0x01)==1) //Div_Val=0x2 选择1/8 分割
                        {
                                rTCFG1|=1<<((i*4)+j);
                        }
                        else
                        {
                                rTCFG1&=~(1<<((i*4)+j));
                        }
                }
        }
        rTCON|=1<<4;
}

void TimeN_Install(U8 Time_No,long SetTime_us)
{
        char i=0,ipos1=0,ipos2=0;
        switch(Time_No)
        {
                case 0:
                                {
                                  rTCNTB0=SetTime_us/40;
                                  rTCMPB0=SetTime_us/80;
                                }
                                break;
                case 1:
                                {
                                  rTCNTB1=SetTime_us/40;
                                  rTCMPB1=SetTime_us/80;
                                }
                                break;
                case 2:
                                {
                                  rTCNTB2=SetTime_us/40;
                                  rTCMPB2=SetTime_us/80;
                                }
                                break;
                case 3:
                                {
                                  rTCNTB3=SetTime_us/40;
                                  rTCMPB3=SetTime_us/80;
                                }
                                break;
                case 4:
                                {
                                  
                                  rTCNTB4=SetTime_us/40;
                                }
                                break;

        }

        if(Time_No>0)
        {
                ipos1=8;
                ipos2=1;
        }
        else
        {
                ipos1=0;
                ipos2=0;
        }
        if(Time_No==4)
        {
                rTCON |=1<<21;
        }
        else
        for(i=0;i<4;i++)
        {
                if(((rTCON_TN_VAL>>i)&0x1)==1)    //设置初始TCONrTCON_TN_VAL=0X6
                {
                        rTCON|=1<<((Time_No-ipos2)*4+i+ipos1);
                }
                else
                {
                        rTCON&=~(1<<((Time_No-ipos2)*4+i+ipos1));
                }
        }
       
                //rTCON=0;
}

void TimeN_Start(U8 Time_No)
{

        if(Time_No>0)
        {
                if(Time_No==4)
                {
                        rTCON |=1<<((Time_No-1)*4+8+2); //设置定时器4 的自动重装
                }
                else
                {
                        rTCON |=1<<((Time_No-1)*4+8+3);//设置定时器1——3的自动重装
                }
                rTCON |=1<<((Time_No-1)*4+8+0);       //开启定时器1——4
                        }
        else
        {
          rTCON |=1<<((Time_No-0)*4+3); //设置定时器0的自动重装

                rTCON |=1<<((Time_No-0)*4+0);//开启定时器0
                               
        }



}
现在的问题是 我用这种方式启动一个定时器中断,可以运行,但是用这个TimeN_Start函数启动所有定时器中断 往往只有两个可以运行,当我不用TimeN_Start() 时 直接对rTCON=0X599919时 启动所有定时器 可以启动,但是定时器进入中断的先后顺序 的时间差太大了,当只有定时器1、2、3同时启动时,3个进入中断几乎是同时,我就不明白了这个定时器是不是设置错了。请牛人解答。

我的MPLL的设置是 M_DIV=92,P_DIV=1,S_DIV=1,外部晶振12M则FCLK=400M,分频为1:4:8PCLK=50M

我所有的中断分频都是 50/(249+1)/8 M=0.025Mhz

请前辈们指点下,我的中断程序没问题,可以进入执行,主要就是定时器的操作上不是很明白。
页: [1]
查看完整版本: S3C2440A的定时器 出问题,请教牛人指点