您好,
关于EDMA产生中断,首先需要确认EDMA channel产生了时间,通过IPR寄存器可以确认,相应的IPR如果都没有置位,请对照EDMA3 user guide手册中的编程指南确认EDMA3的配置正确。
如果IPR已经置位,说明产生了中断事件,此时如果要相应中断服务函数,则需要配置相应的CIC,对于C667x来说,EDMA的global 中断事件是挂接输入到CIC0,所以需要配置CIC0将输入事件与CIC0的输出channel相对应;然后还需配置相应core的INTC,将CIC0输出到INTC的时间与相应的vecID相对应,最后再相应的vecID上挂接中断服务函数。
下面给出使用CSL函数进行INCT及CIC配置的简单代码,相关的CSL函数请参考cls库,下面需要跟应用修改相关的CIC编号、CIC输入输出、INTC输入、及vecID编号、中断函数等。
1. CIC0的配置:将EDMA3的中断事件与out channel映射作为INTC的输入,具体参考Chip interrupt controller user guide。
CSL_CPINTC_RegsOvly glbCpintcHnd[3];
CSL_CPINTC_Handle hnd;
/* open CPINTC0 to map the EDMA completetion ISR event to the host interrupt */
hnd = CSL_CPINTC_open(0);
if (hnd == 0)
[
printf ("Error: Unable to open CPINTC-1n");
return;
]
glbCpintcHnd[0] = (CSL_CPINTC_RegsOvly)hnd;
//需要根据应用修改EDMA产生的时间编号及CPINTC输出channel号
CSL_CPINTC_mapSystemIntrToChannel (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT, 8);
CSL_CPINTC_enableSysInterrupt (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT);
CSL_CPINTC_enableHostInterrupt (hnd, 8);
CSL_CPINTC_enableAllHostInterrupt(hnd);
2. INTC的配置:即将INTC输入事件与vecID及ISR挂接。
/* Intc variable declarartion */
CSL_IntcObj glbIntcObj;
CSL_IntcHandle glbHIntc;
CSL_IntcEventHandlerRecord glbEventHandler[8];
CSL_IntcGlobalEnableState glbIntcState;
interrupt void ISR_func();
void IntcConfig(void)
[
CSL_IntcParam vectId;
CSL_IntcContext context;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//! GEM0 Intc Configuration !//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
/* Setup the global Interrupt */
context.numEvtEntries = 8;
context.eventhandlerRecord = glbEventHandler;
CSL_intcInit(&context);
/* Enable NMIs */
CSL_intcGlobalNmiEnable();
/* Enable Global Interrupts */
CSL_intcGlobalEnable(&glbIntcState);
/* VectorID for the Global Edma Event */
vectId = CSL_INTC_VECTID_4;
/* Opening a handle for the ISR->EDMA Interrupt Event */
glbHIntc = CSL_intcOpen(&glbIntcObj,
CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N,
&vectId,
NULL);
/* Hook the ISRs */
CSL_intcHookIsr(vectId, &ISR_func);
/* Clear the Interrupt */
CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTCLEAR, NULL);
/* Enable the Event & the interrupt */
CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTENABLE, NULL);
return;
]
您好,
关于EDMA产生中断,首先需要确认EDMA channel产生了时间,通过IPR寄存器可以确认,相应的IPR如果都没有置位,请对照EDMA3 user guide手册中的编程指南确认EDMA3的配置正确。
如果IPR已经置位,说明产生了中断事件,此时如果要相应中断服务函数,则需要配置相应的CIC,对于C667x来说,EDMA的global 中断事件是挂接输入到CIC0,所以需要配置CIC0将输入事件与CIC0的输出channel相对应;然后还需配置相应core的INTC,将CIC0输出到INTC的时间与相应的vecID相对应,最后再相应的vecID上挂接中断服务函数。
下面给出使用CSL函数进行INCT及CIC配置的简单代码,相关的CSL函数请参考cls库,下面需要跟应用修改相关的CIC编号、CIC输入输出、INTC输入、及vecID编号、中断函数等。
1. CIC0的配置:将EDMA3的中断事件与out channel映射作为INTC的输入,具体参考Chip interrupt controller user guide。
CSL_CPINTC_RegsOvly glbCpintcHnd[3];
CSL_CPINTC_Handle hnd;
/* open CPINTC0 to map the EDMA completetion ISR event to the host interrupt */
hnd = CSL_CPINTC_open(0);
if (hnd == 0)
[
printf ("Error: Unable to open CPINTC-1n");
return;
]
glbCpintcHnd[0] = (CSL_CPINTC_RegsOvly)hnd;
//需要根据应用修改EDMA产生的时间编号及CPINTC输出channel号
CSL_CPINTC_mapSystemIntrToChannel (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT, 8);
CSL_CPINTC_enableSysInterrupt (hnd, CSL_INTC0_CPU_3_2_EDMACC_GINT);
CSL_CPINTC_enableHostInterrupt (hnd, 8);
CSL_CPINTC_enableAllHostInterrupt(hnd);
2. INTC的配置:即将INTC输入事件与vecID及ISR挂接。
/* Intc variable declarartion */
CSL_IntcObj glbIntcObj;
CSL_IntcHandle glbHIntc;
CSL_IntcEventHandlerRecord glbEventHandler[8];
CSL_IntcGlobalEnableState glbIntcState;
interrupt void ISR_func();
void IntcConfig(void)
[
CSL_IntcParam vectId;
CSL_IntcContext context;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
//! GEM0 Intc Configuration !//
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
/* Setup the global Interrupt */
context.numEvtEntries = 8;
context.eventhandlerRecord = glbEventHandler;
CSL_intcInit(&context);
/* Enable NMIs */
CSL_intcGlobalNmiEnable();
/* Enable Global Interrupts */
CSL_intcGlobalEnable(&glbIntcState);
/* VectorID for the Global Edma Event */
vectId = CSL_INTC_VECTID_4;
/* Opening a handle for the ISR->EDMA Interrupt Event */
glbHIntc = CSL_intcOpen(&glbIntcObj,
CSL_GEM_INTC0_OUT_8_PLUS_16_MUL_N,
&vectId,
NULL);
/* Hook the ISRs */
CSL_intcHookIsr(vectId, &ISR_func);
/* Clear the Interrupt */
CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTCLEAR, NULL);
/* Enable the Event & the interrupt */
CSL_intcHwControl(glbHIntc, CSL_INTC_CMD_EVTENABLE, NULL);
return;
]
举报