主题中讨论的其他器件:C2000WARE
您好!
我想知道是否有一个使用 SYS/BIOS 配置 GPIO 中断的示例。
通用示例使用 PIE 矢量表、我想在使用 SYS/BIOS 时不应使用它。
谢谢、
Rashmitha
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.
您好!
我想知道是否有一个使用 SYS/BIOS 配置 GPIO 中断的示例。
通用示例使用 PIE 矢量表、我想在使用 SYS/BIOS 时不应使用它。
谢谢、
Rashmitha
您好、Rashmitha、
正确-您将使用 Hwi 模块、而不是配置 PIE。 我们没有专门为 XINT 执行此操作的示例、但"PIE"示例提供了有关如何创建 Hwi 实例的良好演示。 如果 您需要、此处提供了有关导入示例的说明。
除了 PIE 配置、GPIO 和 XINT 寄存器的配置方式应该保持大致相同、并且可以从用作参考的 C2000Ware 示例复制。
惠特尼
尊敬的惠特尼:
我根据您建议的示例创建了项目
在我的 app.cfg 中、我有以下代码
/* PIE group 1, interrupt 4 */ var interruptNum = 35; var hwiParams = new Hwi.Params(); hwiParams.arg = interruptNum; hwiParams.enableAck = true; hwiParams.maskSetting = Hwi.MaskingOption_BITMASK; hwiParams.disableMask = 0x0; hwiParams.restoreMask = 0x0; Hwi.create(interruptNum, "&gpioInterruptHandler", hwiParams);
在 GPIO_Initialization 中、我有以下代码
void GPIO_Initialisation()
{
GPIO_setPinConfig(GPIO_31_GPIO31);
GPIO_setDirectionMode(31,GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(31,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(31, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_34_GPIO34);
GPIO_setDirectionMode(34,GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(34,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(34, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_11_GPIO11);
GPIO_setDirectionMode(11,GPIO_DIR_MODE_IN);
GPIO_setQualificationMode(11,GPIO_QUAL_SYNC);
GPIO_SetupXINT1Gpio(11);
GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
GPIO_setInterruptPin(11, GPIO_INT_XINT1);
GPIO_enableInterrupt(GPIO_INT_XINT1);
}
其中一个驱动程序文件中的 ISR 如下所示
__interrupt void gpioInterruptHandler(void)
{
System_printf("gpioInterruptHandler\n");
System_flush(); /* force SysMin output to console */
GPIO_togglePin(34);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
我尝试使用按钮从 GPIO 11 (J8连接器上的 P11)读取数据、并查看 LED D9和 D10/GPIO 31/34上的响应
但我的 LED 从初始化开始就亮起、并且永远不会达到 ISR
您能不能建议出什么问题吗? 我已经检查了我的摆动和按钮。
您在配置文件中设置的 Hwi 看起来不错。 但是、您需要从 gpioInterruptHandler 中删除_interrupt 关键字-这对于 Hwi 函数来说是不必要的。
如果你在 gpioInterruptHandler 中放置一个断点、它是否会遇到它? 如果您在"Registers"窗口中手动设置 PIEIFR1.INTx4位该怎么办? 这是否会触发中断?
惠特尼
gpioInterruptHandler 中的断点未命中。
即使手动设置 PIEIFR1.INTx4位也不会触发中断。
Void PIE_post(Uns intNum)
{
Bits16 *PIEIFRPtr;
/* Flag PIE IFR */
PIEIFRPtr = (Bits16 *)PIEIER1_ADDR + (((intNum -
ti_sysbios_family_c28_Hwi_NUM_INTERRUPTS) >> 3) * 2) + 1;
*PIEIFRPtr |= (1 << (intNum & 0x7));
}
Void myTaskFxn()
{
while(1)
{
/* post PIE group 1, interrupt 4 */
System_printf("Posting PIE group 1, interrupt 35.\n");
System_flush(); /* force SysMin output to console */
PIE_post(35);
}
}尊敬的惠特尼:
我的中断有一个新问题
现在、我尝试使用3个中断 XINT 1/2/3
当我按下一个应该触发 XINT1的按钮时,它会随机地触发 XINT2或3以及 XINT1。 XINT2和3也会发生这种情况;将随机触发器推至其他触发器。
我修改了 app.cfg 文件、使其没有任何共享变量。
如果我添加 GPIO_setQualificationMode (gpioButton01、GPIO_Qual_3SAMPLE);
不会发生随机触发!
它是否会由于更快的中断处理而进行随机触发?
/* PIE group 1, interrupt 4 */ var interruptNum = 35; var hwiParams = new Hwi.Params(); hwiParams.arg = interruptNum; hwiParams.enableAck = true; hwiParams.maskSetting = Hwi.MaskingOption_BITMASK; hwiParams.disableMask = 0x0; hwiParams.restoreMask = 0x0; Hwi.create(interruptNum, "&gpioInterruptHandler1_Mode", hwiParams); /* PIE group 1, interrupt 5 */ interruptNum2 = 36; var hwiParams2 = new Hwi.Params(); hwiParams2.arg = interruptNum2; hwiParams2.enableAck = true; hwiParams2.maskSetting = Hwi.MaskingOption_BITMASK; hwiParams2.disableMask = 0x0; hwiParams2.restoreMask = 0x0; Hwi.create(interruptNum2, "&gpioInterruptHandler2_Case", hwiParams2); /* PIE group 12, interrupt 1 */ interruptNum3 = 120; var hwiParams3 = new Hwi.Params(); hwiParams3.arg = interruptNum3; hwiParams3.enableAck = true; hwiParams3.maskSetting = Hwi.MaskingOption_BITMASK; hwiParams3.disableMask = 0x0; hwiParams3.restoreMask = 0x0; Hwi.create(interruptNum3, "&gpioInterruptHandler3_Trigger", hwiParams3);
/*******************Configuation of LEDs*******************/
GPIO_setPinConfig(GPIO_58_GPIO58);
GPIO_setDirectionMode(gpioLED01, GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(gpioLED01,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(gpioLED01, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_61_GPIO61);
GPIO_setDirectionMode(gpioLED02, GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(gpioLED02,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(gpioLED02, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_122_GPIO122);
GPIO_setDirectionMode(gpioLED03, GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(gpioLED03,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(gpioLED03, GPIO_CORE_CPU1);
GPIO_setPinConfig(GPIO_123_GPIO123);
GPIO_setDirectionMode(gpioLED04, GPIO_DIR_MODE_OUT);
// GPIO_setPadConfig(gpioLED04,GPIO_PIN_TYPE_PULLUP);
GPIO_setMasterCore(gpioLED04, GPIO_CORE_CPU1);
/*******************Configuation of Buttons*******************/
GPIO_setPinConfig(GPIO_63_GPIO63);
GPIO_setDirectionMode(gpioButton01,GPIO_DIR_MODE_IN);
// GPIO_setQualificationMode(gpioButton01,GPIO_QUAL_SYNC);
GPIO_SetupXINT1Gpio(gpioButton01);
GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_BOTH_EDGES);
GPIO_setInterruptPin(gpioButton01, GPIO_INT_XINT1);
GPIO_enableInterrupt(GPIO_INT_XINT1);
GPIO_setPinConfig(GPIO_64_GPIO64);
GPIO_setDirectionMode(gpioButton02,GPIO_DIR_MODE_IN);
// GPIO_setQualificationMode(gpioButton02,GPIO_QUAL_SYNC);
GPIO_SetupXINT2Gpio(gpioButton02);
GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_BOTH_EDGES);
GPIO_setInterruptPin(gpioButton02, GPIO_INT_XINT2);
GPIO_enableInterrupt(GPIO_INT_XINT2);
GPIO_setPinConfig(GPIO_65_GPIO65);
GPIO_setDirectionMode(gpioButton03,GPIO_DIR_MODE_IN);
// GPIO_setQualificationMode(gpioButton03,GPIO_QUAL_SYNC);
GPIO_SetupXINT3Gpio(gpioButton03);
GPIO_setInterruptType(GPIO_INT_XINT3, GPIO_INT_TYPE_BOTH_EDGES);
GPIO_setInterruptPin(gpioButton03, GPIO_INT_XINT3);
GPIO_enableInterrupt(GPIO_INT_XINT3);