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.

[参考译文] CCS/TMS320F28388D:如何在 CPU1中触发 IPC 中断?

Guru**** 2193080 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/891832/ccs-tms320f28388d-how-to-trigger-ipc-interrupt-in-cpu1

器件型号:TMS320F28388D

工具/软件:Code Composer Studio

我尝试将消息队列从 CM 发送到 CPU1。 CM 看起来已成功发送消息队列。 但 CPU1中的中断不会触发。 以下 是两个内核的伪代码。  您能建议缺少什么吗? 谢谢。

在 CM main()中:

IPC_clearFlagLtoR (IPC_CM_L_CPU1_R、IPC_FLAG_ALL);

IPC_initMessageQueue (IPC_CM_L_CPU1_R、&messageQueue、IPC_INT0、IPC_INT0);

IPC_SYNC (IPC_CM_L_CPU1_R、IPC_FLAG31);

IPC_sendMessageToQueue (IPC_CM_L_CPU1_R、&messageQueue、IPC_ADDR_correction_enable、&TxMsg、IPC_Blocking_call);

while (1);

在 CPU1 main()中:

IPC_clearFlagLtoR (IPC_CPU1_L_CM_R、IPC_FLAG_ALL);

IPC_initMessageQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_INT0、IPC_INT0);

IPC_registerInterrupt (IPC_CPU1_L_CM_R、IPC_INT0、IPC_ISR1);

IPC_SYNC (IPC_CPU1_L_CM_R、IPC_FLAG31);

while (1);

在 CPU1中、

void IPC_ISR1()

  IPC_readMessageFromQueue (IPC_CPU1_L_CM_R、&messageQueue、IPC_ADDR_correction_enable、&RxMsg、IPC_NonBlocking_call);

  IPC_ackFlagRtoL (IPC_CPU1_L_CM_R、IPC_FLAG0);

我在调试模式下运行了两个内核。 我在 CM 中的 IPC_ISR1()内设置一个断点。 进入无限 while 循环后、CPU1中的标志 PIEIFR11.INTx9为0。 在 CM 中运行行 IPC_sendMessageToQueue()后,我检查了 PIEIFR.INTx9并发现该标志已设置。 但是、ISR 内的断点没有停止。 PIEIFR11.INTx9是 CMTOCPUxIPCINTR0中断的标志寄存 器、我认为该 IFR 标志对应于 IPC_FLAG0。  你能提供什么建议吗?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andy、

    您是否在 CPU1 (C28x)代码中启用 PIE 中断(INT1.INT13)和全局中断?

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    必须单独启用全局中断。 以为 Interrupt_enable()函数将启用全局中断,但它不启用。 如果已启用 INT、它将重新启用 INT。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在、我能够通过从 CM 发送队列消息来触发 CPU1中的 INT。

    在 ISR 例程中运行 IPC_readMessageFromQueue()时遇到另一个问题。 在进入函数之前、传递到函数的参数看起来不错、例如 IPC_CPU1_L_CM_R 和 messageQueue2.GetBuffer。 GetBuffer 的地址位于 IPC 消息缓冲区 CMTOCPURAM 0x038000的正确地址。 请参阅随附的图片:

    一旦我进入 IPC_readMessageFromQueue(),参数的值/地址就会变得混乱。 例如 IPC_CPU1_L_CM_R 变为-22004、messageQueue2.GetBuffer 的地址变为0x00。   

    您是否知道导致这种情况的原因? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Andy、

    您已将上一个帖子标记为已解决。 这是否意味着您能够找到问题并解决问题?

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的。 注意到 C28内核需要 __interrupt void 关键字,但 Cortex 内核不需要。