Nios® V Processor Software Developer Handbook

ID 743810
Date 10/12/2024
Public
Document Table of Contents

9.2.5.1. Writing a Hardware ISR to Service a Button PIO Interrupt

This example is based on a Nios® V processor system with a 4-bit PIO peripheral connected to push buttons. An IRQ is generated any time a button is pushed. The ISR code reads the PIO peripheral’s edge capture register and stores the value to a global variable. The address of the global variable is passed to the ISR in the context pointer.

Writing a Hardware ISR to Service a Button PIO Interrupt

#include "system.h"

#include "altera_avalon_pio_regs.h"

#include "alt_types.h"

static void handle_button_interrupts(void * context) {
  /* Cast context to edge_capture's type. It is important that this
  be declared volatile to avoid unwanted compiler optimization. */
  volatile int * edge_capture_ptr = (volatile int * ) context;

  /* Read the edge capture register on the button PIO. Store value.*/
  * edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);

  /* Write to the edge capture register to reset it. */
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);

  /* Read the PIO to delay ISR exit. This is done to prevent a
  spurious interrupt in systems with high processor -> pio
  latency and fast interrupts. */
  IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
}