• (原创)NIOS中断编程


    1、注册中断处理程序

    在sys/alt_irq.h文件中,注册中断使用的函数是

    extern int alt_irq_register (alt_u32 id, 
                                 void*   context, 
                                 void (*irq_handler)(void*, alt_u32));
    
    


    id 是IRQ的编号,system.h 会自动生成
    context是上下文,还不知道有什么用
    void (*irq_handler)(void*, alt_u32) 是中断函数,中断函数的定义需要完全依照void * ,alt_32) 方式来定义

    2、编写中断函数

    比如使用的PIO_BUTTON 中断,则可编写中断服务函数如下

    //中断服务子程序
    static void keydown_interrupts(void* context, int id)
      {
        char c;
        c=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE);
        IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0);
        IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,c);
        
        IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[(alt_u8)c]^0xff);
        printf("按键中断产生:%d\n",c);   
      }
    

    main文件如下

    /*
     * 增加系统的ID识别 2010年11月28日16:46:09 超群天晴 
     * 
    */
    #include <stdio.h>
    #include <string.h>
    #include "sys/alt_stdio.h"
    #include "alt_types.h"
    #include "system.h"
    #include "altera_avalon_pio_regs.h"
    #include "sys/alt_irq.h"
    
    #define int1 1
    
    //数码管译码
    alt_u8 Seg_Value[16]=
        {
            63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113
        };
    
    void Delay(int delay)
    {
        while(delay--);
    }
    
    //中断服务子程序
    static void keydown_interrupts(void* context, int id)
      {
        char c;
        c=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE);
        IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0);
        IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,c);
        
        IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[(alt_u8)c]^0xff);
        printf("按键中断产生:%d\n",c);   
      }
    //中断初始化
    void init_pio(void)
      {
        //初始化输入,输出('1'out,'0'in)
        //IOWR_ALTERA_AVALON_PIO_DIRECTION(HEX0_D_BASE,0xff);
        //IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_BUTTON_BASE,0x00);
        
        //打开中断('1'中断使能)
        IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BUTTON_BASE,0xff);
        //清边沿捕捉寄存器
        IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUTTON_BASE,0x00);
        //注册中断服务程序
        alt_irq_register(PIO_BUTTON_IRQ,NULL,keydown_interrupts);
      }
    
    int main()
    { 
        #ifdef int1
        alt_putstr("Nios II 按键中断测试! 超群天晴 2010年11月28日21:15:08\n");
        IOWR_ALTERA_AVALON_PIO_DATA(HEX0_DP_BASE,1);//果然是共阳的! 2010年11月16日22:40:08 超群天晴    
      init_pio(); while(1); #endif #ifdef seg //按键显示数 //alt_u8 Led = 0x01; //alt_u8 Key_Value; alt_u32 i= 100000; alt_u8 status = 0; alt_putstr("seg2 TEST from Nios II!\n"); IOWR_ALTERA_AVALON_PIO_DATA(HEX0_DP_BASE,1);//果然是共阳的! 2010年11月16日22:40:08 超群天晴
    while (1) { //Key_Value=IORD_ALTERA_AVALON_PIO_DATA(SW_BASE);//读取地址值 IOWR_ALTERA_AVALON_PIO_DATA(HEX0_D_BASE,Seg_Value[status]^0xff); status++; if(status==16) status=0; //Delay i=500000; while(i--); } #endif return 0; }

    2010年11月28日21:31:38,测试通过

  • 相关阅读:
    第01组 Alpha冲刺 (1/6)
    第01组(17) 需求分析报告
    第01组(17) 团队展示
    结对编程作业
    05 RDD编程
    第九次作业
    HDFS
    Hadoop安装 与 HDFS体系结构
    第三次作业
    作业2
  • 原文地址:https://www.cnblogs.com/surpassal/p/1890507.html
Copyright © 2020-2023  润新知