3439|3

24

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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();

}   
点赞 关注
 

回复
举报

24

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
顶一下,帖子一下子就沉海底了!
没人碰到过吗?网上的例程都是1秒的定时,我从网上下载的实例或者运行mini2440光盘附带的程序,定时器都有
这个问题存在,是不是大家定时为1秒时都没注意把示波器展开观看定时时间是否在跳变呢,我的程序要求定时器
的精度很高,现在相差几百纳秒接受不了。
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
今天上午看了一下,发现不是定时器的问题,因为将定时器0输出PWM波时,定时器很准确,PWM波形没有波动,
但是同时在中断函数IRQ_Timer0_Handle(void)中改变管脚GPF3输出高低电平时,GPF3管脚输出的波形就会有波动,很是奇怪,不知道为什么PWM波(GPB0设置为TOUT0)输出就很稳定,管脚GPF3输出高低电平就有波动?

点评

问题已经简化为:只在while中执行rGPFDAT = (rGPFDAT & 0x0000) | 0xFFFF; 和 rGPFDAT = (rGPFDAT & 0x0000) 这两句话输出来的波形都在左右抖动 ,是不是mini2440就存在这个问题呢。 怎么都没人回复,没人知道原  详情 回复 发表于 2014-2-28 10:23
 
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

4
 
whaidong123 发表于 2014-2-26 13:40
今天上午看了一下,发现不是定时器的问题,因为将定时器0输出PWM波时,定时器很准确,PWM波形没有波动,
...

问题已经简化为:只在while中执行rGPFDAT = (rGPFDAT & 0x0000) | 0xFFFF;   和 rGPFDAT = (rGPFDAT & 0x0000) 这两句话输出来的波形都在左右抖动
,是不是mini2440就存在这个问题呢。
怎么都没人回复,没人知道原因吗
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表