MyFPGA Forum

 找回密码
 注册
搜索
查看: 4205|回复: 3
打印 上一主题 下一主题

PIO中断的一个问题

[复制链接]
跳转到指定楼层
1#
发表于 2010-5-19 20:40:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include "io.h"
#include  "sys/alt_irq.h"
#include "system.h"

#define  SHOW_SEG(DATA) IOWR(SEG_BASE,0,DATA);
static alt_u8 value = 0;
void handle_button_interrupts(void *content,alt_u32 id)
{
    if( value == 10)
       value = 0;
      
   usleep(1000);
   
    switch(value)
    {
        case 0:SHOW_SEG(0x40);break;
        case 1:SHOW_SEG(0x79);break;
        case 2:SHOW_SEG(0x24);break;
        case 3:SHOW_SEG(0x30);break;
        case 4:SHOW_SEG(0x19);break;
        case 5:SHOW_SEG(0x12);break;
        case 6:SHOW_SEG(0x03);break;
        case 7:SHOW_SEG(0x78);break;
        case 8:SHOW_SEG(0x00);break;
        case 9:SHOW_SEG(0x10);break;
        default:SHOW_SEG(0x40);break;
    }
    value ++ ;
    IOWR(BUTTON_BASE,3,0x00);//reset the button's edge capture register
   
}
void init_button_pio()
{
    SHOW_SEG(0x10);
    //enable button interrupt
    IOWR(BUTTON_BASE,2,0x01);
    //Reset the edge capture register
    IOWR(BUTTON_BASE,3,0x00);
    //register the interrupt handler
    alt_irq_register(BUTTON_IRQ,NULL,handle_button_interrupts);
   
}
int main()
{
  init_button_pio();
  return 0;
}

在这段code中,如果把"IOWR(BUTTON_BASE,3,0x00);//reset the button's edge capture register",调到"usleep(1000);"就会产生两次中断,不调则是一次中断,这是为什么?
2#
发表于 2010-5-20 10:08:56 | 只看该作者
你是说把IOWR(BUTTON_BASE,3,0x00);//reset the button's edge capture register
放到usleep(1000);下面一行就会产生两次中断吗??
3#
发表于 2010-5-20 10:23:27 | 只看该作者
回复 1# yqzhang


  如果button没有去抖的话,把IOWR(BUTTON_BASE,3,0x00);放到usleep(1000);下面一行就会产生两次中断。
4#
 楼主| 发表于 2010-5-20 10:25:34 | 只看该作者

补充说明

本帖最后由 yqzhang 于 2010-5-20 10:28 编辑

上面的代码是只产生一次中断.
产生两次中断的操作是: 把"IOWR(BUTTON_BASE,3,0x00);"  放到 "usleep(1000)"上面,即
IOWR(BUTTON_BASE,3,0x00);
usleep(1000);

这样就会产生两次中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-5-3 01:51 , Processed in 0.039369 second(s), 15 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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