一、间隔定时器结构

间隔定时器的结构框图:

 

该间隔定时器有如下两个特点:

- Avalon-MM接口,提供对6个16位寄存器的访问;
- 有一个脉冲输出接口(可选),可用作周期性脉冲发生器;

该间隔定时器的所有寄存器都是16位的,可兼容16-bit和32-bit处理器。某些寄存器只存在于特定的配置中,例如,当该间隔定时器配置为固定周期,那么period寄存器就不存在。

以下序列描述了间隔定时器的基本行为:

- Avalon-MM主设备可通过 control 寄存器实现以下行为:
- 启动和停止定时器;
- 使能或禁用IRQ;
- 指定count-down once或者continuous count-down模式;
- 处理器可通过读取 status 寄存器来获取当前定时器的行为;
- 处理器可通过向 period 寄存器写入特定的值来指定定时器的周期;
- 当内部的计数器计数到0时,会立即从 *period* 寄存器中重新加载计数值;
- 处理器可通过如下方式读取当前内部计数器的计数值:首先对 *snap* 寄存器执行写操作,然后再对 snap 寄存器执行读操作,就可以获得当前内部计数器的计数值;
- 当计数到0时,会触发以下一个或多个事件:
- 若使能了IRQ,则会生成一个IRQ;
- 脉冲发生器输出接口(可选)会输出一个时钟周期的有效值;
- 看门狗输出会使系统复位。

二、间隔定时器寄存器描述

Interval Timer寄存器描述:

status寄存器有2个域:

 

control寄存器有4个域:

 

注:同时向START位和STOP位写1会产生不确定的结果。

period 寄存器

periodlperiodh 寄存器共同存放了计数器的初始计数值。当下列情况之一发生时,内部计数器就会加载 periodlperiodh 寄存器中的值:

  • periodlperiodh 寄存器执行写操作;

  • 内部计数器计数到0。

snap 寄存器

主设备可以通过对 snaplsnaph 寄存器执行写操作(写数据被忽略)来读取当前内部计数器的值。执行写操作后,内部计数器的值便会存放在 snaplsnaph 寄存器中。无论内部计数器是否正在计数,对 snaplsnaph 寄存器执行写操作都可以获取内部计数器的值,并且此操作不会影响内部计数器的行为。

三、间隔定时器的中断

当内部计数器计数到0,并且 control 寄存器的 ITO 位为1时,间隔定时器会产生中断IRQ。可通过以下两种方式对IRQ进行应答:

  • 清除 status 寄存器的 TO 位;

  • 通过清除 control 寄存器的 ITO 位来禁用中断。

 

四、间隔定时器计数器的操作

间隔定时器在IP设置界面的配置:

image-20240711162243136

定时器寄存器文件位于Quartus Prime软件安装路径下的...\intelFPGA\22.1std\ip\altera\sopc_builder_ip\altera_avalon_timer\inc文件夹中。

image-20240710165547613

主要用了定时器的状态寄存器和控制寄存器中的两个函数:

image-20200812111331529

 下面对寄存器操作举例:

对于状态寄存器中定义的IOWR(base, ALTERA_AVALON_TIMER_STATUS_REG, data)函数,在Nios V软件工程的main.c中为IOWR(TIMER_0_BASE, 0, 0x00)。

 

对于控制寄存器中定义的IOWR(base, ALTERA_AVALON_TIMER_CONTROL_REG, data)函数,在Nios V软件工程的main.c中为IOWR(TIMER_0_BASE, 1, 0x07),作为使能中断语句。