文章摘要:
本文详细描述了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);
    }
}