資料介紹
1.1 主函數
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 三個簡單函數
(1)、XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID);
本語句對GPIO進行初始化,對實例數據進行配置。
(2)、XGpio_SetDataDirection(&Gpio, 1, 0);
設置GPIO的方向,向通道1寫0,0:輸出,1:輸入。
(3)、XGpio_DiscreteWrite(&Gpio, 1, 1);
設置GPIO的輸出為1。
一、 init_intr_sys函數分析
1、DMA_Intr_Init(&AxiDma,0);
DMA中斷實例化函數,將要配置的DMA信息先lookupConfig再進行CfgInitialize,DMA采用塊模式(Block mode),如果是Sg模式,則配置失敗。
2、Timer_init(&Timer,TIMER_LOAD_VALUE,0);
定時器初始化函數,傳入參數有定時器結構、加載值,設備ID。初始化過程為先進行lookupConfig再進行CfgInitialize,實現實例結構的配置,Timer定時器的基本地址:0xf8F00600,然后通過XScuTimer_LoadTimer(TimerPtr, Load_Value);將要設定的定時時間設定值寫入(0xf8F00600+XSCUTIMER_LOAD_OFFSET(0x00))寄存器設定加載值。最后設置定時器為自動加載模式,方法是在(0xf8F00600+XSCUTIMER_CONTROL_OFFSET(0x08))的bit2置一,將定時器成功設置為AutoLoad(自動加載)模式。
3、Init_Intr_System(&Intc);
初始化中斷系統,將要配置的系統中斷信息先lookupConfig再進行CfgInitialize,實現系統中斷結構的配置。
4、Setup_Intr_Exception(&Intc);
4.1、注冊中斷處理函數
4.1.1 注冊中斷
建立中斷函數,傳入參數是XscGic系統控制中斷結構體,然后通過Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
(void *)IntcInstancePtr);
中斷函數注冊,第一個參數是中斷號,#5,中斷號為5,第二個參數為中斷處理函數的指針地址,第三個參數為對調用中斷處理程序時傳遞給中斷處理程序的數據的引用,函數原型為
Xil_ExceptionRegisterHandler(u32 Exception_id,
Xil_ExceptionHandler Handler,
void *Data),
該函數將對應中斷ID的處理函數進行存儲,并將對應中斷ID的傳入數據傳入中斷處理表中進行存儲。
4.1.2 中斷處理函數
在本函數中,中斷處理函數為(Xil_ExceptionHandler)XScuGic_InterruptHandler,該函數的定義是:void XScuGic_InterruptHandler(XScuGic *InstancePtr),此函數是驅動程序的主要中斷處理程序。他必須連接到中斷源,以便在中斷控制器中斷額中斷激活時調用中斷處理程序,他將解析那些中斷是激活啟用的,并調用適當的中斷處理程序,使用中斷類型來信息確定合適確定中斷,最高優先級的中斷優先得到中斷服務。
4.2 中斷使能函數
#define Xil_ExceptionEnable() /
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ)
在中斷使能控制寄存器中寫入中斷使能,使能通用系統中斷。
5、DMA_Setup_Intr_System();
5.1 整體說明
語句函數DMA_Setup_Intr_System(&Intc,&AxiDma,TX_INTR_ID,RX_INTR_ID);作用是建立DMA系統中斷,第一個參數是系統中斷實例結構,第二個參數是AxiDma引擎實例的指針,第三個參數是發送中斷的ID號(61),第四個參數是接收中斷的ID號(62)。
此函數設置中斷系統,以便發生DMA中斷,假定在硬件系統中存在中斷組成。
函數原型為:
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 設置中斷優先級與觸發方式
XScuGic_SetPriorityTriggerType(IntcInstancePtr, TxIntrId, 0xA0, 0x3);
XScuGic_SetPriorityTriggerType(IntcInstancePtr, RxIntrId, 0xA0, 0x3);
該函數將AxiDma實例結構的中斷優先級重新配置,同時設置中斷觸發方式,TxIntrId:61,RxIntrId:62。函數原型:
XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,
u8 Priority, u8 Trigger)
參數1:要處理的系統中斷實例的指針
參數2:要設置的中斷源的中斷ID
參數3:中斷的新優先級,0是最高優先級,0xF8最低。一共有32個優先級,每8個為一級,0,8,16,32,40,…..248,共32個。
參數4:定時器中斷觸發方式 0x01:定時器高電平觸發 0x03:PPI(定時器)上升沿觸發。
5.2.1 函數定義
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確定要寫入的寄存器,讀取的地址是0xf8f00100+(0x0400+0x3c),該寄存器為ICDIPR15,中斷優先級控制寄存器,每個寄存器為GIC(通用中斷控制寄存器)提供8位的優先級字段,每個字段只有高5位是可讀寫的,低5位總是0,一共32個優先級,ICDIPR0到ICDIPR7存儲著連接的每個處理器的中斷優先級。
*/
RegValue = XScuGic_DistReadReg(InstancePtr,
XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id));
LocalPriority = LocalPriority & (u8)XSCUGIC_INTR_PRIO_MASK;
/*
*移位并屏蔽寄存器中優先級和觸發器的正確位
*/
RegValue &= ~(XSCUGIC_PRIORITY_MASK
RegValue |= (u32)LocalPriority
/*
* 再將中斷優先號寫回寄存器
*/
XScuGic_DistWriteReg(InstancePtr, XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id),
RegValue);
}
5.3、 XScuGic_Connect()
中斷連接,XScuGic_Connect(IntcInstancePtr, TxIntrId,
(Xil_InterruptHandler)DMA_TxIntrHandler,
AxiDmaPtr);
連接當設備發生中斷時將調用的設備驅動程序處理程序,上面定義的中斷處理程序執行設備的特定中斷處理。中斷處理函數是(Xil_InterruptHandler)DMA_TxIntrHandler,中斷函數的傳入參數是Axidma類型的實例結構指針AxiDmaPtr,
函數原型:
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;
}
函數功能:
在int_id中斷源對應的中斷源和要運行的中斷處理程序之間建立連接,Callback提供參數。
*@param instanceptr是指向xscugic實例的指針。
*@param int_id包含中斷源的id,應該在0到xscugic_max_num_intr_inputs-1的范圍內
*@該中斷的處理程序的param handler。
5.3.1、中斷處理函數
函數功能:從硬件中獲取中斷狀態并確認中斷,如果發生任何錯誤則重置硬件,否則,如果存在中斷,則設置中斷標志(本函數中對應的是接收中斷標志,所以會設置rxdone標志)。 callback是指向dma引擎的rx通道的指針
static void DMA_RxIntrHandler(void *Callback)
{
u32 IrqStatus;
int TimeOut;
/*
獲取中斷狀態,查看輸入的結構指針中的中斷位
*/
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、中斷使能函數
XScuGic_Enable(IntcInstancePtr, TxIntrId);
XScuGic_Enable(IntcInstancePtr, RxIntrId);
該函數就是兩句,
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);
先根據中斷號識別使能該中斷的寄存器位置,在使能該中斷在該寄存器上對應的位。
6、Timer_Setup_Intr_System(&Intc,&Timer,29u);
6.1、定時器中斷建立
參數1:通用中斷實例結構
參數2:定時器實例結構
參數3:定時器中斷號
步驟一、在Gic中根據中斷號注冊定時器中斷,將中斷處理函數儲存進入中斷向量處理表。
步驟二、在Gic中使能定時器中斷。
步驟三、在定時器控制器中設置允許中斷
7、 DMA_Intr_Enable(&Intc,&AxiDma);
7.1 DMA中斷使能
本文轉載自:https://www.cnblogs.com/luxinshuo/p/11962865.html ,轉載此文目的在于傳播相關技術知識,版權歸原作者所有,如涉及侵權,請聯系小編刪除(聯系郵箱:service@eetrend.com )。
- STM32采用DMA方式向上位機發送數據
- STM32采用串口DMA方式向上位機連續發送數據
- stm32學習筆記-數據直通車DMA
- STM32學習筆記(串口+DMA)
- STM32串口DMA發送數據
- 16、STM32——DMA詳解
- GD32 DMA串口通訊DEMO
- DMA實現連續向上位機發送數據(STM32開發板)
- 基于STM32F407的DMA解析-ADC單通道DMA讀取數據
- MCU學習筆記_DMA原理
- PWM使用的DMA通道與串口接收的DMA通道撞車了,咋辦?
- MZ7035系列開發板XILINX FPGA DMA和VDMA的應用教程 29次下載
- 基于R7F0C019和DMA組合的時鐘同步通信的連續發送/接收的方法 15次下載
- DMA_讀取GPIO電平到內存 10次下載
- DMA與DMA控制器
- STM32的DMA的五大問題 2035次閱讀
- LPC5500_SDK例程:串口DMA發送+中斷接收 1167次閱讀
- STM32基礎知識:串口通信-DMA方式 5732次閱讀
- STM32F1的DMA使用 2956次閱讀
- STM32U59 SPI DMA發送未產生傳輸完成中斷問題分析 5951次閱讀
- STM32串口DMA接收與發送 1w次閱讀
- DMA的三種典型應用 6969次閱讀
- 如何使用STM32單片機實現DMA的同時發送和接收 1w次閱讀
- STM32定時器觸發DMA數據傳輸失敗的原因如何解決 2.1w次閱讀
- zynq linux AXI DMA傳輸步驟教程詳解 3w次閱讀
- STM32中DMA模塊的使用 6484次閱讀
- 基于STM32的串口DMA發送 2.2w次閱讀
- DMA數據傳輸(源代碼分享) 9192次閱讀
- 基于AXI總線的DMA控制器的設計 6445次閱讀
- STM32串口DMA問題詳解 8472次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1491次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 95次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 11次下載 | 免費
- 6100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 7基于單片機和 SG3525的程控開關電源設計
- 0.23 MB | 4次下載 | 免費
- 8基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537793次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多