首页| 行业标准| 论文文档| 电子资料| 图纸模型
购买积分 购买会员 激活码充值

您现在的位置是:团子下载站 > 可编程逻辑 > 利用AXI-DMA批量发送数据到DMA

利用AXI-DMA批量发送数据到DMA

  • 资源大小:95.47KB
  • 上传时间:2021-08-04
  • 下载次数:0次
  • 浏览次数:51次
  • 资源积分:1积分
  • 标      签: dma

资 源 简 介

1.1主函数intmain(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采用块模式(Blockmode),如果是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(u32Exception_id,Xil_ExceptionHandlerHandler,void*Data),该函数将对应中断ID的处理函数进行存储,并将对应中断ID的传入数据传入中断处理表中进行存储。4.1.2中断处理函数在本函数中,中断处理函数为(Xil_ExceptionHandler)XScuGic_InterruptHandler,该函数的定义是:voidXScuGic_InterruptHandler(XScuGic*InstancePtr),此函数是驱动程序的主要中断处理程序。他必须连接到中断源,以便在中断控制器中断额中断激活时调用中断处理程序,他将解析那些中断是激活启用的,并调用适当的中断处理程序,使用中断类型来信息确定合适确定中断,最高优先级的中断优先得到中断服务。4.2中断使能函数#defineXil_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中断,假定在硬件系统中存在中断组成。函数原型为:intDMA_Setup_Intr_System(XScuGic*IntcInstancePtr,XAxiDma*AxiDmaPtr,u16TxIntrId,u16RxIntrId){intStatus;XScuGic_SetPriorityTriggerType(IntcInstancePtr,TxIntrId,0xA0,0x3);XScuGic_SetPriorityTriggerType(IntcInstancePtr,RxIntrId,0xA0,0x3);/**Connectthedevicedriverhandlerthatwillbecalledwhenan*interruptforthedeviceoccurs,thehandlerdefinedaboveperforms*thespecificinterruptprocessingforthedevice.*/Status=XScuGic_Connect(IntcInstancePtr,TxIntrId,(Xil_InterruptHandler)DMA_TxIntrHandler,AxiDmaPtr);if(Status!=XST_SUCCESS){returnStatus;}Status=XScuGic_Connect(IntcInstancePtr,RxIntrId,(Xil_InterruptHandler)DMA_RxIntrHandler,AxiDmaPtr);if(Status!=XST_SUCCESS){returnStatus;}XScuGic_Enable(IntcInstancePtr,TxIntrId);XScuGic_Enable(IntcInstancePtr,RxIntrId);returnXST_SUCCESS;}5.2设置中断优先级与触发方式XScuGic_SetPriorityTriggerType(IntcInstancePtr,TxIntrId,0xA0,0x3);XScuGic_SetPriorityTriggerType(IntcInstancePtr,RxIntrId,0xA0,0x3);该函数将AxiDma实例结构的中断优先级重新配置,同时设置中断触发方式,TxIntrId:61,RxIntrId:62。函数原型:XScuGic_SetPriorityTriggerType(XScuGic*InstancePtr,u32Int_Id,u8Priority,u8Trigger)参数1:要处理的系统中断实例的指针参数2:要设置的中断源的中断ID参数3:中断的新优先级,0是最高优先级,0xF8最低。一共有32个优先级,每8个为一级,0,8,16,32,40,…..248,共32个。参数4:定时器中断触发方式0x01:定时器高电平触发0x03:PPI(定时器)上升沿触发。5.2.1函数定义voidXScuGic_SetPriorityTriggerType(XScuGic*InstancePtr,u32Int_Id,u8Priority,u8Trigger){u32RegValue;u8LocalPriority;LocalPriority=Priority;Xil_AssertVoid(InstancePtr!=NULL);Xil_AssertVoid(InstancePtr->IsReady==XIL_COMPONENT_IS_READY);Xil_AssertVoid(Int_IdXil_AssertVoid(TriggerXil_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_MASKRegValue|=(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,函数原型:s32XScuGic_Connect(XScuGic*InstancePtr,u32Int_Id,Xil_InterruptHandlerHandler,void*CallBackRef){/**Assertthearguments*/Xil_AssertNonvoid(InstancePtr!=NULL);Xil_AssertNonvoid(Int_IdXil_AssertNonvoid(Handler!=NULL);Xil_AssertNonvoid(InstancePtr->IsReady==XIL_COMPONENT_IS_READY);/**TheInt_Idisusedasanindexintothetabletoselecttheproper*handler*/InstancePtr->Config->HandlerTable[Int_Id].Handler=Handler;InstancePtr->Config->HandlerTable[Int_Id].CallBackRef=CallBackRef;returnXST_SUCCESS;}函数功能:在int_id中断源对应的中断源和要运行的中断处理程序之间建立连接,Callback提供参数。*@paraminstanceptr是指向xscugic实例的指针。*@paramint_id包含中断源的id,应该在0到xscugic_max_num_intr_inputs-1的范围内*@该中断的处理程序的paramhandler。5.3.1、中断处理函数函数功能:从硬件中获取中断状态并确认中断,如果发生任何错误则重置硬件,否则,如果存在中断,则设置中断标志(本函数中对应的是接收中断标志,所以会设置rxdone标志)。callback是指向dma引擎的rx通道的指针staticvoidDMA_RxIntrHandler(void*Callback){u32IrqStatus;intTimeOut;/*获取中断状态,查看输入的结构指针中的中断位*/XAxiDma*AxiDmaInst=(XAxiDma*)Callback;/*Readpendinginterrupts*/IrqStatus=XAxiDma_IntrGetIrq(AxiDmaInst,XAXIDMA_DEVICE_TO_DMA);/*Acknowledgependinginterrupts*/XAxiDma_IntrAckIrq(AxiDmaInst,IrqStatus,XAXIDMA_DEVICE_TO_DMA);/**Ifnointerruptisasserted,wedonotdoanything*/if(!(IrqStatus&XAXIDMA_IRQ_ALL_MASK)){return;}/**Iferrorinterruptisasserted,raiseerrorflag,resetthe*hardwaretorecoverfromtheerror,andreturnwithnofurther*processing.*/if((IrqStatus&XAXIDMA_IRQ_ERROR_MASK)){Error=1;/*Resetcouldfailandhang*NEEDawaytohandlethisordonotcallit??*/XAxiDma_Reset(AxiDmaInst);TimeOut=RESET_TIMEOUT_COUNTER;while(TimeOut){if(XAxiDma_ResetIsDone(AxiDmaInst)){break;}TimeOut-=1;}return;}/**Ifcompletioninterruptisasserted,thensetRxDoneflag*/if((IrqStatus&XAXIDMA_IRQ_IOC_MASK)){RxDone=1;}}5.4、中断使能函数XScuGic_Enable(IntcInstancePtr,TxIntrId);XScuGic_Enable(IntcInstancePtr,RxIntrId);该函数就是两句,Mask=0x00000001U/**Enabletheselectedinterruptsourcebysettingthe*correspondingbitintheEnableSetregister.*/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.1DMA中断使能本文转载自:https://www.cnblogs.com/luxinshuo/p/11962865.html,转载此文目的在于传播相关技术知识,版权归原作者所有,如涉及侵权,请联系小编删除(联系邮箱:service@eetrend.com)。
VIP VIP