• NIOS 定时器Timer - [FPGA]

    2007-09-27

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://helloblog.blogbus.com/logs/10059255.html

         由于前一阵的忙碌已经很久没有写东西了,一方面是因为前一阵准备电赛的事,没有时间来顾及我这块小空间。另一方面,前一阵对于FPGA也没有太大的进步。经过一个星期压迫式的学习,我对FPGA有了更加深刻的认识。对FPGA中定时器有了最深刻的认识。下面是我写的在NIOS环境中关于定时的的编程。
       static void Timer_Init(void)
    {
     IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_1_BASE,(short)(alt_frq)&0x0000ffff);
     IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_1_BASE,(short)((alt_frq)>>16)&0x0000ffff);
    }  //始终初始化,设定定时值,alt_frq为cpu始终。上面的表达为定时一秒将产生一个标志。分别向上面两个寄存器写入定时的值,一个为低位一个为高位。


    //start count
    static void Timer_Start(void)
     {
       IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE,ALTERA_AVALON_TIMER_CONTROL_START_MSK+ALTERA_AVALON_TIMER_CONTROL_CONT_MSK);
      }//设置控制寄存器的值,以循环的方式开始计数。


    //stop count;
    static void Timer_Stop(void)
     {
      IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_1_BASE,ALTERA_AVALON_TIMER_CONTROL_STOP_MSK);
     } //停止定时器,计数器

    //read value
    alt_u32 Timer_Value(alt_u32 time)
    {
       int k;
       int l;
      
       IOWR_ALTERA_AVALON_TIMER_SNAPH(TIMER_1_BASE, 0);
     
       k=IORD_ALTERA_AVALON_TIMER_SNAPH(TIMER_1_BASE);
       l=IORD_ALTERA_AVALON_TIMER_SNAPL(TIMER_1_BASE);
       time=((alt_frq-((k<<16)|l))*1)/50;                //unit us
     return (time);
    }//读取定时器的值,并且换算成时间。上面的表达式的单位为us我用的CPU时钟是50MHZ.
    本代码经过测试,比较稳定。
     

     


    随机文章:

    FPGA捕获数据 2007-08-27
    nios(尼奥斯) 2007-08-25
    快玩转了 2007-08-01

    收藏到:Del.icio.us




    评论

  • 看了你的学习经历,很佩服.有毅力,不畏艰难,肯下功夫,可以当我的老师了
  • 你对FPGA很熟悉啊。能叫个朋友吗?一起讨论以下,我是新手的,QQ729639471