01、ARM中斷體系
① ARM體系中,在存儲地址的低位,固化了一個32字節(jié)的硬件中斷向量表。
② 異常中斷發(fā)生時,程序計數(shù)器PC所指的位置不同,異常中斷就不同。中斷結(jié)束后,中斷不同,返回地址也不同。但是,對于系統(tǒng)復(fù)位中斷,不需要返回,因為整個應(yīng)用系統(tǒng)就是從復(fù)位中斷中開始的。
數(shù)據(jù)訪問終止:數(shù)據(jù)訪問的地址不存在,或者當(dāng)前地址不允許訪問。
快速中斷請求:外部引腳的快速中斷請求,比外部中斷請求等級高,但是一般外設(shè)的中斷請求使用外部中斷請求。
指令預(yù)取終止:預(yù)取指令的地址不存在,或者當(dāng)前地址不允許訪問。
未定義的指令:ARM或協(xié)處理器認(rèn)為當(dāng)前指令未定義。
ARM中斷流程:
首先在主程序中發(fā)生IRQ中斷請求,程序跳到中斷向量表找IRQ中斷對應(yīng)的解析程序地址,然后再跳到中斷解析程序,進(jìn)而執(zhí)行中斷程序。
02、ZYNQ中斷體系
ZYNQ包括三種中斷:私有中斷,軟件中斷和共享中斷。
1)私有中斷:每個CPU連接5個私有中斷,中斷ID27—31。
2)軟件中斷:16個,中斷號:0—15。通過CPU私有總線向ICDSGIR寄存器寫中斷號,并且制定CPU。
3)共享中斷:接收來自如GPIO、DMA、定時器等模塊的中斷信號。中斷號32-95。
它們之間的關(guān)系:
03、PL端的一個按鍵,點亮PS端LED。
首先還是硬件配置,加入ZYNQ的軟核,配置一下DDR和UART。
然后,因為要用到PL端的按鍵,所以要建立PL與PS之間的聯(lián)系,通過EMIO或者AXI總線,EMIO能不能中斷還沒有研究,這里用的AXI。
① 加AXI_GPIO IP核,設(shè)置GPIO端口中斷使能,GPIO寬度為1(只用了一個按鍵),設(shè)置方向為全輸入。
(如果想控制PL端LED,就再加一個AXI_GPIO核),設(shè)置輸出就可以了。
② 打開中斷
IRQ_F2P是PL與PS的共享中斷,下面的是兩個ARM核的快速中斷和外部中斷(都來自PL屬于CPU私有中斷),私有中斷如何點亮LED還沒有測試。
③ PS端LED,設(shè)置I/O外設(shè),GPIO里勾選MIO,點亮的LED管腳為MIO0。
然后自動連接,(手動連接AXI_GPIO ip2intc_irpt),綁定gpio_rtl的管腳為T17(按鍵),3.3V,然后輸出,生成HDL Wrapper,導(dǎo)出硬件(包含比特流文件),載入SDK。
04、各種初始化:
① 初始化按鍵:
設(shè)置單通道,方向為輸入。
② 初始化LED:
設(shè)置MIO0為輸出,使能引腳(不使能不能點亮,與AXI接PL端LED有點區(qū)別,后者不需要使能)。然后引腳寫高電平,使LED初始狀態(tài)為滅。
③ 初始化中斷:
中斷初始化寫成一個函數(shù),傳入參數(shù)是中斷的ID,另外以上各種初始化,需要實例化XGpio、XGpioPs、XScuGic類型的變量,直接定義為全局變量,這樣會比較方便。
④中斷函數(shù):
A. 函數(shù)首先是中斷初始化,與先前的按鍵初始化與LED初始化差不多。
B. 接著是定義了一個InterruptSystemSetup函數(shù),定義為:
C.連接,我理解的就是,將這個中斷與按鍵的行為,連接起來。XScuGic_Connect(&gpio_intr, INTR_GPIO, (Xil_ExceptionHandler)BTN_Intr_Handler, (void*)&key),這個函數(shù)中參數(shù)的意思,第一個參數(shù)就是實例化的XScuGic對象了,第二個參數(shù),是對應(yīng)的XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR,也就是定義的那個中斷IRQ_F2P,定義在xparameters.h里。
定義為61,這也就是IRQ_F2P的中斷號為61-68和84-91,共同組成了IRQ_F2P[15:0]。
第三個參數(shù),調(diào)用的中斷處理函數(shù),發(fā)生的中斷操作寫在里面。第四個參數(shù),連接的對象,這里是按鍵,即將中斷行為與按鍵行為連接起來。
-
ARM
+關(guān)注
關(guān)注
134文章
9057瀏覽量
366874 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2254瀏覽量
94371
發(fā)布評論請先 登錄
相關(guān)推薦
評論