修改官方例程后,不再进入DMA中断。
这是代码,请问哪里配置错啦?
/* 中断服务函数 */
Void uPPIsr(UArg arg)
{
unsigned int intr_dmai_status;
// 取得 DMA 中断状态
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
while(intr_dmai_status != 0 )//|| intr_dmaq_status != 0)
{
if (intr_dmai_status & uPP_INT_EOW)
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
upp_interrupt_count++;
}
// 判断是否全部事情被处理完毕
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
}
// 通知 CPU uPP 中断处理完毕以便后续事件可以产生
uPPEndOfInt(SOC_UPP_0_REGS);
}
/* uPP 初始化 */
void Omapl
FPGAuPPSetup(void)
{
// 外设使能
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UPP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
// 引脚复用配置
uPPPinMuxSetup(uPP_CHA_8BIT);
// uPP复位
uPPReset(SOC_UPP_0_REGS);
// 数据格式配置
uPPDataFmtConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_DataPackingFmt_LJZE | uPP_DataPacking_FULL
| uPP_InterfaceWidth_8BIT | uPP_DataRate_SINGLE);
// 通道配置
uPPChannelConfig(SOC_UPP_0_REGS, uPP_DDRDEMUX_DISABLE | uPP_SDRTXIL_DISABLE | uPP_CHN_ONE
| uPP_ALL_RECEIVE);
// 引脚配置
uPPPinConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_PIN_TRIS | uPP_PIN_ENABLE | uPP_PIN_WAIT | uPP_PIN_START);
// 中断使能
uPPIntEnable(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
// uPP使能
uPPEnable(SOC_UPP_0_REGS);
}
/****************************************************************************/
/* */
/* 初始化 */
/* */
/****************************************************************************/
Void PeriphInit(Void)
{
OmaplFpgauPPSetup();
}
Void HWIInit(Void)
{
// 动态创建硬件中断
Hwi_Params hwiParams;
Hwi_Params_init(&hwiParams);
hwiParams.even
tid = SYS_INT_UPP_INT;
hwiParams.enableInt = true;
Hwi_create(C674X_MASK_INT6, uPPIsr, &hwiParams, NULL);
}
Void ThreadInit(Void)
{
// 硬件中断
HWIInit();
}
/****************************************************************************/
/* */
/* 缓存配置 */
/* */
/****************************************************************************/
void CacheInit()
{
Cache_Size cacheSize;
cacheSize.l1pSize = Cache_L1Size_32K;
cacheSize.l1dSize =Cache_L1Size_32K;
cacheSize.l2Size = Cache_L2Size_256K;
Cache_setSize(&cacheSize);
}
Void taskMain(UArg arg1, UArg arg2)
{
int target_int_count = 1;
// A 通道参数 接收
transposeParA.WindowAddress = (unsigned int *)((int)upp_buffer_a);
transposeParA.LineCount = upp_line_count;
transposeParA.ByteCount = (upp_line_size*sizeof(unsigned short));
transposeParA.LineOffsetAddress = (upp_line_offset*sizeof(unsigned short));
while(1)
{
upp_interrupt_count = 0;
Cache_wb((void *)upp_buffer_a, sizeof(upp_buffer_a), Cache_Type_ALLD, TRUE);
// uPP A 通道启动接收
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &transposeParA);
// // 等待 uPP 传输完毕
while (upp_interrupt_count < target_int_count)
{
}
Cache_inv((void *)upp_buffer_a, sizeof(upp_buffer_a), Cache_Type_ALLD, TRUE);
}
}
/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
Int main()
{
Task_Handle task;
Error_Block eb;
Task_Params taskParams;
// 外设初始化
PeriphInit();
// 线程初始化
ThreadInit();
// 初始化参数
Error_init(&eb);
// 创建主任务
Task_Params_init(&taskParams);
taskParams.priority = 8;
taskParams.stackSize = 8192;
task = Task_create(taskMain, &taskParams, &eb);
if (task == NULL)
{
System_printf("Task create failed!n");
BIOS_exit(0);
}
// 使能中断
Hwi_enable();
// 启动 SYS/BIOS 系统
BIOS_start();
return(0);
}