NIOS簡單程序之按鍵控制LED

  本身經過學習NIOS,主要學習NIOS中PIO控制,主要實現一個按鍵控制LED燈亮和滅,按鍵控制部分採用中斷方式,由於只是簡單學習PIO控制,因此按鍵部分沒有作相關消抖處理,實際中按鍵控制沒那麼完美,還需完善。 編程

      下面先講述步驟,先在Quartus中新建一個Qsys文件,在文件中添加以下對應模塊(圖中注意要將NIOS processor的jtag_debug_module_reset這個復位信號鏈接到RAM和epcs的reset信號上,不然會在燒寫epcs時候出問題):學習

    

     其中,要注意的選項是對應將epcs的基地址設置爲0x00,而且鎖定。在鏈接好後,Generate,等success後,進入到NIOS編程了,至於如何創建NIOS工程,這裏就不說了,下面是個人NIOS程序:debug

#include <system.h>
#include <altera_avalon_pio_regs.h>
#include <alt_types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/alt_irq.h>
#include <io.h>3d

void delay(void);調試

alt_u8 SW_value;blog

static void handle_sw_interrupts(void)
{
 SW_value = IORD_ALTERA_AVALON_PIO_DATA(SW_PIO_BASE);
 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);
}avalon

//初始化 SW_PIO
void init_SW(void)
{
 SW_value = 0xff;
 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_PIO_BASE,0xff);      //使能PIO中斷
 IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);  //對EDGE_REGISTER清零
 alt_irq_register(SW_PIO_IRQ,SW_PIO_BASE,handle_sw_interrupts);
}it

int main()
{
  alt_u8 timer = 0x00;
  init_SW();io

  while(1)
  {
   if((SW_value&0x0F) == 0x0E)
   {
    printf("hello,LED0! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfE);
    delay();
    timer++;
   }
   else if((SW_value&0x0F) == 0x0D)
   {
    printf("hello,LED1! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfd);
    delay();
    timer++;
   }
   else if((SW_value&0x0F) == 0x0B)
   {
    printf("hello,LED2! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfB);
    delay();
    timer++;
   }
   else if((SW_value&0x0f) == 0x07)
   {
    printf("hello,LED3! %d\n",timer);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xf7);
    delay();
    timer++;
   }
   else if(SW_value==0xff)
   {
    IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfF);
   }
  }
  return 0;
}module

void delay(void)
{
 alt_u32 i=0;
 while(i<400000)
  i++;
}

在練習NIOS中(採用Quartus II  13.0版本),碰到一個問題:在用NIOS中,若是採用調試模式,燒寫sof和elf文件分開燒寫發現是能夠的,可是採用NIOS Flash Programmer燒寫就發現問題,(在燒寫前先要下載sof文件進去,而後點開NIOS Flash Programmer,在界面下點擊new file界面燒寫,添加sof和elf文件進去)沒法燒寫成功。錯誤以下:

後來將sys_id去除,問題解決,因此這裏就奇怪,Altera官方是推薦用sys_id的,但是sys_id又影響NIOS下載,這裏不瞭解,還望有人幫我解釋下。

相關文章
相關標籤/搜索