1.1 主函數(shù)
int main(void)
{
XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID);
XGpio_SetDataDirection(&Gpio, 1, 0);
init_intr_sys();
XGpio_DiscreteWrite(&Gpio, 1, 1);
axi_dma_test();
}
1.2 三個(gè)簡(jiǎn)單函數(shù)
(1)、XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID);
本語(yǔ)句對(duì)GPIO進(jìn)行初始化,對(duì)實(shí)例數(shù)據(jù)進(jìn)行配置。
(2)、XGpio_SetDataDirection(&Gpio, 1, 0);
設(shè)置GPIO的方向,向通道1寫(xiě)0,0:輸出,1:輸入。
(3)、XGpio_DiscreteWrite(&Gpio, 1, 1);
設(shè)置GPIO的輸出為1。
一、 init_intr_sys函數(shù)分析
1、DMA_Intr_Init(&AxiDma,0);
DMA中斷實(shí)例化函數(shù),將要配置的DMA信息先lookupConfig再進(jìn)行CfgInitialize,DMA采用塊模式(Block mode),如果是Sg模式,則配置失敗。
2、Timer_init(&Timer,TIMER_LOAD_VALUE,0);
定時(shí)器初始化函數(shù),傳入參數(shù)有定時(shí)器結(jié)構(gòu)、加載值,設(shè)備ID。初始化過(guò)程為先進(jìn)行l(wèi)ookupConfig再進(jìn)行CfgInitialize,實(shí)現(xiàn)實(shí)例結(jié)構(gòu)的配置,Timer定時(shí)器的基本地址:0xf8F00600,然后通過(guò)XScuTimer_LoadTimer(TimerPtr, Load_Value);將要設(shè)定的定時(shí)時(shí)間設(shè)定值寫(xiě)入(0xf8F00600+XSCUTIMER_LOAD_OFFSET(0x00))寄存器設(shè)定加載值。最后設(shè)置定時(shí)器為自動(dòng)加載模式,方法是在(0xf8F00600+XSCUTIMER_CONTROL_OFFSET(0x08))的bit2置一,將定時(shí)器成功設(shè)置為AutoLoad(自動(dòng)加載)模式。
3、Init_Intr_System(&Intc);
初始化中斷系統(tǒng),將要配置的系統(tǒng)中斷信息先lookupConfig再進(jìn)行CfgInitialize,實(shí)現(xiàn)系統(tǒng)中斷結(jié)構(gòu)的配置。
4、Setup_Intr_Exception(&Intc);
4.1、注冊(cè)中斷處理函數(shù)
4.1.1 注冊(cè)中斷
建立中斷函數(shù),傳入?yún)?shù)是XscGic系統(tǒng)控制中斷結(jié)構(gòu)體,然后通過(guò)Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
(void *)IntcInstancePtr);
中斷函數(shù)注冊(cè),第一個(gè)參數(shù)是中斷號(hào),#5,中斷號(hào)為5,第二個(gè)參數(shù)為中斷處理函數(shù)的指針地址,第三個(gè)參數(shù)為對(duì)調(diào)用中斷處理程序時(shí)傳遞給中斷處理程序的數(shù)據(jù)的引用,函數(shù)原型為
Xil_ExceptionRegisterHandler(u32 Exception_id,
Xil_ExceptionHandler Handler,
void *Data),
該函數(shù)將對(duì)應(yīng)中斷ID的處理函數(shù)進(jìn)行存儲(chǔ),并將對(duì)應(yīng)中斷ID的傳入數(shù)據(jù)傳入中斷處理表中進(jìn)行存儲(chǔ)。
4.1.2 中斷處理函數(shù)
在本函數(shù)中,中斷處理函數(shù)為(Xil_ExceptionHandler)XScuGic_InterruptHandler,該函數(shù)的定義是:void XScuGic_InterruptHandler(XScuGic *InstancePtr),此函數(shù)是驅(qū)動(dòng)程序的主要中斷處理程序。他必須連接到中斷源,以便在中斷控制器中斷額中斷激活時(shí)調(diào)用中斷處理程序,他將解析那些中斷是激活啟用的,并調(diào)用適當(dāng)?shù)闹袛嗵幚沓绦?,使用中斷類型?lái)信息確定合適確定中斷,最高優(yōu)先級(jí)的中斷優(yōu)先得到中斷服務(wù)。
4.2 中斷使能函數(shù)
#define Xil_ExceptionEnable() /
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ)
在中斷使能控制寄存器中寫(xiě)入中斷使能,使能通用系統(tǒng)中斷。
5、DMA_Setup_Intr_System();
5.1 整體說(shuō)明
語(yǔ)句函數(shù)DMA_Setup_Intr_System(&Intc,&AxiDma,TX_INTR_ID,RX_INTR_ID);作用是建立DMA系統(tǒng)中斷,第一個(gè)參數(shù)是系統(tǒng)中斷實(shí)例結(jié)構(gòu),第二個(gè)參數(shù)是AxiDma引擎實(shí)例的指針,第三個(gè)參數(shù)是發(fā)送中斷的ID號(hào)(61),第四個(gè)參數(shù)是接收中斷的ID號(hào)(62)。
此函數(shù)設(shè)置中斷系統(tǒng),以便發(fā)生DMA中斷,假定在硬件系統(tǒng)中存在中斷組成。
函數(shù)原型為:
int DMA_Setup_Intr_System(XScuGic * IntcInstancePtr,XAxiDma * AxiDmaPtr, u16 TxIntrId, u16 RxIntrId)
{
int Status;
XScuGic_SetPriorityTriggerType(IntcInstancePtr, TxIntrId, 0xA0, 0x3);
XScuGic_SetPriorityTriggerType(IntcInstancePtr, RxIntrId, 0xA0, 0x3);
/*
* Connect the device driver handler that will be called when an
* interrupt for the device occurs, the handler defined above performs
* the specific interrupt processing for the device.
*/
Status = XScuGic_Connect(IntcInstancePtr, TxIntrId,
(Xil_InterruptHandler)DMA_TxIntrHandler,
AxiDmaPtr);
if (Status != XST_SUCCESS) {
return Status;
}
Status = XScuGic_Connect(IntcInstancePtr, RxIntrId,
(Xil_InterruptHandler)DMA_RxIntrHandler,
AxiDmaPtr);
if (Status != XST_SUCCESS) {
return Status;
}
XScuGic_Enable(IntcInstancePtr, TxIntrId);
XScuGic_Enable(IntcInstancePtr, RxIntrId);
return XST_SUCCESS;
}
5.2 設(shè)置中斷優(yōu)先級(jí)與觸發(fā)方式
XScuGic_SetPriorityTriggerType(IntcInstancePtr, TxIntrId, 0xA0, 0x3);
XScuGic_SetPriorityTriggerType(IntcInstancePtr, RxIntrId, 0xA0, 0x3);
該函數(shù)將AxiDma實(shí)例結(jié)構(gòu)的中斷優(yōu)先級(jí)重新配置,同時(shí)設(shè)置中斷觸發(fā)方式,TxIntrId:61,RxIntrId:62。函數(shù)原型:
XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,
u8 Priority, u8 Trigger)
參數(shù)1:要處理的系統(tǒng)中斷實(shí)例的指針
參數(shù)2:要設(shè)置的中斷源的中斷ID
參數(shù)3:中斷的新優(yōu)先級(jí),0是最高優(yōu)先級(jí),0xF8最低。一共有32個(gè)優(yōu)先級(jí),每8個(gè)為一級(jí),0,8,16,32,40,…..248,共32個(gè)。
參數(shù)4:定時(shí)器中斷觸發(fā)方式 0x01:定時(shí)器高電平觸發(fā) 0x03:PPI(定時(shí)器)上升沿觸發(fā)。
5.2.1 函數(shù)定義
void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,
u8 Priority, u8 Trigger)
{
u32 RegValue;
u8 LocalPriority;
LocalPriority = Priority;
Xil_AssertVoid(InstancePtr != NULL);
Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
Xil_AssertVoid(Int_Id
Xil_AssertVoid(Trigger
Xil_AssertVoid(LocalPriority
/*
使用int-id確定要寫(xiě)入的寄存器,讀取的地址是0xf8f00100+(0x0400+0x3c),該寄存器為ICDIPR15,中斷優(yōu)先級(jí)控制寄存器,每個(gè)寄存器為GIC(通用中斷控制寄存器)提供8位的優(yōu)先級(jí)字段,每個(gè)字段只有高5位是可讀寫(xiě)的,低5位總是0,一共32個(gè)優(yōu)先級(jí),ICDIPR0到ICDIPR7存儲(chǔ)著連接的每個(gè)處理器的中斷優(yōu)先級(jí)。
*/
RegValue = XScuGic_DistReadReg(InstancePtr,
XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id));
LocalPriority = LocalPriority & (u8)XSCUGIC_INTR_PRIO_MASK;
/*
*移位并屏蔽寄存器中優(yōu)先級(jí)和觸發(fā)器的正確位
*/
RegValue &= ~(XSCUGIC_PRIORITY_MASK
RegValue |= (u32)LocalPriority
/*
* 再將中斷優(yōu)先號(hào)寫(xiě)回寄存器
*/
XScuGic_DistWriteReg(InstancePtr, XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id),
RegValue);
}
5.3、 XScuGic_Connect()
中斷連接,XScuGic_Connect(IntcInstancePtr, TxIntrId,
(Xil_InterruptHandler)DMA_TxIntrHandler,
AxiDmaPtr);
連接當(dāng)設(shè)備發(fā)生中斷時(shí)將調(diào)用的設(shè)備驅(qū)動(dòng)程序處理程序,上面定義的中斷處理程序執(zhí)行設(shè)備的特定中斷處理。中斷處理函數(shù)是(Xil_InterruptHandler)DMA_TxIntrHandler,中斷函數(shù)的傳入?yún)?shù)是Axidma類型的實(shí)例結(jié)構(gòu)指針AxiDmaPtr,
函數(shù)原型:
s32 XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id,
Xil_InterruptHandler Handler, void *CallBackRef)
{
/*
* Assert the arguments
*/
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(Int_Id
Xil_AssertNonvoid(Handler != NULL);
Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
/*
* The Int_Id is used as an index into the table to select the proper
* handler
*/
InstancePtr->Config->HandlerTable[Int_Id].Handler = Handler;
InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = CallBackRef;
return XST_SUCCESS;
}
函數(shù)功能:
在int_id中斷源對(duì)應(yīng)的中斷源和要運(yùn)行的中斷處理程序之間建立連接,Callback提供參數(shù)。
*@param instanceptr是指向xscugic實(shí)例的指針。
*@param int_id包含中斷源的id,應(yīng)該在0到xscugic_max_num_intr_inputs-1的范圍內(nèi)
*@該中斷的處理程序的param handler。
5.3.1、中斷處理函數(shù)
函數(shù)功能:從硬件中獲取中斷狀態(tài)并確認(rèn)中斷,如果發(fā)生任何錯(cuò)誤則重置硬件,否則,如果存在中斷,則設(shè)置中斷標(biāo)志(本函數(shù)中對(duì)應(yīng)的是接收中斷標(biāo)志,所以會(huì)設(shè)置rxdone標(biāo)志)。 callback是指向dma引擎的rx通道的指針
static void DMA_RxIntrHandler(void *Callback)
{
u32 IrqStatus;
int TimeOut;
/*
獲取中斷狀態(tài),查看輸入的結(jié)構(gòu)指針中的中斷位
*/
XAxiDma *AxiDmaInst = (XAxiDma *)Callback;
/* Read pending interrupts */
IrqStatus = XAxiDma_IntrGetIrq(AxiDmaInst, XAXIDMA_DEVICE_TO_DMA);
/* Acknowledge pending interrupts */
XAxiDma_IntrAckIrq(AxiDmaInst, IrqStatus, XAXIDMA_DEVICE_TO_DMA);
/*
* If no interrupt is asserted, we do not do anything
*/
if (!(IrqStatus & XAXIDMA_IRQ_ALL_MASK)) {
return;
}
/*
* If error interrupt is asserted, raise error flag, reset the
* hardware to recover from the error, and return with no further
* processing.
*/
if ((IrqStatus & XAXIDMA_IRQ_ERROR_MASK)) {
Error = 1;
/* Reset could fail and hang
* NEED a way to handle this or do not call it??
*/
XAxiDma_Reset(AxiDmaInst);
TimeOut = RESET_TIMEOUT_COUNTER;
while (TimeOut) {
if(XAxiDma_ResetIsDone(AxiDmaInst)) {
break;
}
TimeOut -= 1;
}
return;
}
/*
* If completion interrupt is asserted, then set RxDone flag
*/
if ((IrqStatus & XAXIDMA_IRQ_IOC_MASK)) {
RxDone = 1;
}
}
5.4、中斷使能函數(shù)
XScuGic_Enable(IntcInstancePtr, TxIntrId);
XScuGic_Enable(IntcInstancePtr, RxIntrId);
該函數(shù)就是兩句,
Mask = 0x00000001U
/*
* Enable the selected interrupt source by setting the
* corresponding bit in the Enable Set register.
*/
XScuGic_DistWriteReg(InstancePtr, (u32)XSCUGIC_ENABLE_SET_OFFSET +
((Int_Id / 32U) * 4U), Mask);
先根據(jù)中斷號(hào)識(shí)別使能該中斷的寄存器位置,在使能該中斷在該寄存器上對(duì)應(yīng)的位。
6、Timer_Setup_Intr_System(&Intc,&Timer,29u);
6.1、定時(shí)器中斷建立
參數(shù)1:通用中斷實(shí)例結(jié)構(gòu)
參數(shù)2:定時(shí)器實(shí)例結(jié)構(gòu)
參數(shù)3:定時(shí)器中斷號(hào)
步驟一、在Gic中根據(jù)中斷號(hào)注冊(cè)定時(shí)器中斷,將中斷處理函數(shù)儲(chǔ)存進(jìn)入中斷向量處理表。
步驟二、在Gic中使能定時(shí)器中斷。
步驟三、在定時(shí)器控制器中設(shè)置允許中斷
7、 DMA_Intr_Enable(&Intc,&AxiDma);
7.1 DMA中斷使能
審核編輯:何安
-
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
100756
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論