资料介绍
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次下载 | 免费
评论
查看更多