gongziwuyou 发表于 2010-3-25 13:23:39

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 发表于 2010-3-25 13:23:54

回复【楼主位】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);

}

tear086 发表于 2010-3-25 13:39:54

http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_540930.png
(原文件名:KEY_PIO.png)


这里设置没有?

gongziwuyou 发表于 2010-3-25 20:17:07

哇哦~~可以了


我一开始选的either edge为什么不行呢??

tear086 发表于 2010-3-25 20:46:41

常态不按,是1
非常态按下,是0
所以要检测下降沿呀。

gongziwuyou 发表于 2010-3-25 21:51:34

跟那有什么关系
either edge 就是2个沿都可以检测了
问题不在这   问题在ENABLE BIT-clearing上了‘
我把这个勾掉 就可以了

tear086 发表于 2010-3-26 07:42:07

回复【5楼】gongziwuyou
-----------------------------------------------------------------------

呵呵,maybe。

linkin8834 发表于 2010-3-26 12:01:56

我的按键中断非得用EITHER EDGE才可以,每次改成FALLING EDGE就是不行= =

chun2495 发表于 2011-7-28 10:53:15

mark,我的是连续的发送1或者0 貌似没有去抖?请问怎样祛痘呢 ?
页: [1]
查看完整版本: NIOS上按键中断的问题