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.

[参考译文] TMS320F28377D:CPU2上的 GPIO 中断

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1206148/tms320f28377d-gpio-interrupts-on-cpu2

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

我最近将一些代码从 CPU1迁移到 CPU2。 我在 CPU1上启用了 GPIO 引脚、它们可以正常工作。 但我的一个输入引脚具有不再触发的边沿触发中断。

我在设置中肯定漏掉了某些内容。 是否有在 CPU2上使用 GPIO 中断的示例? 提前感谢。

CPU1初始化:

...

//配置引脚的边沿触发中断
GPIO_setMasterCore (mypin、GPIO_core_CPU2);
GPIO_setInterruptType (GPIO_INT_XINT1、GPIO_INT_TYPE_RISIN_EDGE);
GPIO_setInterruptPin (mypin、GPIO_INT_XINT1);
GPIO_enableInterrupt (GPIO_INT_XINT1);
GPIO_setQualificationMode (mypin、GPIO_QUAL_ASYNC);

...

CPU2代码:

...

__interrupt void MyPinISR (void)

GPIO_togglePin (testPin);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_GROUP1);
}

...

Interrupt_register (INT_XINT1、&MyPinISR);
Interrupt_enable (INT_XINT1);

...

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

    您好、Jay、

    只是为了澄清一下、由于这里没有包含所有代码、在程序的某个点达到了 Interrupt_register 和 Interrupt_enable 函数、对吗? 假设您为方向正确配置了 GPIO、那么您能向我展示如何配置输入 XBAR 吗?

    此致、

    Omer Amir

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

    对不起,我从我的代码中提取了相关的片段,不清楚。 在永久循环之前、Interrupt_register 和 Interrupt_enable 调用位于 CPU2的主函数中:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void main(void)
    {
    //
    // Initializes device clock and peripherals
    //
    Device_init();
    //
    // Initializes PIE and clears PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();
    //
    // Initializes the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();
    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我还在 CPU2上使用 CPUTimer1和 INT_Timer1、这可以正常工作。

    XBAR 在从 CPU1调用的 GPIO_setInterruptPin 中进行配置。 这些 API 来自 C2000Ware driverlib。

    此代码在 CPU1上全部运行后运行正常。 很明显、当搬到 CPU2时、我缺少初始化或所有权分配、但我不清楚这是什么。

    杰伊

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

    您好、Jay、

    我刚刚具体讨论了 XBAR_setInputPin 函数;此外、如果您正在为 CPU2配置 GPIO、最好的做法是执行所有其他 GPIO 配置 那样 调用  GPIO_setMasterCore 函数、因为这会将控制权交给 CPU2和该 CPU、我认为该 CPU 无法配置 GPIO、仅对其进行读取/写入。 如果您尝试一下、请告诉我、它仍然无法正常工作。

    此致、

    Omer Amir

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

    XBAR_setInputPin 在 C2000Ware 的 GPIO.c:GPIO_setInterruptPin 函数内调用。

    我将切换呼叫的顺序并进行尝试。 不过、该顺序适用于系统中的其他 GPIO。

    杰伊

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

    您好、Jay、

    CPU1的顺序无关紧要、因为 CPU1可以控制配置和读取/写入 GPIO、而我认为 CPU2只有在获得控制权后才能读取/写入。 如果它不起作用、请告诉我、我将与另一位专家联系、了解 CPU2对外设的权限。

    此致、

    Omer Amir  

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

    谢谢、Omer。 我将 GPIO 的 CPU1初始化代码更改为如下:

    Fullscreen
    1
    2
    3
    4
    5
    6
    // Configure edge-triggered interrupt for pin
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_RISING_EDGE);
    GPIO_setInterruptPin(myPin, GPIO_INT_XINT1);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
    GPIO_setQualificationMode(myPin, GPIO_QUAL_ASYNC);
    GPIO_setMasterCore(myPin, GPIO_CORE_CPU2);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    该行为未发生变化。 我将查看我的更改集、以确保在迁移过程中没有丢失任何内容。

    当然、CPU2权限在文档中很模糊。 是否有描述行为和要求的良好文档? 我仅在数据表的脚注和 C2000Ware 示例中发现需要通过这种方式处理 GPIO 和外设。

    感谢你的帮助。

    杰伊

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

    一种可能的权变措施是将所有 GPIO 和中断处理放入 CPU1中、并在检测到边沿时将 IPC 消息传递给 CPU2。 我宁愿不这样做。

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

    好的、我将联系另一位有关中断的专家、查看在 CPU2上使用 XINT 是否需要任何其他配置。

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

    想出来了。 已看到未在 CPU2上正确设置 XINTRegs。 当我手动启用 XINT1CR 寄存器(在本例中为0x5)时、会发出中断。

    从这里、我深入了解了每个 CPU 需要哪些呼叫:

    CPU1初始化代码:

    Fullscreen
    1
    2
    3
    4
    5
    // Configure interrupt for pin
    GPIO_setInterruptPin(myPin, GPIO_INT_XINT1);
    GPIO_setDirectionMode(myPin,GPIO_DIR_MODE_IN);
    GPIO_setQualificationMode(myPin, GPIO_QUAL_ASYNC);
    GPIO_setMasterCore(myPin, GPIO_CORE_CPU2);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    CPU2配置代码:

    Fullscreen
    1
    2
    3
    4
    5
    // Configure edge-triggered interrupt for pin
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_RISING_EDGE);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
    Interrupt_register(INT_XINT1, &MyPinISR);
    Interrupt_enable(INT_XINT1);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    基本上、需要在特定内核上配置 XINTRegs、并且我是在 CPU1上对它们进行配置的。

    感谢您的指导。 如果存在多核系统外设的初始化技术、我仍会对一份清晰的文档感兴趣。

    杰伊

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

    感谢您发布解决方案 Jay、我将谈谈我们的团队如何为 多核系统上的外设创建更好的文档。

    此致、

    Omer Amir