
DE1-S
O
C C
OMPUTER
S
YSTEM WITH
N
IOS
II
For Quartus II 15.0
#
include
"nios2_ctrl_reg_macros.h"
#
include
"key_codes.h"
// defines values for KEY0, KEY1,
. . .
/* key_pressed and pattern are written by interrupt service routines; we have to declare
* these as volatile to avoid the compiler caching their values in registers */
volatile int
key_pressed = KEY2;
// shows which key was last pressed
volatile int
pattern = 0x0000000F;
// pattern for HEX displays
volatile int
shift_dir = LEFT;
// direction to shift the pattern
/********************************************************************************
* This program demonstrates use of interrupts in the DE1-SoC Computer. It first starts the
* interval timer with 33 msec timeouts, and then enables interrupts from the interval timer
* and pushbutton KEYs
*
* The interrupt service routine for the Altera interval timer displays a pattern on the HEX3-0
* displays, and rotates this pattern either left or right:
*
KEY[0]: loads a new pattern from the SW switches
*
KEY[1]: rotates the displayed pattern to the right
*
KEY[2]: rotates the displayed pattern to the left
*
KEY[3]: stops the rotation
********************************************************************************/
int
main(
void
)
{
/* Declare volatile pointers to I/O registers (volatile means that IO load and store instructions
* will be used to access these pointer locations instead of regular memory loads and stores) */
volatile int
* interval_timer_ptr = (
int
*) 0xFF202000;
// interval timer base address
volatile int
* KEY_ptr = (
int
*) 0xFF200050;
// pushbutton KEY address
/* set the interval timer period for scrolling the HEX displays */
int
counter = 5000000;
// 1/(100 MHz)
×
(5000000) = 50 msec
*(interval_tim 0x2) = (counter & 0xFFFF);
*(interval_tim 0x3) = (counter
>>
16) & 0xFFFF;
/* start interval timer, enable its interrupts */
*(interval_tim 1) = 0x7;
// STOP = 0, START = 1, CONT = 1, ITO = 1
*(K 2) = 0xF;
/* write to the pushbutton interrupt mask register, and
* set mask bits to 1 */
NIOS2_WRITE_IENABLE( 0x3 );
/* set interrupt mask bits for levels 0 (interval timer)
* and level 1 (pushbuttons) */
NIOS2_WRITE_STATUS( 1 );
// enable Nios II interrupts
while
(1);
// main program simply idles
}
Figure 20. An example of C code that uses interrupts.
24
Altera Corporation - University Program
2015