SOPC第四课 按键中断
按鍵
LED控制
開發板 小梅哥AC620
軟件 quartus 13.1
2個按鍵,當按鍵0按下時,LED燈開始閃爍;當按鍵1按下時,LED燈停止閃爍。
使用一個PIO 這個PIO設置為6位(4個LED+2個按鍵)
PIO設置為bidir型 位寬為6位
能夠捕獲邊沿下降沿
能夠產生中斷、邊沿中斷
要求使能單獨位的設置和清零
使能邊沿捕獲寄存器的單獨位清零
頂層代碼PL部分
module nios_pio_led(clk,rst_n,key,key_gnd,led );input clk;input rst_n;output key_gnd;inout [1:0]key;inout [3:0]led;assign key_gnd = 0;mysystem u0 (.clk_clk (clk), // clk.clk.reset_reset_n (rst_n), // reset.reset_n.pio_led_export ({key,led}) // pio_led.export);endmodulePS部分
#include "stdio.h" #include "system.h" #include "alt_types.h" #include "altera_avalon_pio_regs.h" #include "sys/alt_irq.h"alt_u8 led_enable=0; alt_u32 i,data;alt_isr_func isr(void)//中斷服務函數 {IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x00); //關閉按鍵中斷data=IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE);if(data&0x20) //這樣寫的原因是無法確定低4位的值led_enable=0;else if(data&0x10) //停止按鍵按下led_enable=1;else{led_enable=0;}IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE,0X30);//清除邊緣捕獲寄存器IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE,0X30);//開中斷return 0; } int main(void) {char *p;IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_LED_BASE, 0x0f); //設置低4位為輸出,高2位為輸入alt_ic_isr_register( PIO_LED_IRQ_INTERRUPT_CONTROLLER_ID, PIO_LED_IRQ, isr, p, 0);//注冊中斷函數IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_LED_BASE, 0x30); //清零所有的捕獲位IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_LED_BASE, 0x30); //打開按鍵中斷while(1){if(led_enable==1){while(i<=500000){i++;}IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(PIO_LED_BASE,0x8);//低電平,LED4小燈點亮,i=0;while(i<=500000){i++;}i=0;IOWR_ALTERA_AVALON_PIO_SET_BITS(PIO_LED_BASE,0x8);//第3位置位,高電平,LED4小燈熄滅}else if(led_enable==0){IOWR_ALTERA_AVALON_PIO_SET_BITS(PIO_LED_BASE,0xF);//第3位置位,高電平,LED4小燈熄滅}}return 0; }實驗效果
- 矩陣鍵盤說明
矩陣鍵盤有兩組,共有8跟信號線,其中COL每一列的四個按鍵的一端連接起來,而ROW則將每一行的4個按鍵的一端連接起來,通過4行4列的8根信號線,總共能夠管理16個按鍵。用4個IO得到了16個按鍵。
可看出,我們把COL0接地,按鍵按下為0,不按為1.(后續再繼續學習如何學習電路原理圖)
中斷的頭文件,在sys路徑下面
劃線定義i,要注意了,我們下面是500000,大于了u8類型,所以這也是個坑,一定要注意自己定義的數是否夠用。
定義方向,這也很是個坑,我原先就沒有找出是什么原因導致錯誤,后來弄了半天才想到,inout的方向沒有設置,默認是輸出的。
然后注冊中斷函數,每一個元素前面,不用再次聲明數據類型
這里消耗時間是while,不是if判斷,if是并行的選擇,不是順序
以上分別是全速運行、step into step over step return
并且可以看到變量
還可以設置斷點。
另外如果出錯,記得,在run configure 里面重新refresh 一下blaster
總結
以上是生活随笔為你收集整理的SOPC第四课 按键中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GVIM的使用(动图指导,全网首发)
- 下一篇: FPGA实现序列检测(训练testben