一、ZYNQ中斷框圖
PL到PS部分的中斷經過ICD控制器分發器后同時進入CPU1 和CPU0。從下面的表格中可以看到中斷向量的具體值。PL到PS部分一共有20個中斷可以使用。其中4個是快速中斷。剩余的16個是本章中涉及了,可以任意定義。如下表所示。
二、ZYNQ中斷分類
1.軟件中斷(SGI)
ZYNQ 2 個 CPU 都具備各自 16 個軟件中斷。通過 ICDSGIR 寄存器寫入 SGI 中斷號,以及指定目標 CPU 來產生一個軟件中斷。通過 CPU 私有總線實現寫操作。CPU 能中斷自己或者其他 CPU,或者所有的 CPU。通過讀 ICCIAR(Interrupt Clear Pending)寄存器相應的比特位寫1,可以清楚中斷。所有的 SGI 為邊沿觸發,用於 SGI 的敏感性是固定的,不能修改。 ICDICFR0 寄存器是只讀寄存器。

2.私有外設中斷(PPI)
每個 CPU 連接一個私有的5個共享的外設中斷,所有的中斷敏感類型是固定的,不能修改。這里有 2 個 PL 到 CPU 的快速中斷 nFIQ,私有中斷包括 global timer、private timer 、watch dog 等。將來自 PL 的快速中斷信號 FIQ 和中斷信號 IRQ 翻轉,然后送到中斷控制器中。因此盡管在 ICDICFRI 寄存器內反映他們是活動低敏感信號,但是在 PS-PL接口為高電平活動。

3.共享外設中斷(SPI)
共享中斷就是 PL 的中斷可以發送給 PS 處理。有 16 個 PL 的中斷,它們可以設置為高電平或者低電平觸發。中斷控制器用於管理中斷的優先級和接收用於 CPU 的這些中斷。默認情況下,所有共享外設中斷的復位是一個活動高電平。然而軟件使用 ICDICFR2 和 ICDICFR5 寄存器將中斷32、33和92編程為上升沿敏感。


PS:私有外設中斷和共享外設中斷都含有PL側引入的中斷,而軟件中斷是沒有的。
三、ZYNQ中斷步驟
1.文字描述
第一步:初始化 cpu 的異常處理功能
第二步:初始化中斷控制器
第三步:向 CPU 注冊異常處理回調函數;
第四步:將中斷控制器中的對應中斷 ID 的中斷與中斷控制器相連接
第五步:設置 GPIO 的中斷類型,比如高電平中斷、低電平中斷、上升沿中斷、下降沿中斷等。
第六步:設置 GPIO 中斷回調函數,這里設置的回調函數是用於用戶使用的。
第七步:使能 GPIO 的對應 PIN 的中斷
第八步:使能中斷控制器
第九步:使能異常處理功能
2.框圖描述

四、操作注意事項
1.配置ZYNQ內核時需要將 Interrupts --- Fabric Interrupts 勾選上

2.因為是 PL 端,往往涉及引腳,所以需要添加約束文件,並且生成 bit 流文件,以此加載 SDK 開發環境
3.可以在 system.mss --- gpiops --- Important Examples --- xgpiops intr_example 中得到典型的 GPIO 中斷的代碼。
五、補充
ARM體系架構的處理器中通常將低地址32字節作為中斷向量表,當中斷產生時會執行以下操作:
- 保存處理器當前狀態,設置中斷屏蔽位和各條件標志位
- 設置當前程序狀態寄存器CPSR中相應位
- 將lr_mode寄存器設置成返回地址
- 跳轉到中斷向量地址執行,從而跳轉到相應的中斷程序中執行
- 執行中斷處理函數內容
- 恢復被屏蔽的中斷屏蔽位
- 返回到被中斷指令的下一條指令處繼續執行
zynq中低32字節作為中斷向量表,每個中斷占據4字節,這4字節通常存儲一個跳轉指令,從而跳轉到中斷解析程序中。這低32字節中斷向量表如:
參考資料:
[1]V3學院FPGA教程
[2]何賓, 張艷輝. Xilinx Zynq-7000嵌入式系統設計與實現[M]. 電子工業出版社, 2016.