注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
07611128的个人空间 https://home.eeworld.com.cn/space-uid-487986.html [收藏] [复制] [分享] [RSS]
日志

DE2-NIOSII--中断

已有 2477 次阅读2014-6-17 09:18 |个人分类:DE2

今天实验了一下NIOSII中中断的问题,在按照特权大大的讲解一直出现警告。于是打开 alt_irq.h,发现在NIOSII中新老版本对中断函数的支持不一样。
在早期版本中,alt_isr_register()函数来注册ISR,在新版本中通过alt_ic_isr_register()来注册,这就造成了新老版本的兼容问题,但是可以通过ALT_ENHANCED_INTERRUPT_API_PRESENT来判断是使用早期的或者新版本注册函数。下面的例子是通过DE2板子上的四个按键中断控制绿灯亮灭,没有具体哪个按键。

#include <stdio.h>
#include <system.h>
#include<unistd.h>
#include "SOPC.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"

int key_flag = 0;
volatile int edge_capture;

void ISR_key(void * context,unsigned long id)
{
key_flag = ~key_flag;
  // 清边沿捕获寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0xf);
}

volatile int edge_capture;

//  初始化button_pio
static void init_button_pio()
{
  // 改写edge_capture指针以匹配alt_irq_register()函数原型
  void* edge_capture_ptr = (void*) &edge_capture;

  // 使能所有4个按钮中断
  IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);

  // 清边沿捕获寄存器
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);

  // 注册ISR
  // Nios II 9.1
  #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
  alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
                      BUTTON_PIO_IRQ,
                      ISR_key,
                      edge_capture_ptr, 0x0);
  // Nios II 9.1之前版本
  #else
  alt_irq_register(BUTTON_PIO_IRQ,
                   edge_capture_ptr,
                   handle_button_interrupts);
  #endif
}

int main()
{

//void* edge_capture_ptr = (void*) &edge_capture;
 // IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0x00);
 // IOWR_ALTERA_AVALON_PIO_DATA(LEDRED,0x0000);
init_button_pio();
  while(1)
 if(key_flag){
 IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0x00);
 }
 else{
 IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0xff);
 }
  return 0;
}

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章