NIOS上按键中断的问题
我用的是艾米的板子,总是硬件用别的程序试过,没有问题做按键中断的时候总是不能中断
当用DEBUG单步时
出现以下情况
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_540927.jpg
IO初始化的程序,问题可能就在这里 (原文件名:1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_540928.jpg
单步跳入alt_irq_register,这是最后一步,再单步一下就出错了 (原文件名:2.jpg)
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_540929.jpg
出错如下所示 (原文件名:3.jpg)
我用的版本是7.2XP
源程序在二楼~ 回复【楼主位】gongziwuyou
-----------------------------------------------------------------------
#include<stdio.h>
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
#include"priv/alt_busy_sleep.h"
volatile alt_u32done = 0; // 信号量:通知外部中断事件发生
/********************************************************************
* 名 称:KeyDown_interrupts()
* 功 能:键按下事件中断服务子程序,当键按下时,通过done标志
* 告知外界
* 入口参数:context,一般用于传递中断状态寄存器的值,这里未使用
* id,中断号,这里未使用
* 出口参数:无
********************************************************************/
static void KeyDown_interrupts(void* context, alt_u32 id)
{
/* 清中断捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);
/* 通知外部有中断事件发生 */
done++;
}
/********************************************************************
* 名 称:InitPIO()
* 功 能:初始化LED_PIO为输出,KEY为输入,开中断,清边沿捕获寄存器
* 入口参数:无
* 出口参数:无
********************************************************************/
voidInitPIO(void)
{
/* 初始化LED_PIO为输出,KEY为输入 */
IOWR_ALTERA_AVALON_PIO_DIRECTION(LED_PIO_BASE, 0xFF);
IOWR_ALTERA_AVALON_PIO_DIRECTION(BUTTON_PIO_BASE, 0x00);
/* 开KEY的中断 */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xFF);
/* 清边沿捕获寄存器 */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x00);
/* 注册中断服务子程序 */
alt_irq_register(BUTTON_PIO_IRQ, NULL, KeyDown_interrupts);
}
/********************************************************************
* 名 称:main()
* 功 能:等待按键中断,并输出控制相应的LED。
********************************************************************/
intmain(void)
{
volatile alt_u32 key_state,old_state,new_state;
old_state = 0xff;
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, old_state);//初始化LED全灭
InitPIO();
while(1)
{
if(0 != done)
{
/* 中断事件数量减1 */
done--;
alt_busy_sleep(5000);//延时5ms
key_state = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE)&0xFF;
if(key_state == 0xff) //如果是由短暂脉冲引起的中断则忽略
continue;
new_state = ~(old_state ^ key_state); // 按键按下时对应的LED取反
old_state = new_state; // 保存LED的状态
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, new_state);
}
}
return(0);
} http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_540930.png
(原文件名:KEY_PIO.png)
这里设置没有? 哇哦~~可以了
我一开始选的either edge为什么不行呢?? 常态不按,是1
非常态按下,是0
所以要检测下降沿呀。 跟那有什么关系
either edge 就是2个沿都可以检测了
问题不在这 问题在ENABLE BIT-clearing上了‘
我把这个勾掉 就可以了 回复【5楼】gongziwuyou
-----------------------------------------------------------------------
呵呵,maybe。 我的按键中断非得用EITHER EDGE才可以,每次改成FALLING EDGE就是不行= = mark,我的是连续的发送1或者0 貌似没有去抖?请问怎样祛痘呢 ?
页:
[1]