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.

[参考译文] TM4C1294NCPDT:运行 TI-RTOS 的 TIVA CPU 上只有一个引脚输入上的 IRQ

Guru**** 2550410 points
Other Parts Discussed in Thread: TM4C1294NCPDT, SYSBIOS, EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1080917/tm4c1294ncpdt-irq-on-only-one-pin-input-on-a-tiva-cpu-running-ti-rtos

部件号:TM4C1294NCPDT
“线程:测试SysBIOSEK-TM4C1294XL”中讨论的其它部件

我目前没有测试 IRQ 的好方法,所以我想问一个问题,这是否是最佳方法,至少可以对仅使用 IRQ 针脚 D6的 IRQ 进行编程。  在端口 D 上,我有2个输入引脚(D4和 D6),我只想中断引脚 D6而不是 D4。  这些问题更像是代码审查问题的本质。

我将使用具有 CCS 6.1.2和 TIRTOS 2.16.0.08的 TM4C1294NCPDT。

下面是我目前拥有的代码:

#define port_D_in_pins             (GPIO _PIN_4 + GPIO _PIN_6)

使 initPort_D 无效(void)

                       无符号长端口= GPIO _PORTD_BASE;

                       HWI_HANDLE myHWi;

                       哈维·帕拉姆 ·哈维·帕拉姆;

                       ERROR_Block EB;

 

 

                       SysPeripheralEnable(端口);//启用端口

                       

                       small_delay;//调用 SystlPeripheralEnable()时,需要一个小的延迟才能使用设备。

 

                       //配置输入

                       ROM_GPIODirModeSet (端口,端口_D_IN_Pins,GPIO _DIR_MODE_IN);

                       MAP_GPIOPadConfigSet (端口,端口_D_IN_Pins,GPIO 强度_2mA,GPIO 引脚_TY_STD_WPU);

 

                       //定义引脚 D6上的输入 IRQ

                       GPIOIntEnable (端口,GPIO _INT_PIN_6);//从 TivawareDoc 启用引脚6上的中断

                       GPIOIntTypeSet (端口,GPIO _INT_PIN_6,GPIO 下降边缘);// 从 TivawareDoc 将 IRQ 定义为下降边缘

 

 

                       ERROR_INIT(&E);

                     HWI_Params_init(&hwParams);

                     hwiparams.arg = 10;// pass 函数一个10的参数,只是因为…。

                     hwiparams.enableInt = true;   //默认情况下启用 IRQ。

                     myHWi = HWI_CREATE (INT_GPIOD_TM4C129,portD_IntHandler,&hwiparams,&EB);//将 IRQ INT_GPIOD_TM4C129 (19)与 TI_RTOC 2.0文档的回调函数 portD_IntHandler()相关联

                     IF (NULL == myHWi)

                     {

                                             printf (“为端口 D\n 安装 IRQ %d 时出错”,INT_GPIOD_TM4C129);

                     }

                     否则

                     {

                                             printf ("为 端口 D\n",INT_GPIOD_TM4C129安装 IRQ %d 的正常");

                     }

                     GPIO 启用 Int (GPIO_INT_PIN_6);    );//不需要,因为 IRQ 由 hwiparams.enableInt = true;

                     HWI_enableInterrupt (INT_GPIOD_TM4C129); //不需要,因为 IRQ 由 hwParams.enableInt = true;

}

 

端口 D_IntHandler (UArgarg)

       静态 int intCounter=0;

 

       system_printf ("portD_Intfied Handler %d 次\n",intCounter++);

 

}

我似乎正在混合一群来自 BIOS 用户指南的高级调用,如 HwI_create(),以及来自蒂瓦夫的较低级调用 GPIOIntEnable()和 GPIOIntTypeSet ()。  这看起来是否能满足我的需要,因为 D4只是我刚才读取的标准输入引脚,而引脚 D6是一个输入引脚,当它变低时会生成 IRQ?  我认为我无法获得 精确控制 ,只能使用 TI-RTOS API 将引脚 D6配置为 IRQ,而 D4仅配置为输入引脚。

感谢您的任何建议,

道格

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

    您好,Doug,

     我真的没有发现 问题。  您应该能够组合以下两行

                           ROM_GPIODirModeSet (端口,端口_D_IN_Pins,GPIO _DIR_MODE_IN);

                           MAP_GPIOPadConfigSet (端口,端口_D_IN_Pins,GPIO 强度_2mA,GPIO 引脚_TY_STD_WPU);

    使用:

                MAP_GPIOPinTypeGPIOInput (端口端口 D_IN_Pins);

    但是,即使不更改代码,只要让 Hwi 管理中断,代码也应该正常工作。 请勿在内核所知之外执行以下类似操作来注册 ISR。 它可能会打乱由 SysBIOS 管理的中断矢量。  

      GPIOIntRegister (端口portD_IntHandler);

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

    感谢您的回复。  

    我昨天使用端口 D 发布的原始代码在我的项目中仍然存在,它正确安装 了 INT_GPIOD_TM4C129。   我还没有进行测试,但安装了 IRQ。

    我找到了一个 EK-TM4C1294XL 启动板,因此我可以在同一处理器上尝试相同/相似的代码,但使用启动板上的用户按钮来触发中断。   用户按钮连接到启动板上的 PJ0和 PJ1。  我复制了代码以及使用端口 J 引脚0和1所做的更改,这些引脚与启动板上的用户开关连接。  由于 对 HWI_CREATE()的调用返回 NULL,以下新代码在 HwI_CREATE()函数上失败。  当我更换 下面安装的 IRQ 时,我发现它也不适用于下面的 IRQ。

    #define INT_GPIOJ_TM4C129 67 // GPIO 端口 J
    #define INT_GPIOK_TM4C129 68 // GPIO 端口 K
    #define INT_GPIOL_TM4C129 69 // GPIO 端口 L


    在我的新代码中,我正在使用端口 J 发布以下 内容,我可以安装   INT_GPIOE_TM4C129    20  ,但它无法安装 INT_GPIOD_TM4C129,因为我认为它已经 安装了  

    我知道  INT_GPIOJ_TM4C129安装失败的一个原因是如果在其他位置安装了 INT_GPIOD_TM4C129 ,因为我也尝试在新代码中重新安装 INT_GPIOD_TM4C129,但也失败了。  

    其它哪些原因会导致 HWI_CREATE (INT_GPIOJ_TM4C129,portJ_IntHandler,&hwiparams,&EB)失败,但以前安装的 IRQ 除外?

    道格

    #define port_J_in_pins (GPIO PIN_0 + GPIO PIN_1)

    使 initPort_J_evalBoard 无效(void)

    无符号长端口= GPIO _PORTJ_BASE;
    HWI_HANDLE myHWi;
    哈维·帕拉姆·哈维·帕拉姆;
    ERROR_Block EB;

    SysPeripheralEnable(端口);
    small_delay;//调用 SystlPeripheralEnable()时,需要一个小的延迟才能使用设备。
    //进行输入
    ROM_GPIODirModeSet (端口,PORT_J_IN_Pins,GPIO,DIR_MODE_IN);
    MAP_GPIOPadConfigSet (端口,端口_J_IN_Pins,GPIO 强度_2mA,GPIO 引脚类型 STD_WPU);

    //在引脚 d6上输入 IRQ
    GPIOIntEnable (端口,GPIO 集成引脚_0);
    GPIOIntTypeSet (端口,GPIO _INT_PIN_0,GPIO 下降边缘);

    ERROR_INIT(&E);
    HWI_Params_init(&hwParams);
    hwiparams.arg = 12;// pass 函数参数为12。
    hwiparams.enableInt = true;//已启用 IRQ
    myHWi = HWI_CREATE (INT_GPIOJ_TM4C129,portJ_IntHandler,&hwiparams,&EB);
    IF (NULL == myHWi)

    printf (“为端口 J\n 安装 IRQ %d 时出错”,INT_GPIOJ_TM4C129);
    }
    否则

    printf (“为端口 J\n 安装 IRQ %d”,INT_GPIOJ_TM4C129);
    }
    //IntEnable(INT_GPIOD_TM4C129);
    //GPIO 启用内部(GPIO_INT_PIN_0);
    //HWI_enableInterrupt (INT_GPIOD_TM4C129);

    }//结束 void initPort_J(void)

    void portJ_IntHandler (UArgarg 参数)

    静态 int intCounter=0;

    system_printf("portJ_IntHandler 激发%d 次,arg =%d\n", intCounter++,arg);
    }

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

    您好,Doug,

     在 main()中,您是否调用了 Board_initGPIO? 如果您调用 Board_initGPIO (),它将自动设置 GPIO 的中断向量,包括 PJ 和 PD 以及许多其它。 我认为您的代码会干扰 Board_initGPIO ()所做的设置。  

     请参阅 TI-RTOS GPIO 中断示例。 您可以将此项目导入工作区。 本示例实际上使用 PJ0作为交换机来生成中断。  

    我对 TI-RTOS 不是很了解,但这是我在跟踪代码后发现的。  

    如果打开 项目的 gpiointerrupt.c,则会在 main()的开头看到下面的代码片段。  

    Int main (无效)

    /*呼叫板初始化函数*/
    Board_initGeneral ();
    Board_initGPIO ();
    Board_initUART ();

    如果跟踪 Board_initGPIO (),它将调用 GPIO _init(),如下所示:

    void EK_TM4C1294XL_initGPIO (void)

    /*初始化外围设备和引脚*/
    GPIO 初始化();
    }

    请查看下面的 GPIO 初始化:

    /*
    *========= GPIO 初始化=========
    *
    无效 GPIO 初始化()

    无符号 int i,j;

    initCalled = true;

    #IF 定义(TIVAWARE)
    如果((HWREG (sysctl_DID0)& sysctl_DID0_class_M)==
    sysctl_DID0_class_TM4C129){
    gpioInterrupt载体= gpioTM4C129 Interrupt载体
    }
    否则{
    gpioInterrupt载体= gpioTM4C123 Interrupt载体;
    }
    #endif

    /*使用“未配置”键初始化所有条目*/
    对于(i = 0;i < NUM_PORTS; I++){
    对于(j = 0;j < NUM_PINS_PL_PORT_PORT;j++){
    gpioCallbackInfo[i]。pinIndex[j]= callback_index_not 配置;
    }
    }

    /*根据静态阵列内容配置 PIN 并创建 Hwis */
    对于(i = 0;i < GPIODIA_CONFIG.NumberOfPinConfigs;I++){
    如果(!(GPIOTIA_CONFIG.PINConfigs[i]和 GPIO _do_non_config))为{
    GPIO 设置配置(I,GPIOTIA_CONFIG.PINConfigs[i]);
    }
    如果(i < GPIOTIA_CONFIG.NumberOfCallbacks)为{
    如果(GPIOTiva_config.callbacks[i]!= NULL)为{
    GPIO 设置回调(I,GPIOTiva_config.callbacks[i]);
    }
    }
    }
    }

    gpioTM4C129 Interrupt载体 的定义如下:

    静态连接 uint8_t gpioTM4C129 Interruptedics[]={
    INT_GPIOA_TM4C129,INT_GPIOB_TM4C129,INT_GPIO_TM4C129,
    INT_GPIOD_TM4C129,INT_GPIOE_TM4C129,INT_GPIOF_TM4C129,
    Int_GPIOG_TM4C129,INT_GPIOH_TM4C129,INT_GPIOJ_TM4C129
    Int_GPIOK_TM4C129,INT_GPIOL_TM4C129,INT_GPIOM_TM4C129,
    INT_GPION_TM4C129,INT_GPIOR_TM4C129,INT_GPIO_TM4C129,
    Int_GPIOT_TM4C129,INT_GPIOP0_TM4C129,INT_GPIOP1_TM4C129,
    INT_GPIOP2_TM4C129,INT_GPIOP3_TM4C129,INT_GPIOP4_TM4C129,
    INT_GPIOP5_TM4C129,INT_GPIOP6_TM4C129,INT_GPIOP7_TM4C129,
    INT_GPIOQ0_TM4C129,INT_GPIOQ1_TM4C129,INT_GPIOQ2_TM4C129,
    INT_GPIOQ3_TM4C129,INT_GPIOQ4_TM4C129,INT_GPIOQ5_TM4C129,
    Int_GPIOQ6_TM4C129,INT_GPIOQ7_TM4C129
    };

    GPIO init()稍后将调用 GPIO 设置配置引脚以及这些引脚的 HWi。  

    在此示例项目中,还有一个 EK_TM4C1294XL.c 文件,用于定义此示例的引脚配置数组。 请参阅下面的片段。 您可以看到 SW1和 SW2的 PortJ 和 PortD 已插入。 这也许是您在调用 HWI_CREATE()以安装 PortJ 和 PortD 时获取 NULL 的原因。  

    /*
     * Array of Pin configurations
     * NOTE: The order of the pin configurations must coincide with what was
     *       defined in EK_TM4C1294XL.h
     * NOTE: Pins not used for interrupts should be placed at the end of the
     *       array.  Callback entries can be omitted from callbacks array to
     *       reduce memory usage.
     */
    GPIO_PinConfig gpioPinConfigs[] = {
        /* Input pins */
        /* EK_TM4C1294XL_USR_SW1 */
        GPIOTiva_PJ_0 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
        /* EK_TM4C1294XL_USR_SW2 */
        GPIOTiva_PD_0 | GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_RISING,
    
        /* Output pins */
        /* EK_TM4C1294XL_USR_D1 */
        GPIOTiva_PN_1 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
        /* EK_TM4C1294XL_USR_D2 */
        GPIOTiva_PN_0 | GPIO_CFG_OUT_STD | GPIO_CFG_OUT_STR_HIGH | GPIO_CFG_OUT_LOW,
    };
    
    /*
     * Array of callback function pointers
     * NOTE: The order of the pin configurations must coincide with what was
     *       defined in EK_TM4C1294XL.h
     * NOTE: Pins not used for interrupts can be omitted from callbacks array to
     *       reduce memory usage (if placed at end of gpioPinConfigs array).
     */
    GPIO_CallbackFxn gpioCallbackFunctions[] = {
        NULL,  /* EK_TM4C1294XL_USR_SW1 */
        NULL   /* EK_TM4C1294XL_USR_SW2 */
    };
    
    /* The device-specific GPIO_config structure */
    const GPIOTiva_Config GPIOTiva_config = {
        .pinConfigs = (GPIO_PinConfig *)gpioPinConfigs,
        .callbacks = (GPIO_CallbackFxn *)gpioCallbackFunctions,
        .numberOfPinConfigs = sizeof(gpioPinConfigs)/sizeof(GPIO_PinConfig),
        .numberOfCallbacks = sizeof(gpioCallbackFunctions)/sizeof(GPIO_CallbackFxn),
        .intPriority = (~0)
    };
    

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

    你是对的。  我的主页有一个 callBoard _initGPIO ();该调用:

    void EK_TM4C1294XL_initGPIO (void)

       /*初始化外围设备和引脚*/
       GPIO 初始化();
    }

    我无法跟踪  GPIO _init();甚至可以使用调试器在 GPIO.h 中进一步返回标题。

    如果我对 主调用板_initGPIO ()进行注释,我 现在可以安装 IRQ INT_GPIOJ_TM4C129。   

    您是否知道函数 GPIO _init()的源位置;?  如果我 在 main 中注释 Board_initGPIO (),则可能是我需要的东西丢失了。

    谢谢,

    道格

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

    您好,Doug,

     很高兴您正在取得进展。 如果您要使用 TivaWare 手动配置 GPIO 引脚(您仍然需要使用 Hwi 管理中断),那么我认为您不会因为评论  Board_initGPIO 而丢失任何内容。

     我能够在调试器中跟踪 GPIO INIT()。 我只需要一个步骤,就可以进入 GPIO 初始化()。 GPIO 初始化()位于 GPIOTIA.c 文件中,可在 C:\ti\tirtos_tivac_2_16_00_08\products\tidrivers_tivac_2_16_00_08\packages \ti\drivers\GPIO 目录中找到。  

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

    好的,我现在有消息来源。  我不得不“浏览到源代码”,但现在我可以在调试器中看到它。  我还有一两个问题。  我现在可以使用评估板上的用户按钮来触发 IRQ,但我想确保我清除了 IRQ,这样它就不会继续触发。  我首先尝试了注释行“GPIO _clearInt (INT_GPIOJ_TM4C129)”;它在执行该行代码时崩溃。  我使用的 GPIO _clearIn()函数是否错误?  然后我找到 了 GPIOIntClear(),文档说函数中的第二个参数是标志,所以我使用了 IRQ 编号"INT_GPIOJ_TM4C129    =67" 。  这是否纠正了函数 GPIO _clearIn()的正确参数?

    void portJ_IntHandler (UArgarg 参数)

       静态 int intCounter=0;

       //GPI_ClearInt (INT_GPIOJ_TM4C129);
       GPIOIntClear (GPIO _PORTJ_BASE,INT_GPIOJ_TM4C129);
       system_printf("portJ_IntHandler 激发%d 次,arg =%d\n", intCounter++,arg);
    }

    感谢所有的帮助!

    道格

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

    您好,Doug,

     我认为原因是您绕过 了由 Board_initGPIO ()调用的 GPIO _init()。   由于 GPIO 驱动程序尚未初始化,您无法使用任何 GPIO API。 有关 GPIO 驱动器,请参阅第5.5节。  

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

    感谢你的所有帮助。