ZYNQ 中斷函數配置——個人筆記

一、 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實例,中斷IDCPUID

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);

 

//設置CPUID

void XScuGic_SetCpuID(u32 CpuCoreId);

 

//獲取CPUID

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和例程吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章