米聯客——DMA 閉環測試 學習心得
阿新 • • 發佈:2018-12-02
剛學了米聯客的DMA閉環測試這一章,這裡記錄一下sdk的理解
/*………………主函式………………*/
int main(void)
{
init_intr_sys();
axi_dma_test();
}
主函式很簡單就兩個子函式
首先來看一下 init_intr_sys();
int init_intr_sys(void) { DMA_Intr_Init(&AxiDma,0);//initial interrupt system Init_Intr_System(&Intc); // initial DMA interrupt system Setup_Intr_Exception(&Intc); DMA_Setup_Intr_System(&Intc,&AxiDma,TX_INTR_ID,RX_INTR_ID);//setup dma interrpt system DMA_Intr_Enable(&Intc,&AxiDma); }
這個函式很簡單,就是做一些初始化的工作。
前兩個函式,分別初始化DMA和系統中斷。這兩個函式結構都很相似這裡就不再解釋。(不過在這裡有一個疑問,就是前兩個函式都是有返回值的,return XST_SUCCESS;return XST_FAILURE;那麼它是怎麼判斷的?如果返回失敗串列埠會打印出來但是程式還是會向下執行?)
第三個是註冊中斷異常處理程式
第四個是建立DMA中斷系統 在這裡判斷了是否TX RX在工作會返回一個flag即在測試函式中的Txdone 和Rxdone
第五個使能DMA中斷 裡面只有四個函式兩個斷開中斷、兩個使能中斷(rx tx)
接下來就是主函式中的第二個子函式DMA的測試函式
先貼一個關於DDR3的部落格,講的很詳細https://blog.csdn.net/hanxuexiaoma/article/details/78979212
首先,測試函式初始化引數有 TX RX 標記位
然後進入一個大的for迴圈這個迴圈控制的是測試次數,並且每次初值加一。
以第一次迴圈為例,初值位0x0c。函式先將資料包即0x0c--0x862以for迴圈的形式存入傳送快取區。之後用Xil_DCacheFlushRange 將資料刷進DDR中。先啟動一次讀XAxiDma_SimpleTransfer,在啟動一次寫XAxiDma_SimpleTransfer。在這裡將會進入中斷並將TX RX標誌位置1,等待收發完成。完成後計數器加一,並將標誌位置0。最後檢查資料是否一致。