zoukankan      html  css  js  c++  java
  • 【笔记】NIOS II Interval Timer Core详解

    【笔记】NIOS II Interval Timer Core详解

    1、说明

    本文参考《Embedded Peripherals (ver 9.0, Mar 2009, 4 MB).pdf》,可以看做是实用化的翻译。本文是笔者学习笔记,希望对读者也有帮助。

    笔者测试使用环境为quartus 8.1版本。

    使用器件为CYCLONE II EP2C8Q208C8N

    2、Interval Timer Core概览

    该时间计数器是一个为诸如NIOS II等基于Avalon架构的处理器设计的时间计数器。该计数器有如下特点:

    132位和64位计数;

    2)具有计数开始、计数停止、和复位计数器功能;

    3)两种技术模式:单次计数、连续计数;

    4)计数周期寄存器;

    5)当计数器计数到0时,可以选择使能或者禁止触发中断(IRQ);

    6)可选作为看门狗,即当计数器从不达到0,产生系统复位;

    7)可选产生周期脉冲,当计数器计数到0时;

    8)可用于32位或者16位处理器中。如16位的NIOS32位的NIOS II

    3Interval Timer Core功能描述

                     

    3.1 Interval Timer Core包含两个用户可见功能

    1Avalon-MM提供可对616位寄存器操作的功能;

    2)可选周期脉冲输出。

    所有的寄存器都是16位宽度的,因此可适应于16位或者32位处理器。若该核被配置为一个固定的周期,那么,周期寄存器就不存在。

    3.2 Interval Timer Core基本特性

                

    1Avalon-MM主设备(如NIOS II处理器)对控制寄存器(control register)的操作可以达到以下目标:

             a)启动或停止计数器;

             b)使能或禁止中断(IRQ);

             c)设置单次计数模式或连续计数模式。

    2Avalon-MM主设备(如NIOS II处理器)读取状态寄存器(status register)可知晓Interval Timer Core当前的状态。

    3Avalon-MM主设备(如NIOS II处理器)对周期寄存器(period registers)的写操作可以确定/改变计数周期。

    4)不管何时计数器减计数到0时,都会自动从周期寄存器(period registers)装载计数周期。

    5)处理器可以写管理寄存器(snap registers)请求连贯的计数快照,然后读取snap registers可以得到当前计数值

    6)当计数器减计数到0时,会触发以下动作:

             a)如果中断使能,则产生定时器中断(IRQ);

             b)可选脉冲产生输出一个系统时钟周期;

             c)可选看门狗产生系统复位。

    3、SOPC中安装Interval Timer Core

    3.1 计数周期(Timeout Period

    计数周期决定了周期计数器(period registers)的值。当使能可写周期(Writeable period),处理器可以通过写周期计数器(period registers)改变计数器值。或者当禁止可写周期(Writeable period),周期计数器(period registers)不可同过处理器的写操作而改变;此时周期计数器只能是一个不可改变的固定周期计数值。

    Interval Timer Core的计数周期是系统时钟周期的整数倍。实际的时钟周期读者可以这样求。

    1)求出系统的时钟。指驱动Interval Timer Core的时钟。一般与NIOS II时钟一致。

    2)将周期计数器里面高16位和低16位的值乘与时钟时期即得计数周期。

    3.2 计数大小(Counter Size

    该设定决定了计数器的位宽。可以设定为32位或者64位。32位位宽的计数器包含有216位的寄存器;而64位位宽的计数器包含有416位宽的寄存器。该设定同样应用至snap单元。

    3.3 硬件选项

    1Simple periodic interrupt该设定用于只需要一个带有中断(IRQ)的计数器。该方式下,计数周期是固定不可软件更改的,且计数不能停止但中断(IRQ)可禁止。

    2Full-featured该配置适用于一个可被处理器更改,可变计数周期,且其开始、停止均可被更改的计数器。

    3Watchdog适用于系统需要看门狗的情况。当系统停止响应,该配置能使系统复位。

    寄存器(register)设定说明:

    1Writeable period——当选中此项,则主外设(NIOS II)可通过写周期寄存器(period registers)达到修改计数周期的目的。若未选中此项,则计数周期被确定为(Timeout Period),不可更改;同时周期寄存器(period registers)不再存在。

    2Readable snapshot——当选中此项,则主外设(NIOS II)可以读取当前计数值。若未选中此项,则主外设只能依靠查询状态寄存器(status register)或者中断(IRQ)标志来得知计数状态;此时(snap registers)并不存在,读取该寄存器会有不确定的数值。

    3Start/Stop control bits——当选中此项,则主外设(NIOS II)可以通过写控制寄存器(control register)来 启动、停止计数器。若未选中此项,则计数器默认为连续计数模式。值得注意的是,当系统看门狗复位(System reset on timeout (watchdog))是使能状态,则控制寄存器(control register)中的(start)位被置位,而不管Start/Stop 控制位的状态。

    信号输出选项:

    1Timeout pulse (1 clock wide)——当选中该项,则计数器产生一个信号端口(timeout_pulse),该信号端口在计数器减计数至0时产生一个系统时钟周期的高电平。若未选中该项,则计数器不产生该信号端口。

    2System reset on timeout (watchdog)——当选中该项,则计数器产生一个复位信号端口(resetrequest port)该信号在计数器减计数至0时产生一个系统时钟周期的高电平。若未选中该项,则该信号端口不存在。

    3.4 配置计数器为看门狗

    若要使用看门狗,则应作如下选择。

    1presets:选择Watchdog

    2Timeout Period修改成所需要的时间

    3Writeable period禁止;

    4Readable snapshot禁止;

    5Start/Stop control bits禁止;

    6Timeout pulse禁止;

    7System reset on timeout (watchdog)使能。

    复位之后看门狗是禁止的。随后,处理器往控制寄存器(control register)的START位写1,开启看门狗计数。看门狗一旦开启,就不能结束。为了不使系统复位,处理器应该定时地复位计数值。

    4Interval Timer Core软件编写

    4.1 寄存器映射

    32位计数器

                
          64
    位计数器

                          
          状态寄存器(
    status Register Bits

                
          TO——当计数器减计数到0时,置1。一旦置1,则必须由主外设(NIOS II)清0

    RUN——当计数器在计数运行时,RUN=1;否则RUN=0。写RUN对值无影响。

     

    控制寄存器(control register

                
          ITO——当ITO=1时,计数器会产生中断。反之则反。

    CONT——若COUNT=1则计数器计数到0连续计数,知道STOP=1;若COUNT=0则计数器计数到0时,停止计数。

    START——写1START则使计数器开始计数。当计数器正在计数运行,则写START无效。

    STOP——写1STOP则使计数器停止计数。若计数器已经停止计数,则写STOP无效。当SOPC配置为 Start/Stop control bits为关闭,则写STOP无效。

    4.2 中断(IRQ

    当计数器减计数到0时并且控制寄存器(congtrol registerITO位被置1,则可产生定时器中断。处理中断应用一下两种方式之一:

    1)清除状态寄存器(status register)的TO位;

    2)清除控制寄存器(congtrol registerITO位,禁止中断。

    否则会产生不确定结果。

    5、实例程序

          

    /*************************定时器中断注册初始化函数*****************************/
    void InitInterrupt()
    {
        
    //----------------------------定时器中断,系统时钟66.7MHz--------------------------//
        alt_irq_register(TIMER_IRQ,NULL,Timer_interrupts); //注册中断函数
        IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE, 0x000A);
        IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE, 
    0x2C2A);//修改定时时间10ms
        IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 7); //启动定时器允许中断,连续计数
    }

    /*************************定时器中断服务函数*****************************/
    void Timer_interrupts(void* context, alt_u32 id)
    {
        
    /***************************服务代码**************/
        
        
    /**********************退出时清状态寄存器***********/
        IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 
    0); //清状态寄存器     
    }

  • 相关阅读:
    人生几宝
    sleep() 和 wait() 有什么区别?
    abstract class和interface有什么区别?
    谈谈final, finally, finalize的区别
    字符串转码【String.getBytes()和new String()】
    Redis中文API地址
    java之ibatis数据缓存
    ibatis的缓存机制
    mysql|表row_format的静态与动态,Compact
    Tesseract ocr 3.02学习记录一
  • 原文地址:https://www.cnblogs.com/oneseven/p/1544531.html
Copyright © 2011-2022 走看看