霡霂的个人空间 https://blog.eetop.cn/maimu [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

niosII button 中断

已有 2071 次阅读| 2006-8-16 10:38 |个人分类:备份

天气: 晴朗
心情: 高兴

volatile int edge_capture;

static void handle_button_interrupts(void* context, alt_u32 id)
{
/* Cast context to edge_capture's type.
  * It is important to keep this volatile,
  * to avoid compiler optimization issues.
  */
volatile int* edge_capture_ptr = (volatile int*) context;
/* Store the value in the Button's edge capture register in *context. */
*edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
/* Reset the Button's edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);
}

/* Initialize the button_pio. */

static void init_button_pio()
{
/* Recast the edge_capture pointer to match the alt_irq_register() function
* prototype. */
void* edge_capture_ptr = (void*) &edge_capture;
/* Enable all 4 button interrupts. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
/* Reset the edge capture register. */
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
/* Register the interrupt handler. */
alt_irq_register( BUTTON_PIO_IRQ, edge_capture_ptr, handle_button_interrupts );
}

static void TestButtons( void )
{
alt_u8 buttons_tested;
alt_u8 all_tested;
/* Variable which holds the last value of edge_capture to avoid
  * "double counting" button/switch presses
  */
int last_tested;
/* Initialize the Buttons/Switches (SW0-SW3) */
init_button_pio();
/* Initialize the variables which keep track of which buttons have been tested. */
buttons_tested = 0x0;
all_tested = 0xf;

/* Initialize edge_capture to avoid any "false" triggers from
  * a previous run.
  */
 
edge_capture = 0;

/* Set last_tested to a value that edge_capture can never equal
  * to avoid accidental equalities in the while() loop below.
  */
 
last_tested = 0xffff;

/* Print a quick message stating what is happening */

printf("\nA loop will be run until all buttons/switches have been pressed.\n\n");
printf("\n\tNOTE: Once a button press has been detected, for a particular button,\n\tany further presses will be ignored!\n\n");

/* Loop until all buttons have been pressed.
  * This happens when buttons_tested == all_tested.
  */

while ( buttons_tested != all_tested )
{
  if (last_tested == edge_capture)
  {
    continue;
  }
  else
  {
    last_tested = edge_capture;
    switch (edge_capture)
    {
    case 0x1:
      printf("\nButton 1 (SW0) Pressed.\n");
      buttons_tested = buttons_tested | 0x1;
      break;
    case 0x2:
      printf("\nButton 2 (SW1) Pressed.\n");
      buttons_tested = buttons_tested | 0x2;
      break;
    case 0x4:
      printf("\nButton 3 (SW2) Pressed.\n");
      buttons_tested = buttons_tested | 0x4;
      break;
    case 0x8:
      printf("\nButton 4 (SW3) Pressed.\n");
      buttons_tested = buttons_tested | 0x8;
      break;
    }
  }
}
/* Disable button interrupts for anything outside this loop. */
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0x0);
printf ("\nAll Buttons (SW0-SW3) were pressed, at least, once.\n");
usleep(2000000);
return;
}


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 1

    好友
  • 6

    获赞
  • 45

    评论
  • 3123

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 22:41 , Processed in 0.026551 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部