MyFPGA Forum

标题: PIO中断的一个问题 [打印本页]

作者: yqzhang    时间: 2010-5-19 20:40
标题: PIO中断的一个问题
#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);"就会产生两次中断,不调则是一次中断,这是为什么?
作者: Steady_Chou    时间: 2010-5-20 10:08
你是说把IOWR(BUTTON_BASE,3,0x00);//reset the button's edge capture register
放到usleep(1000);下面一行就会产生两次中断吗??
作者: Frank    时间: 2010-5-20 10:23
回复 1# yqzhang


  如果button没有去抖的话,把IOWR(BUTTON_BASE,3,0x00);放到usleep(1000);下面一行就会产生两次中断。
作者: yqzhang    时间: 2010-5-20 10:25
标题: 补充说明
本帖最后由 yqzhang 于 2010-5-20 10:28 编辑

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

这样就会产生两次中断




欢迎光临 MyFPGA Forum (http://www.myfpga.org/discuz/) Powered by Discuz! X3