在网上看了一下alt_main使用中断需要自己注册,但我注册了程序却任进不了中断程序。
我的程序如下:(sopc builder 中设置:一个input口,边沿中断 either edge ; 一个output口)
............................
#include "system.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "altera_avalon_pio_regs.h"
static void keydown(void* context,alt_u32 id)//中断处理函数
{
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x0);
while(1);
}
int alt_main(void)
{
int led=0;
int i;
alt_irq_init(ALT_IRQ_BASE);//初始化中断
alt_irq_enabled( );//使能中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_KEY_BASE, 0x0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_KEY_BASE, 0x1);//打开中断
alt_irq_register(PIO_KEY_IRQ,0,keydown);//注册中断函数
while(1)
{
led = ~led;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);//led灯闪烁
i = 0;
while(i<200000)
i++;
}
}
中断使能也用过alt_irq_enable_all(PIO_KEY_BASE );
不知为什么始终进不了中断程序(led灯一直在闪烁)~~ 跪求why!
此帖出自
小平头技术问答
static void init_button_pio()
{
void *edge_capture_ptr=(void *)&edge_capture;
/* 初始化LED_PIO为输出,KEY为输入 */
IOWR_ALTERA_AVALON_PIO_DIRECTION(INT_IN_BASE, 0);
/* 开KEY的中断 */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT_IN_BASE, 0x0f);
/* 清边沿捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE, 0);
alt_irq_register(INT_IN_IRQ,edge_capture_ptr,handle_button_interrupt);
}
//中断服务程序
static void handle_button_interrupt(void *context,alt_u32 id)
{
volatile int *edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(INT_IN_BASE,0);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(INT_IN_BASE,0x0f);
}
一周热门 更多>