Nios开发--定时器Interval Timer
文章摘要:
本文详细描述了Nios定时器r组件Interval Timer的应用;
硬件平台:EP4CE6F17C8
开发环境:Quartus II 13.1/Nios II 13.1
参考文档:Quartus II Handbook Volume 5: Embedded Peripherals
添加Timer组件
Library -->
Peripherals -->
Microcontroller Peripherals -->
Vectored Interrupt Controller
连接clk/rest/s1线, 分配地址,分配IRQ信号;
寄存器说明
状态寄存器
TO - TimeOut标志,定时器时间到时置位,需要软件清零;
RUN - 运行状态标志,对其写操作无效;
控制寄存器
ITO :中断使能
CONF :重载使能, 1 - 循环计数; 0 - 单次计数
START:启动计时
STOP :停止计时
周期寄存器
两个16位寄存器,用于重载计数值;
计数器快照
两个16位寄存器,用于保存当前计数值;
需要先对快照寄存器进行写操作,才能将计数器当前值保存至快照寄存器;
其他说明
1.定时器采用递减工作模式;
2.重载值计数结果需要减1;
示例代码
#include "regs.h"
#include "sys/alt_irq.h"
#include <unistd.h>
/*
* 定时器中断服务函数
*/
void isr_timer(void* context)
{
rTIMER_SR = 0; // 清除中断标志位
rLEDS = ~rLEDS;
}
/*
* 功能描述:定时器初始化函数
* 参数列表:interval - 定时值(时钟数)
*/
void timer_init(int interval)
{
rTIMER_CR = 0x08; // 设置参数时先停止运行
rTIMER_PRH = interval >> 16;
rTIMER_PRL = interval & 0xFFFF;
// 注册中断
alt_ic_isr_register(
TIMER_IRQ_INTERRUPT_CONTROLLER_ID,
TIMER_IRQ, // 中断向量
isr_timer, // 中断服务函数
0, // 参数
0); // flag
// 启动/循环计数/中断使能
rTIMER_CR = 0x07;
}
int main(void)
{
int val0,val1;
timer_init(500000000);
while(1){
// 必须经过一个写操作才能生成快照,
// 数据内容被忽略,不影响计数器值;
rTIMER_DRL = 0;
val0 = rTIMER_DRL;
val1 = rTIMER_DRH;
usleep(100000);
}
}