国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用AXI-DMA批量發(fā)送數(shù)據(jù)到DMA

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2022-01-21 14:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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 三個簡單函數(shù)
(1)、XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID);

本語句對GPIO進行初始化,對實例數(shù)據(jù)進行配置。

(2)、XGpio_SetDataDirection(&Gpio, 1, 0);

設(shè)置GPIO的方向,向通道1寫0,0:輸出,1:輸入。

(3)、XGpio_DiscreteWrite(&Gpio, 1, 1);

設(shè)置GPIO的輸出為1。

一、 init_intr_sys函數(shù)分析
1、DMA_Intr_Init(&AxiDma,0);
DMA中斷實例化函數(shù),將要配置的DMA信息先lookupConfig再進行CfgInitialize,DMA采用塊模式(Block mode),如果是Sg模式,則配置失敗。

2、Timer_init(&Timer,TIMER_LOAD_VALUE,0);
定時器初始化函數(shù),傳入?yún)?shù)有定時器結(jié)構(gòu)、加載值,設(shè)備ID。初始化過程為先進行l(wèi)ookupConfig再進行CfgInitialize,實現(xiàn)實例結(jié)構(gòu)的配置,Timer定時器的基本地址:0xf8F00600,然后通過XScuTimer_LoadTimer(TimerPtr, Load_Value);將要設(shè)定的定時時間設(shè)定值寫入(0xf8F00600+XSCUTIMER_LOAD_OFFSET(0x00))寄存器設(shè)定加載值。最后設(shè)置定時器為自動加載模式,方法是在(0xf8F00600+XSCUTIMER_CONTROL_OFFSET(0x08))的bit2置一,將定時器成功設(shè)置為AutoLoad(自動加載)模式。

3、Init_Intr_System(&Intc);
初始化中斷系統(tǒng),將要配置的系統(tǒng)中斷信息先lookupConfig再進行CfgInitialize,實現(xiàn)系統(tǒng)中斷結(jié)構(gòu)的配置。

4、Setup_Intr_Exception(&Intc);
4.1、注冊中斷處理函數(shù)
4.1.1 注冊中斷
建立中斷函數(shù),傳入?yún)?shù)是XscGic系統(tǒng)控制中斷結(jié)構(gòu)體,然后通過Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,

(Xil_ExceptionHandler)XScuGic_InterruptHandler,

(void *)IntcInstancePtr);

中斷函數(shù)注冊,第一個參數(shù)是中斷號,#5,中斷號為5,第二個參數(shù)為中斷處理函數(shù)的指針地址,第三個參數(shù)為對調(diào)用中斷處理程序時傳遞給中斷處理程序的數(shù)據(jù)的引用,函數(shù)原型為

Xil_ExceptionRegisterHandler(u32 Exception_id,

Xil_ExceptionHandler Handler,

void *Data),

該函數(shù)將對應(yīng)中斷ID的處理函數(shù)進行存儲,并將對應(yīng)中斷ID的傳入數(shù)據(jù)傳入中斷處理表中進行存儲。

4.1.2 中斷處理函數(shù)
在本函數(shù)中,中斷處理函數(shù)為(Xil_ExceptionHandler)XScuGic_InterruptHandler,該函數(shù)的定義是:void XScuGic_InterruptHandler(XScuGic *InstancePtr),此函數(shù)是驅(qū)動程序的主要中斷處理程序。他必須連接到中斷源,以便在中斷控制器中斷額中斷激活時調(diào)用中斷處理程序,他將解析那些中斷是激活啟用的,并調(diào)用適當(dāng)?shù)闹袛嗵幚沓绦颍褂弥袛囝愋蛠硇畔⒋_定合適確定中斷,最高優(yōu)先級的中斷優(yōu)先得到中斷服務(wù)。

4.2 中斷使能函數(shù)
#define Xil_ExceptionEnable() /

Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ)

在中斷使能控制寄存器中寫入中斷使能,使能通用系統(tǒng)中斷。

5、DMA_Setup_Intr_System();
5.1 整體說明
語句函數(shù)DMA_Setup_Intr_System(&Intc,&AxiDma,TX_INTR_ID,RX_INTR_ID);作用是建立DMA系統(tǒng)中斷,第一個參數(shù)是系統(tǒng)中斷實例結(jié)構(gòu),第二個參數(shù)是AxiDma引擎實例的指針,第三個參數(shù)是發(fā)送中斷的ID號(61),第四個參數(shù)是接收中斷的ID號(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)先級與觸發(fā)方式
XScuGic_SetPriorityTriggerType(IntcInstancePtr, TxIntrId, 0xA0, 0x3);

XScuGic_SetPriorityTriggerType(IntcInstancePtr, RxIntrId, 0xA0, 0x3);

該函數(shù)將AxiDma實例結(jié)構(gòu)的中斷優(yōu)先級重新配置,同時設(shè)置中斷觸發(fā)方式,TxIntrId:61,RxIntrId:62。函數(shù)原型:

XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id,

u8 Priority, u8 Trigger)

參數(shù)1:要處理的系統(tǒng)中斷實例的指針

參數(shù)2:要設(shè)置的中斷源的中斷ID

參數(shù)3:中斷的新優(yōu)先級,0是最高優(yōu)先級,0xF8最低。一共有32個優(yōu)先級,每8個為一級,0,8,16,32,40,…..248,共32個。

參數(shù)4:定時器中斷觸發(fā)方式 0x01:定時器高電平觸發(fā) 0x03:PPI(定時器)上升沿觸發(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確定要寫入的寄存器,讀取的地址是0xf8f00100+(0x0400+0x3c),該寄存器為ICDIPR15,中斷優(yōu)先級控制寄存器,每個寄存器為GIC(通用中斷控制寄存器)提供8位的優(yōu)先級字段,每個字段只有高5位是可讀寫的,低5位總是0,一共32個優(yōu)先級,ICDIPR0到ICDIPR7存儲著連接的每個處理器的中斷優(yōu)先級。

*/

RegValue = XScuGic_DistReadReg(InstancePtr,

XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id));

LocalPriority = LocalPriority & (u8)XSCUGIC_INTR_PRIO_MASK;

/*

*移位并屏蔽寄存器中優(yōu)先級和觸發(fā)器的正確位

*/

RegValue &= ~(XSCUGIC_PRIORITY_MASK

RegValue |= (u32)LocalPriority

/*

* 再將中斷優(yōu)先號寫回寄存器

*/

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ā)生中斷時將調(diào)用的設(shè)備驅(qū)動程序處理程序,上面定義的中斷處理程序執(zhí)行設(shè)備的特定中斷處理。中斷處理函數(shù)是(Xil_InterruptHandler)DMA_TxIntrHandler,中斷函數(shù)的傳入?yún)?shù)是Axidma類型的實例結(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中斷源對應(yīng)的中斷源和要運行的中斷處理程序之間建立連接,Callback提供參數(shù)。

*@param instanceptr是指向xscugic實例的指針。

*@param int_id包含中斷源的id,應(yīng)該在0到xscugic_max_num_intr_inputs-1的范圍內(nèi)

*@該中斷的處理程序的param handler。

5.3.1、中斷處理函數(shù)
函數(shù)功能:從硬件中獲取中斷狀態(tài)并確認中斷,如果發(fā)生任何錯誤則重置硬件,否則,如果存在中斷,則設(shè)置中斷標志(本函數(shù)中對應(yīng)的是接收中斷標志,所以會設(shè)置rxdone標志)。 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ù)中斷號識別使能該中斷的寄存器位置,在使能該中斷在該寄存器上對應(yīng)的位。

6、Timer_Setup_Intr_System(&Intc,&Timer,29u);
6.1、定時器中斷建立
參數(shù)1:通用中斷實例結(jié)構(gòu)

參數(shù)2:定時器實例結(jié)構(gòu)

參數(shù)3:定時器中斷號

步驟一、在Gic中根據(jù)中斷號注冊定時器中斷,將中斷處理函數(shù)儲存進入中斷向量處理表。

步驟二、在Gic中使能定時器中斷。

步驟三、在定時器控制器中設(shè)置允許中斷

7、 DMA_Intr_Enable(&Intc,&AxiDma);
7.1 DMA中斷使能

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    582

    瀏覽量

    105933
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    基于AXI DMA IP核的DDR數(shù)據(jù)存儲與PS端讀取

    添加Zynq Processing System IP核,配置DDR控制器和時鐘。7000系列的Zynq可以參考正點原子DMA回環(huán)測試設(shè)置。
    的頭像 發(fā)表于 11-24 09:25 ?3241次閱讀
    基于<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b> IP核的DDR<b class='flag-5'>數(shù)據(jù)</b>存儲與PS端讀取

    Xilinx高性能NVMe Host控制器IP+PCIe 3.0軟核控制器IP,純邏輯實現(xiàn),AXI4和AXI4-Stream DMA接口,支持PCIe 3.0和4.0

    )讀寫、DMA讀寫和數(shù)據(jù)擦除功能,提供用戶一個簡單高效的接口實現(xiàn)高性能存儲解決方案。NVMe AXI4 Host Controller IP讀寫的順序傳輸長度是RTL運行時動態(tài)可配置的,最小
    發(fā)表于 11-14 22:40

    哪些場景適合使用DMA

    ,從而實現(xiàn)復(fù)雜的控制波形。 數(shù)據(jù)包處理: 在網(wǎng)絡(luò)通信中,例如處理以太網(wǎng)幀或USB數(shù)據(jù)包,DMA可以用于將接收到的數(shù)據(jù)包直接存儲內(nèi)存,或者
    發(fā)表于 11-12 07:13

    RVMCU課堂「18」: 手把手教你玩轉(zhuǎn)RVSTAR—DMA數(shù)據(jù)傳輸篇

    到UART發(fā)送端的數(shù)據(jù)。 然后使用CoolTerm的發(fā)送字符串功能,一次性發(fā)送10個字節(jié)的數(shù)據(jù),發(fā)現(xiàn)終端上返回了剛剛
    發(fā)表于 10-30 08:29

    利用蜂鳥E203搭建SoC【5】——DMA使用

    前文介紹了DDR3擴展,然而,對于大塊數(shù)據(jù)而言,使用CPU進行搬運速度較慢,因此可以使用DMA進行數(shù)據(jù)搬運。這里會使用到前文提到的中斷與DDR3。 本例中使用了Vivado提供的AXI-D
    發(fā)表于 10-29 08:21

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計42:DMA 讀寫功能驗證與分析

    待測設(shè)計將DMA 請求轉(zhuǎn)換為 nvme 指令發(fā)送到 NVMe 設(shè)備模型, 模型解析指令從存儲的目標地址中讀取數(shù)據(jù)以 TLP 形式發(fā)送給待測設(shè)計, PCIe 加速模塊將 TLP 事務(wù)轉(zhuǎn)換
    發(fā)表于 10-27 09:10

    基于E203的DMA ip的使用

    ;amp;amp;AXiDma,XAXIDMA_DEVICE_TO_DMA)) 判斷是否傳輸完畢 3.測試 1)先通過S00_AXI和M00_AXI向DDR中寫入數(shù)據(jù)
    發(fā)表于 10-22 06:00

    串口DMA發(fā)送有緩存嗎?

    串口DMA發(fā)送有緩存嗎, 我是從ringbuffer取出來,放到申請的緩存里,啟動串口DMA發(fā)送,然后就釋放了。暫時沒發(fā)現(xiàn)什么問題。 用的drv_usart.c是這個版本
    發(fā)表于 10-10 06:14

    串口DMA發(fā)送數(shù)據(jù)一直發(fā)不出來是怎么回事?

    , buf, size) == HAL_OK) { return size; } else { return 0; } } return 0; } 仿真只有發(fā)送第一次的時候調(diào)用了HAL_UART_Transmit_DMA()函數(shù),而且返回HAL_OK,但是就是沒
    發(fā)表于 10-09 07:01

    串口DMA發(fā)送丟失數(shù)據(jù)的原因?怎么解決?

    使用串口框架第一版,DMA方式通信 全速執(zhí)行的時候,丟數(shù)據(jù),如下,在4 Hv的地方停止了 正常的數(shù)據(jù)是下面這樣的,也是DMA發(fā)送的,只不過
    發(fā)表于 09-24 07:09

    finsh 控制臺dma發(fā)送如何操作?

    今天因為在高優(yōu)先級線程中頻繁調(diào)用rt_kprintf導(dǎo)致低優(yōu)先級運行阻塞,所以突發(fā)奇想想試試控制臺能不能dma發(fā)送,在保證對應(yīng)uart tx dma的驅(qū)動打開后,rt_device_open里
    發(fā)表于 09-11 07:48

    FPGA利用DMA IP核實現(xiàn)ADC數(shù)據(jù)采集

    本文介紹如何利用FPGA和DMA技術(shù)處理來自AD9280和AD9708 ADC的數(shù)據(jù)。首先,探討了這兩種ADC的特點及其與FPGA的接口兼容性。接著,詳細說明了使用Xilinx VIVADO環(huán)境下
    的頭像 發(fā)表于 07-29 14:12 ?5104次閱讀

    NVMe IP高速傳輸卻不依賴XDMA設(shè)計之五:DMA 控制單元設(shè)計

    DMA 控制單元負責(zé)控制 DMA 傳輸事務(wù), 該單元承擔(dān)了 DMA 事務(wù) NVMe 事務(wù)的轉(zhuǎn)換任務(wù), 使用戶對數(shù)據(jù)傳輸事務(wù)的控制更加簡單快
    的頭像 發(fā)表于 07-02 19:47 ?2048次閱讀
    NVMe IP高速傳輸卻不依賴XDMA設(shè)計之五:<b class='flag-5'>DMA</b> 控制單元設(shè)計

    如何使用EXIT0來觸發(fā)DMA實現(xiàn)SPI發(fā)送數(shù)據(jù)

    請問一下,我想使用EXIT0來觸發(fā)DMA實現(xiàn)SPI發(fā)送數(shù)據(jù)。我現(xiàn)在使用PB0作為EXIT0的觸發(fā)源,我把PB0配置為外部中斷模式,DMAMUX同步模式使能,選擇EXIT0作為同步信號源,這種情況下
    發(fā)表于 04-23 07:31

    一文詳解AXI DMA技術(shù)

    ,SG)功能還可以將數(shù)據(jù)移動任務(wù)從位于于處理器系統(tǒng)中的中央處理器(CPU)中卸載出來。可以通過一個AXI4-Lite從接口訪問初始化、狀態(tài)和管理寄存器。如圖4. 8展現(xiàn)了DMA IP的功能構(gòu)成核心。
    的頭像 發(fā)表于 04-03 09:32 ?2511次閱讀
    一文詳解<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>技術(shù)