搜索
bottom↓
回复: 8

NIOS上按键中断的问题

[复制链接]

出0入0汤圆

发表于 2010-3-25 13:23:39 | 显示全部楼层 |阅读模式
我用的是艾米的板子,总是硬件用别的程序试过,没有问题
做按键中断的时候总是不能中断
当用DEBUG单步时
出现以下情况

IO初始化的程序,问题可能就在这里 (原文件名:1.jpg)


单步跳入alt_irq_register,这是最后一步,再单步一下就出错了 (原文件名:2.jpg)


出错如下所示 (原文件名:3.jpg)

我用的版本是7.2  XP
源程序在二楼~

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 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_u32  done = 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为输入,开中断,清边沿捕获寄存器

* 入口参数:无

* 出口参数:无

********************************************************************/

void  InitPIO(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。

********************************************************************/

int  main(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);

}

出0入0汤圆

发表于 2010-3-25 13:39:54 | 显示全部楼层

(原文件名:KEY_PIO.png)


这里设置没有?

出0入0汤圆

 楼主| 发表于 2010-3-25 20:17:07 | 显示全部楼层
哇哦~~可以了


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

出0入0汤圆

发表于 2010-3-25 20:46:41 | 显示全部楼层
常态不按,是1
非常态按下,是0
所以要检测下降沿呀。

出0入0汤圆

 楼主| 发表于 2010-3-25 21:51:34 | 显示全部楼层
跟那有什么关系
either edge 就是2个沿都可以检测了
问题不在这   问题在ENABLE BIT-clearing上了‘
我把这个勾掉 就可以了

出0入0汤圆

发表于 2010-3-26 07:42:07 | 显示全部楼层
回复【5楼】gongziwuyou  
-----------------------------------------------------------------------

呵呵,maybe。

出0入0汤圆

发表于 2010-3-26 12:01:56 | 显示全部楼层
我的按键中断非得用EITHER EDGE才可以,每次改成FALLING EDGE就是不行= =

出25入84汤圆

发表于 2011-7-28 10:53:15 | 显示全部楼层
mark,我的是连续的发送1或者0 貌似没有去抖?请问怎样祛痘呢 ?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表