mini2440定时器定时存在100ns~300ns的误差!!大家帮忙分析分析是什么原因,谢谢了!
[复制链接]
我使用的是裸机程序,没有嵌入系统,使用的是定时器0,定时中断时间为10微妙,定时器中断中使GPB7端口输出高低电平变化,
使用示波器触发方式展开观看GPB的高电平(中断进来先是GPB口输出高定平,延时2us输出低电平),发现触发点后的那个高电平
不稳定,大于预定的10us处100us或者小于100us,不知道是什么原因,开始怀疑是晶振频率跳动,后来换了别的板卡和换掉晶振
结果都是一样的,下面贴出我的主要代码,麻烦各路高人指点指点,在此先谢了!
/*************************************************
Function name: Main
Parameter : void
Description : 主功能函数
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Main(void)
{
Set_Clk(); //主频FCLK为400M,HCLK为100M,PCLK为50M
Timer0_init(); //定时器初始化
while(1);
}
/*************************************************
Function name: Timer0_init(void)
Parameter : void
Description : 定时器的初始化
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Timer0_init(void)
{
//Timer 0 init
rTCFG0 &= 0xFFFF0000; // set Timer 0&1 prescaler 0
rTCFG0 |= 0x3131;
rTCFG1 &= 0xFFF00000;
rTCFG1 |= 0x00000000;
rTCNTB0 = 0x05; //TCNTB0[15:0]=计数值
rTCMPB0 = 0;
rTCON |=(1<<1) ; //将计数值装入TCNTB0、TCMPB0
rTCON =0x09;
rPRIORITY = 0x00000000; // 默认优先级
rINTMOD = 0x00000000; // 默认优先级
ClearPending(BIT_TIMER0);
pISR_TIMER0 = (U32)IRQ_Timer0_Handle;
EnableIrq(BIT_TIMER0);
}
/*************************************************
Function name: IRQ_Timer0_Handle(void)
Parameter : void
Description : 定时器0的中断处理函数
Return : void
Argument : void
Autor & date :
**************************************************/
static void __irq IRQ_Timer0_Handle(void)
{
int i;
ClearPending(BIT_TIMER0);
rGPFCON = 0x5558;
rGPFUP = 0xff;
rGPBDAT = (rGPBDAT & 0xFF7F) | 0x80;
for(i=0;i<200;i++);
rGPBDAT = rGPBDAT & 0xFF7F;
}
/*************************************************
Function name: Set_Clk()
Parameter : void
Description : 设置CPU的时钟频率
Return : void
Argument : void
Autor & date : Daniel
**************************************************/
void Set_Clk(void)
{
int i;
U8 key;
U32 mpll_val=0;
i = 2 ; //use 400M!
switch ( i ) {
case 0: //200
key = 12;
mpll_val = (92<<12)|(4<<4)|(1);
break;
case 1: //300
key = 14;
mpll_val = (67<<12)|(1<<4)|(1);
break;
case 2: //400
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
case 3: //440!!!
key = 14;
mpll_val = (102<<12)|(1<<4)|(1);
break;
default:
key = 14;
mpll_val = (92<<12)|(1<<4)|(1);
break;
}
ChangeClockDivider(key, 12);
ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
MMU_Init();
}
|