文章摘要:
本文描述了基于NIOS II系统的按键中断处理;


硬件平台:EP4CE6F17C8
开发环境:Quartus II 13.1/Nios II 13.1


配置Qsys添加PIO模块

重新编译并下载


重新生成BSP


新建Nios项目工程


示例代码:

/*
 *  main.c
 *  Created on: 2017-4-18
 *  Author: alex
 */
#include "system.h"
#include "sys/alt_irq.h"

// 定义寄存器,采用比较通用的寄存器定义方法来实现读写访问
#define rLEDS_PORT        *((volatile int *)(PIO_LEDS_BASE + (0 << 2)))
#define rKEYS_IRQ_MASK    *((volatile int *)(PIO_KEYS_BASE + (2 << 2)))
#define rKEYS_EDGE_CAP    *((volatile int *)(PIO_KEYS_BASE + (3 << 2)))

char val = 0x00;

// 中断服务函数
void isr_keys(void* context)
{
    rKEYS_EDGE_CAP = 0; // 清除中断
    val = val + 1;
}

// 主函数入口
int main(void)
{
    // 注册中断
    alt_ic_isr_register(
            PIO_KEYS_IRQ_INTERRUPT_CONTROLLER_ID,
            PIO_KEYS_IRQ,    // 中断向量
            isr_keys,        // 中断服务函数
            0,               // 中断服务函数参数
            0);              // flag

    rKEYS_IRQ_MASK = 0x03;   // 中断屏蔽(使能)
    rKEYS_EDGE_CAP = 0;      // 清队中断标识位

    while(1)
    {
        rLEDS_PORT = val;
    }

    return 0;
}