#include <system.h>
#include <sys/alt_irq.h>
#include <stdio.h>
#include <unistd.h>
#include <altera_avalon_pio_regs.h>
#ifndef SOPC_H_
#define SOPC_H_
#define _LED
#define _KEY
typedef struct
{
unsigned long int DATA;
unsigned long int DIRECTION;
unsigned long int INTERRUPT_MASK;
unsigned long int EDGE_CAPTURE;
}PIO_STR;
#ifdef _LED
#define LED ((PIO_STR *)PIO_LED_BASE)
#endif
#ifdef _KEY
#define KEY ((PIO_STR *)KEY_BASE)
#endif
#endif /*SOPC_H_*/
unsigned char key_flag=1;
void ISR_key(void *context,unsigned long id)
{
usleep(300000);
key_flag=!key_flag;
printf("ISR_key Launch\n");
usleep(300000);
}
int init_key(void)
{
KEY->INTERRUPT_MASK=1;
KEY->EDGE_CAPTURE=0;
return alt_irq_register(KEY_IRQ,NULL,ISR_key);
}
int main()
{
if(!init_key())
{
printf("Register KEY Interrupt Successfully!\n");
}
else
{
printf("Register KEY Interrupt Failed!\n");
}
while(1)
{
if(key_flag)
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,1); //黑金教程里用的是直接写寄存器的
//方式,这里用的是API
usleep(300000); //要使用这个延时函数,要包含 unistd.h
}
else
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE,0);
usleep(300000);
}
}
return 0;
}
由于是电平中断实验,所以,看到上面十一行 ISR_key Launch么,这是我只按了一次按键的结果,抖动不是一般的严重,相对一开始按一次按键触发几十次中断的要好一点。刚开始没有实验效果,不管你按多少次按键,LED就是不亮,后来在多处加入了延时后按键中断变得相对正常了,阿门,,,,,一个中断实验要花我一天时间,实在愚钝,只是将这些实验感受写出来,希望能帮助到在做这个实验遇到问题的同学。
用的是ALTERA DE2开发板(话说这块板挺不错的,资源很全。。。),IP核的定制大家根据自己的开发板实际情况来做~
//
好吧,又到贴代码时间,代码是根据黑金开发板的配套教程里的代码修改而来,并非原创,但加入了一些printf()语句,能在run as Nios Hardware时在CONSOLE里清楚地看到一次按键会触发多少次中断~大家可以根据自己的实际情况将延时改一下,相信会得到你想要的实验结果的。
///