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.
我最近将一些代码从 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的主函数中:
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) // EINT; ERTM; Interrupt_register(INT_XINT1, &OverRangeISR); Interrupt_enable(INT_XINT1); // // MAIN loop // for(;;) { < main code loop here> } }
我还在 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初始化代码更改为如下:
// 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);
该行为未发生变化。 我将查看我的更改集、以确保在迁移过程中没有丢失任何内容。
当然、CPU2权限在文档中很模糊。 是否有描述行为和要求的良好文档? 我仅在数据表的脚注和 C2000Ware 示例中发现需要通过这种方式处理 GPIO 和外设。
感谢你的帮助。
杰伊
一种可能的权变措施是将所有 GPIO 和中断处理放入 CPU1中、并在检测到边沿时将 IPC 消息传递给 CPU2。 我宁愿不这样做。
好的、我将联系另一位有关中断的专家、查看在 CPU2上使用 XINT 是否需要任何其他配置。
想出来了。 已看到未在 CPU2上正确设置 XINTRegs。 当我手动启用 XINT1CR 寄存器(在本例中为0x5)时、会发出中断。
从这里、我深入了解了每个 CPU 需要哪些呼叫:
CPU1初始化代码:
// 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);
CPU2配置代码:
// 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);
基本上、需要在特定内核上配置 XINTRegs、并且我是在 CPU1上对它们进行配置的。
感谢您的指导。 如果存在多核系统外设的初始化技术、我仍会对一份清晰的文档感兴趣。
杰伊
感谢您发布解决方案 Jay、我将谈谈我们的团队如何为 多核系统上的外设创建更好的文档。
此致、
Omer Amir