在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

如何用AXI-DMA批量發送數據到DMA

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-01-21 14:08 ? 次閱讀

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中斷使能

審核編輯:何安

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • dma
    dma
    +關注

    關注

    3

    文章

    569

    瀏覽量

    102058
收藏 人收藏

    評論

    相關推薦

    如何使用EXIT0來觸發DMA實現SPI發送數據

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

    一文詳解AXI DMA技術

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

    CKS32F107xx系列的DMA控制器簡介

    直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須CPU干預,數據可以通過DMA快速地移動,這就節省了CPU的資源來做其他操作。兩個
    的頭像 發表于 02-18 17:24 ?730次閱讀
    CKS32F107xx系列的<b class='flag-5'>DMA</b>控制器簡介

    如何使用DMA進行USART不定長度接收

    在上一講中,我們對USART進行了簡單介紹,并講解了如何在不使用DMA的情況下進行不定長度數據接收,本講將著重講解如何使用DMA進行USART不定長度接收。
    的頭像 發表于 02-18 17:01 ?696次閱讀
    如何使用<b class='flag-5'>DMA</b>進行USART不定長度接收

    ZYNQ基礎---AXI DMA使用

    前言 在ZYNQ中進行PL-PS數據交互的時候,經常會使用到DMA,其實在前面的ZYNQ學習當中,也有學習過DMA的使用,那就是通過使用自定義的IP,完成HP接口向內存寫入和讀取數據
    的頭像 發表于 01-06 11:13 ?1614次閱讀
    ZYNQ基礎---<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>使用

    雅特力AT32F402/F405 DMA使用指南

    DMA簡介DMA控制器的作用不僅在增強系統性能并減少處理器的中斷生成,而且還針對32位MCU應用程序專門優化設計。DMA控制器為存儲器存儲器,存儲器到外設和外設到存儲器的傳輸提供了7
    的頭像 發表于 11-20 01:03 ?753次閱讀
    雅特力AT32F402/F405 <b class='flag-5'>DMA</b>使用指南

    DMA是什么?詳細介紹

    DMA(Direct Memory Access)是一種允許某些硬件子系統直接訪問系統內存的技術,而無需中央處理單元(CPU)的介入。這種技術可以顯著提高數據傳輸速率,減輕CPU的負擔,并提高整體
    的頭像 發表于 11-11 10:49 ?1.7w次閱讀

    用于ADC的DMA乒乓

    電子發燒友網站提供《用于ADC的DMA乒乓.pdf》資料免費下載
    發表于 09-07 11:27 ?1次下載
    用于ADC的<b class='flag-5'>DMA</b>乒乓

    解密DMA:加速數據流動的關鍵

    DMA(Direct Memory Access)控制板是一種獨特的將數據遷移到系統中的外部設備,其主要功能是在不經常干涉CPU的情況下,完成運行內存和外部設備之間最直接的傳輸數據。這種數據
    的頭像 發表于 08-20 14:20 ?1243次閱讀

    經驗分享 | DMA助力實時控制

    直接存儲器訪問(DMA,DirectMemoryAccess)的優點·提高系統效率:通過繞過CPU,DMA顯著減少了數據傳輸對CPU資源的占用,使得CPU能夠專注于其他計算任務,提升了系統整體
    的頭像 發表于 07-18 08:18 ?1219次閱讀
    經驗分享 | <b class='flag-5'>DMA</b>助力實時控制

    RL78系列MCU DMA在UART中的使用

    對于RL78系列的MCU,為了提高運行效率,減少CPU的占用,建議UART數據收發使用DMA功能。DMA(Direct Memory Access)是RL78 MCU內置的一個控制器,能在支持
    的頭像 發表于 07-17 14:24 ?1000次閱讀
    RL78系列MCU <b class='flag-5'>DMA</b>在UART中的使用

    wifi的發送支持DMA嗎?

    wifi的發送支持DMA嗎? send(),這個函數是阻塞的嗎?怎么發送可以最大化發送頻率?我想在發送完成后處理一些東西,可不可以設置
    發表于 06-24 07:33

    spi和使用dma發送數據無法發送完全是怎么回事?

    spi和使用dma發送數據無法發送完全的問題
    發表于 05-31 08:18

    stm8l的USART+DMA如何使用?

    請問大家8L的USART+DMA如何使用啊,程序如下沒有發送數據。 void USART1_Send(unsigned char n) { while(!USART_GetFlagStatus
    發表于 05-10 07:15

    STM8L105 DMA方式發送串口數據偶爾丟第一個字節是為什么?

    有人在STM8L105上用過DMA方式發送串口數據的嗎? 我隔幾百毫秒發送一串數據串口2, 有
    發表于 05-06 07:55
    主站蜘蛛池模板: 免费看国产黄色片 | 天天做人人爱夜夜爽2020毛片 | asian极品呦女爱爱 | 九色国产在线 | 成人精品福利 | 蕾丝视频成人★在线观看 | 性xxxx黑人与亚洲 | videosgratis欧美另类老太 | 夜夜摸视频网 | 噜噜噜噜噜久久久久久91 | 伊人网在线免费视频 | 国产精品国产三级国产在线观看 | 91成人免费福利网站在线 | 岛国一级毛片 | 成人精品在线观看 | 99久久伊人一区二区yy5099 | 日本国产中文字幕 | 欧美午夜电影 | 亚欧色 | 免费观看视频高清www | 天天透天天干 | 日本www网站 | 2023天天操 | 91华人在线视频 | 国产国语videosex另类 | 欧美亚洲专区 | 午夜宅男视频 | 免费视频国产 | 一区二区中文字幕在线观看 | 激情婷婷网 | 日韩亚洲欧洲在线com91tv | 日本三区四区免费高清不卡 | 久久久午夜精品 | 午夜影视啪啪免费体验区入口 | 777奇米四色米奇影院在线播放 | 国产视频国产 | 日日拍夜夜嗷嗷叫狠狠 | 国产亚洲欧美日韩俺去了 | 色网站免费 | 中文字幕天天躁夜夜狠狠综合 | 黄色短视频软件 |