主题 : mini2440定时器定时存在100ns~300ns的误差!!大家帮忙分析分析是什么原因,谢谢了! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 45210
精华: 0
发帖: 40
金钱: 200 两
威望: 40 点
综合积分: 80 分
注册时间: 2011-05-03
最后登录: 2024-06-26
楼主  发表于: 2014-02-25 16:47

 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();
}    
级别: 新手上路
UID: 45210
精华: 0
发帖: 40
金钱: 200 两
威望: 40 点
综合积分: 80 分
注册时间: 2011-05-03
最后登录: 2024-06-26
1楼  发表于: 2014-02-26 09:02
顶一下,帖子一下子就沉海底了!
没人碰到过吗?网上的例程都是1秒的定时,我从网上下载的实例或者运行mini2440光盘附带的程序,定时器都有
这个问题存在,是不是大家定时为1秒时都没注意把示波器展开观看定时时间是否在跳变呢,我的程序要求定时器
的精度很高,现在相差几百纳秒接受不了。
级别: 新手上路
UID: 45210
精华: 0
发帖: 40
金钱: 200 两
威望: 40 点
综合积分: 80 分
注册时间: 2011-05-03
最后登录: 2024-06-26
2楼  发表于: 2014-02-26 13:41
今天上午看了一下,发现不是定时器的问题,因为将定时器0输出PWM波时,定时器很准确,PWM波形没有波动,
但是同时在中断函数IRQ_Timer0_Handle(void)中改变管脚GPF3输出高低电平时,GPF3管脚输出的波形就会有波动,很是奇怪,不知道为什么PWM波(GPB0设置为TOUT0)输出就很稳定,管脚GPF3输出高低电平就有波动?