|
先贴定时器源码 :
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) //设置初始TCON rTCON_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:8 PCLK=50M
我所有的中断分频都是 50/(249+1)/8 M=0.025Mhz
请前辈们指点下,我的中断程序没问题,可以进入执行,主要就是定时器的操作上不是很明白。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|