volatile int edge_capture;
static void handle_button_interrupts(void*context,alt_u32 id)
{
volatile int*edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
}
static void init_button_pio()
{
void*edge_capture_ptr=(void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);
alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);
}
int main(void)
{
while(1)
{
switch(edge_capture)
{case 0x08:
musicplay();
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;
}
}
}
其中musicplay()是一个音乐不断播放的循环函数,为什么当我按了key2(即0x04)时,不会执行IOWR(SEG7_DISPLAY_BASE,0,0X00001234),是不是musicplay()是一个循环函数,程序跳不出来了?可是按键中断应该可以跳到相应的中断服务啊?不懂啊,谁帮帮我啊?
还是找不出来啊,楼主能不能说得清楚点啊?
问题在哪啊?
拜托了啊,万分感激!!!
楼主,你的终端初始化程序在主程序中并没有被调用,你的main就是那点内容吗?
哦,写错了,主程序还有按键的初始化
int main(void)
{
init_button_pio();
while(1)
{
switch(edge_capture)
{case 0x08:
musicplay();
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;
}
}
}
其实我的想法是每一个按钮控制不同的播放功能,但现在的问题是按键中断不起作用。
我试过了,如果把musicplay()换成IOWR(SEG7_DISPLAY_BASE,0,0X00005678);
那按KEY3(0X08),KEY2(0X04)就会显示相应的程序。但是如果我用了musicplay()后,
我按了KEY3(0X08),可以音乐播放,但再按KEY2,数码管就不能显示1234了,为什么啊?
版主多多指点啊!真是谢谢了呀
[em09][em09]
耐心点呐,慢慢来
[此贴子已经被作者于2008-5-28 10:04:49编辑过]
可是时间不多了啊,还要写文章,高手知道的话,多多指点啊
先谢了啊
我做了niosii中自带的count_binary的例子,就是PIO的控制,但是好像也还是按键中断不能执行,是不是跟cpu的reset address和exception address有关啊,这个count_binary的program memory,read_only data memory,rwdata,heap,stack都是在sdram里的,那cpu的reset 和exception的地址应该是哪里啊?如果不是这个问题,那是什么问题
哪位高手知道,请速告知!万分火急!
小妹在这里先谢过大家了,请高手多多指点
volatile int edge_capture;
static void handle_button_interrupts(void*context,alt_u32 id)
{
volatile int*edge_capture_ptr=(volatile int*)context;
*edge_capture_ptr=IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
}
static void init_button_pio()
{
void*edge_capture_ptr=(void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0x0);
alt_irq_register(BUTTON_PIO_IRQ,edge_capture_ptr,handle_button_interrupts);
}
int main(void)
{
while(1)
{
init_button_pio();
switch(edge_capture)
{case 0x08:
while(1) {IOWR(SEG7_DISPLAY_BASE,0,0x12345678);}
break;
case 0x04:
IOWR(SEG7_DISPLAY_BASE,0,0X00001234);
break;
}
}
}
我只想用这个例子来验证按键中断,为什么当中断程序里有一个while(1)的循环,中断就跳不出来了呢?难道DE2板上的按键中断就只有这样?
还有就是一旦我在SOPC builder中改变原来中断的IRQ(原来的IRQ只是自动排列而已)时,程序就不能显示先前的效果了,为什么?我不明白
请各位高手多多帮忙啊,因为交稿时期快到了
如果按键中断没搞定,我先前做的很多东西都白做了,希望各位高手帮忙一下
[此贴子已经被作者于2008-6-1 9:57:57编辑过]
1\首先确定按键中断是否已经注册
2\每句case后面加一句子:edge_capture = 0x00;
[em01][em01][em01]欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |