首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[NiosII] 定时器中断

[NiosII] 定时器中断

首先在NoisII里面添加一个Full-featured的Timer

然后在EDS里面使用下面已经调试成功的代码

#include    //用到printf()函数
#include "altera_avalon_pio_regs.h"   //读写IO寄存器相关函数
#include "sys/alt_irq.h"  //NoisII中断处理相关函数,这里遵循增强型中断风格以向后兼容
#include "altera_avalon_timer_regs.h" //读写定时器寄存器相关函数



void Timer1_Init(void); //定时器中断初始化函数申明

void Timer1_ISR(void* isr_context);//定时器中断服务函数申明
//参考"sys/alt_irq.h"定义的函数原型
/* ISR Prototype */
//#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
//typedef void (*alt_isr_func)(void* isr_context);
//#else
//typedef void (*alt_isr_func)(void* isr_context, alt_u32 id);
//#endif


int Flags = 0;
unsigned int timer_isr_context;


int main()
{


Timer1_Init();


printf("Timer1 Init done...\n");


while(1)

{

IOWR_ALTERA_AVALON_PIO_DATA(LEDEDGE_BASE,Flags%2);

}


return 0;

}


void Timer1_Init(void)
{

void* isr_context_ptr = (void*)&timer_isr_context;


IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER1_BASE,0x05F5);

IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER1_BASE,0xE0FF);
  // 设置PERIOD寄存器
  // PERIODH << 16 | PERIODL = Timer周期 * 系统时钟频率 - 1
  // PERIODH << 16 | PERIODL = 1s*100M - 1 = 99999999 = 0x5F5E0FF



IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER1_BASE,

ALTERA_AVALON_TIMER_CONTROL_START_MSK|

ALTERA_AVALON_TIMER_CONTROL_CONT_MSK|

ALTERA_AVALON_TIMER_CONTROL_ITO_MSK);
  // 设置CONTROL寄存器
  //    位数 |  3   |  2   |  1   |  0  |
  // CONTROL | STOP | START| CONT | ITO |
  // ITO   1,产生IRO;                      0,不产生IRQ
  // CONT  1,计数器连续运行直到STOP被置一;   0,计数到0停止
  // START 1,计数器开始运行;                0,无影响
  // STOP  1,计数器停止运行;                0,无影响


  // 注册定时器中断

alt_ic_isr_register(

  TIMER1_IRQ_INTERRUPT_CONTROLLER_ID, // 中断控制器标号,从system.h复制

  TIMER1_IRQ,           // 硬件中断号,从system.h复制

          Timer1_ISR,             // 中断服务子函数

          isr_context_ptr,       // 指向与设备驱动实例相关的数据结构体

           0x0);                       // flags,保留未用
}

void Timer1_ISR(void* timer_isr_context)
{
       // 应答中断,将STATUS寄存器清零

IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER1_BASE,

~ALTERA_AVALON_TIMER_STATUS_TO_MSK);  //TO=0


Flags += 1;
}
返回列表