使用UPP的B口,向外面发送64bytes,同时也使用A口接收64bytes的数据,发送的数据可以在逻辑分析仪中看到64bytes,接收的也能从memory窗口看到。
但是不管是发送完,还是接收完,都无法进入UPP的中断服务程序
HWI的interrupt number为9,事件为94,对应event ID为2,利用UPP事件联合EventCombiner产生中断。
以上为cfg文件的EventCombiner的设置。
其中upp的CPU中断号uppIntNum为9,事件uppEvt值为94。
以上代码,debug下,程序会走if语句,也就是说根据ECM来注册我的uppIsr。
以上BUFSIZE为64。GIO_ISSUE的底层,在最后,会调用函数 Upp_localEnableInterrupts(单步调试发现的)
现在的问题是都有64bytes的数据发出去,也有64bytes的数据接收到了,为何仍然无法进入中断服务程序uppIsr?
然后,我试着在cfg文件中加入以下几句:
var hwi0Params = new Hwi.Params();
hwi0Params.instance.name = "hwi9";
hwi0Params.eventId = 2;
Program.global.hwi9 = Hwi.create(9, "&uppIsr", hwi0Params);
它会报错了,因为跟cfg的EventCombiner定义重复了。
EventCombiner.eventGroupHwiNum[0] = 7;
EventCombiner.eventGroupHwiNum[1] = 8;
EventCombiner.eventGroupHwiNum[2] = 9;
EventCombiner.eventGroupHwiNum[3] = 10;
现在也不知道问题出在哪里,还请各位大神指点一下,非常感谢!
Denny%20Yang99373:
检查一下中断状态寄存器,看看有没有触发
这样可以定位问题是中断没触发还是触发后没响应
baokun hu:
回复 Denny%20Yang99373:
观察中断状态寄存器之后,感觉确实是触发了的!
在此处设置断点,
if (IOM_COMPLETED != GIO_issue(uppOutHandle, (Ptr)&transParam[0], BUFSIZE, NULL)) { System_printf("Issue to output stream failed."); System_abort("Issue to output stream failed\n"); }
执行完这句话后,寄存器状态对应为
然后在这里设断点
if (IOM_COMPLETED != GIO_issue(uppInHandle, (Ptr)&transParam[1], BUFSIZE, NULL)) { System_printf("Issue to Input stream failed."); System_abort("Issue to input stream failed\n"); }
执行完这句话,寄存器状态为
其中GIO_issue这句话内在的调用了函数
对比C6748关于UPP寄存器的手册,可以确认中断应该是触发的!
只是这里不大明白,为何UPIER为何不跟UPIES一样,不是0x1F,而是0x18(可以看到函数里面5个中断全设置了),这样的话,只算是设置了EOL和EOW中断,而没有ERR,UOR和DPE,所以UPISR也只能为0x18了。
不过没关系,从UPISR可以看到,关键的EOL和EOW都触发了(因为我这里只有一页的数据,lineCount = 1),但是随后,程序仍然没有进入中断服务程序,所以很奇怪!
于是,是不是uppRegisterIntrHandler(&(Upp_Instances[0]),uppIntNum,uppEvt,(EventCombiner_FuncPtr)uppIsr);出了问题?
接着我就将uppRegisterIntrHandler(&(Upp_Instances[0]),uppIntNum,uppEvt,(EventCombiner_FuncPtr)uppIsr);这句话屏蔽掉,改用CFG进行配置中断服务程序,除了之前的
现在加了两句
试了一下,还是无法进入中断服务程序uppIsr,现在也不知道是怎么回事了?