nios中定时器的应用1

一 :定时器是对时钟周期进行计数并产生周期性中断信号的硬件外围设备

 

二:其中对定时器内核配置选项说明:

Timeout Period -> 设置 periodl 和 periodh 寄存器的初始值,这个值可以根据系统输入时钟和Initial period 中的设定值获得。当Writeable period 设置关闭时,周期保持固定且不能在运行中修改。

  Initial period -> 用于预设硬件生成后的定时器周期,如果不用软件更改的话,那么定时器将按照这个周期产生 timeout 事件

  Presets -> 为方便使用,提供几个预定义的硬件配置:

    simple periodic interrupt (简单的周期中断):用于仅要求周期性 IRQ 发生器的系统。周期固定且不能停止定时器,但可以禁止  IRQ。

    full-feaured(完整特性)

    watchdog(看门狗)

 

三 :nios中定时器的一些应用:

 

1.测试nios中一段程序运行的时间

在NiosII中如果想要测试一段代码执行的时间,可以使用时间戳来测试。

        在NiosII中使用时间戳前必须在SOPC中加入一个定时器来产生时间标记,然后需要在编译NiosII中的软件工程前指定产生时间戳的是哪个定时器。在软件工程结点右击》system library properties》system library,在Timestamp timer后的下拉框中选择在SOPC里加入的想要用作时间戳的时间器。

        在软件中,必须包含头文件:#include <sys/alt_timestamp.h>,否则在编译时会出现undefined reference to 'alt_timestamp_start'  undefined reference to 'alt_timestamp'和 undefined reference to 'alt_timestamp_freq' .

        在应用中最重要的就3个函数,alt_timestamp_start()、alt_timestamp()和alt_timestamp_freq()。alt_timestamp_start()复位定时器的计数器,必须在使用alt_timestamp()前调用;alt_timestamp()返回当前定时器的计数器的值(单位是clock ticks);alt_timestamp_freq()返回此软件工程每秒钟的clock ticks的个数。

        例如得到do something的时间:

        time1 = alt_timestamp();
        // do some thing
        time2 = alt_timestamp();
        timer_overhead = time2 - time1;

本文转自:http://blog.ednchina.com/_swordflyer_/243011/Message.aspx

 

 

 

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.
本代码经过测试,比较稳定。

转自:http://helloblog.blogbus.com/logs/10059255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值