This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6748的UPP口完成接收和发射数据后,无法进入其中断服务程序



使用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;

现在也不知道问题出在哪里,还请各位大神指点一下,非常感谢!

  • 检查一下中断状态寄存器,看看有没有触发

    这样可以定位问题是中断没触发还是触发后没响应

  • 观察中断状态寄存器之后,感觉确实是触发了的!

    在此处设置断点,

    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,现在也不知道是怎么回事了?

  • 找到原因了,没有注册回调函数,在UPP.C的驱动文件里面,绑定时,默认已经注册了中断服务程序,需要在这个中断服务程序里面调用一个回调函数,而这个回调函数我之前设置是空NULL,所以。。。