一、 GIC頭文件中的那些函數
xscugic.h文件中定義了以下多個函數。
//連接:設置中斷服務函數註冊
//入口參數:SCU GIC實例,中斷ID,定義中斷處理函數,中斷
s32 XScuGic_Connect (XScuGic *InstancePtr, u32 Int_Id, Xil_InterruptHandler Handler, void *CallBackRef);
//斷開連接:中斷服務程序不再連接//暫時這麼理解吧,反正對於我這種垃圾來說也用不上
void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id);
//SCU GIC使能和禁用,入口參數是SCU GIC實例,中斷ID
void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id);
void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id);
//SCU GIC配置初始化函數
s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, u32 EffectiveAddr);
//軟件中斷,入口參數:SCU GIC實例,中斷ID,CPU的ID
s32 XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id);
//獲取中斷優先級觸發類型。入口參數:SCU GIC實例,中斷ID,優先級,觸發類型?
void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,u8 *Priority, u8 *Trigger);
//設置中斷優先級觸發類型。入口參數:SCU GIC實例, 中斷ID,優先級,觸發類型?
void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, u8 Priority, u8 Trigger);
//中斷映射到CPU中。入口:SCU GIC實例,CPU ID,中斷ID
void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id);
//來自於CPU的中斷不映射,入口參數:SCU GIC實例,CPU ID,中斷ID
void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id);
//來自於CPU的中斷全都不映射,入口參數:SCU GIC實例,CPU ID
void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id);
//暫停GIC,入口參數:SCU GIC實例
void XScuGic_Stop(XScuGic *InstancePtr);
//設置CPU的ID。
void XScuGic_SetCpuID(u32 CpuCoreId);
//獲取CPU的ID
u32 XScuGic_GetCpuID(void);
//查詢配置。入口參數:設備ID,返回值:GIC配置結構體指針
XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId);
//中斷處理函數
void XScuGic_InterruptHandler(XScuGic *InstancePtr);
//自測函數,入口參數:SCU GIC實例
s32 XScuGic_SelfTest(XScuGic *InstancePtr);
二 、ZYNQ中配置函數的步驟過程
下邊對比一下初始化中斷函數的共同點:
1、在配置某個功能的建立中斷系統函數前需要對某幾種功能進行配置。這些功能配置也有相同的部分:
//就是查詢當前設備(如串口)的ID。
DeviceConfig = XScuGic_LookupConfig(DEVICE_ID);
//對DeviceConfig的初始化。第一個參數:Device的實例
//第二個參數IntcConfig是查找器件後獲得的配置信息。
//第三個參數是這個Device配置信息的CPU基地址(我TM都不知道我在說些什麼了,哈哈哈哈~)。
XScuGic_CfgInitialize(DeviceInstancePtr, DeviceConfig, DeviceConfig->CpuBaseAddress);
//然後配置這個Device的模式,功能等等參數。如串口的波特率,GPIO的方向等等吧~這寫模式或者功能都能在相應的頭文件中找到。
2、在建立中斷系統函數時(也就是在XxxSetupInterSystem函數中)總有以下語句是重複的:
//入口參數:中斷設備的ID,但貌似最終都是宏定義到了0U(我也不知道什麼時候能定義到其他數值)
//返回值:IntcConfig的類型是結構體指針。XScuGicConfig * IntcConfig;C語言能力欠缺的表示不要去深究這裏邊的信息究竟是什麼了。
//只要按照這個步驟會配置就行了。
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
//對SCU GIC配置的初始化。第一個參數:SCU GIC的實例
//第二個參數IntcConfig是查找器件後獲得的配置信息。
//第三個參數是這個設備配置信息的CPU基地址(我TM都不知道我在說些什麼了,哈哈哈哈~)。綜合可知,GIC就是一個Device!
XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
Xil_ExceptionInit();//中斷異常的初始化,這句話可以不要,因爲函數裏邊沒什麼內容
//建立中斷異常處理。第一個參數是不變的:可以查找得到,無論這個數值有幾層宏定義,最終結果總是等於5
//第二個參數總是不變的,它恆對應中斷處理函數——XScuGic_InterruptHandler
//第三個參數也是不可變的,總是SCU GIC的實例
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
GicInstancePtr);
//使能中斷異常,這個函數也是更古不變的!
Xil_ExceptionEnable();
//中斷服務函數的註冊。那麼這裏的後兩個入口參數需要注意一點了!
//第一個入口參數:是更古不變的,無論怎麼查找,無論經過了多少層宏定義,那麼它的最終形式是GIC的實例,類型是XScuGic。
//第二個參數:中斷ID
//第三個參數:Xxx功能正常發生中斷時候,所定義的中斷服務函數的名稱(有的人稱之爲句柄,都一個道理)。
//第四個參數:Xxx功能的實例。如UART的實例(含波特率,校驗位等數值),又比如私有定時器的實例等。
XScuGic_Connect(IntcInstancePtr, Int_Id,
(Xil_ExceptionHandler)XxxHandler,
(void *)XxxInstancePtr);
XScuGic_Enable(IntcInstancePtr, Int_Id);//第一個參數不用說了,第二個參數是中斷ID
這些中斷配置的相同點終於完成了!!!!!
3、相同點配置完之後:我們就該配置與功能模塊相關的東西了。
例如設置串口接收中斷的觸發方式(RxFIFO的出發等級1)!例如使能定時器中斷的開啓!例如配置引腳輸入觸發中斷的方式!使能引腳下降沿中斷等等!這時候再去看UG585!
4、配置XxxHandler函數。有關XxxHandler函數的編寫還沒總結,應該是參考UG585和例程吧。