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.

[参考译文] TMS320F28379D:使用 SYS/BIOS 的 GPIO 中断配置

Guru**** 2606725 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1045690/tms320f28379d-gpio-interrupt-configuration-using-sys-bios

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

您好!

我想知道是否有一个使用 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);
        }
    }

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

    原始的"PIE"示例是否符合您的预期? 你能看看 ROV 中的 Hwi 模块来看看那里是否有什么问题吗?

    您能否检查中断使能寄存器以确认中断35未以某种方式被禁用? 请参阅"CCS Registers"窗口中"Core Registers"下的 IER.INT1和 ST1.INTM 以及"PieCtrlRegisters"中的 PIEIER1.INTx4。

    惠特尼

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

    尊敬的惠特尼:

    感谢您指向寄存器。   我 的系统初始化函数之一禁用了 IER.INT1。

    中断正在工作。

    非常感谢!  

     

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

    尊敬的惠特尼:

    我的中断有一个新问题

    现在、我尝试使用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);

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

    很高兴您能找到解决方案。 听起来可能是按钮信号有点吵的问题、因此启用资质后修复了这一问题、这并不奇怪。

    惠特尼