概述
一 :定时器是对时钟周期进行计数并产生周期性中断信号的硬件外围设备
二:其中对定时器内核配置选项说明:
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
最后
以上就是眯眯眼过客为你收集整理的nios中定时器的应用1的全部内容,希望文章能够帮你解决nios中定时器的应用1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复