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.

[参考译文] CCS/CC3220SF:多 GPIO 输入中断应用(I Live 问题)

Guru**** 2540720 points
Other Parts Discussed in Thread: CC3220SF, TMP116, TMP006

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/897307/ccs-cc3220sf-multi-gpio-input-interrupt-application-i-live-problem

器件型号:CC3220SF
主题中讨论的其他器件: TMP116

工具/软件:Code Composer Studio

您好!

我想测试多个 GPIO 输入中断、但我存在冻结问题。 我在"CC3220SF_SKB.c"、"CC3220SF_SKB.h"和"SKB_Board.h"库文件上设置引脚定义。 当我启动程序时、我只能看到 Input1 (GPIO-28)、 INPUT2 (GPIO-22)、 INPUT4 (GPIO-7)、 INPUT5 (GPIO-8) 回调函 数的消息、但在一段时间后、程序被冻结、我无法通过调试(UART0)从任何回调函数中获得任何应答。

另一方面、我无法从其他输入(INPUT3、INPUT6、INPUT7、INPUT8、INPUT9) 回调函数读取消息。 这些无法正常工作的输入是否存在配置错误? 为什么无法 激活这些输入的回调函数?

注意: 我将所有输入配置为 GPIO_CFG_IN_pu (内部上拉)和 GPIO_CFG_IN_INT_FALLING (中断在下降沿激活)。

(二    主代码   *********

/*
*==== gpiointerrupt.c ====
*
#include
#include

/*驱动程序头文件*/
#include
#include
#include

/*示例/板头文件*/
#include "SSKB_Board.h"

静态 Display_Handle hSerial;

/*
*==== gpioButtonFxn0 ===
* Input1上 GPIO 中断的回调函数。
*
void gpioButtonFxn0 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-28输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn1 =========
* Input2上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn1 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-22输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn2 =========
* Input3上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn2 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-5输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn3 ===
* Input4上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn3 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-7输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn4 ===
* Input5上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn4 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-8输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn5 ===
* Input6上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn5 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-9输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn6 ===
* Input7上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn6 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-3输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn7 =========
* Input8上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn7 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-4输入***\n");// UART-0发送 YAPILIYOR

/*
*==== gpioButtonFxn8 =========
* Input9上 GPIO 中断的回调函数。
*并非所有电路板都使用此功能。
*
void gpioButtonFxn8 (uint_least8_t 索引)

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Output1);
Display_printf (hSerial、0、0、"*** GPIO-30输入***\n");// UART-0发送 YAPILIYOR

/*
*==== mainThread ====
*
void * mainThread (void * arg0)

/*调用驱动程序初始化函数*/
GPIO_init();
display_init();

/*打开主机显示屏以输出*/
hSerial = Display_open (Display_Type_UART、NULL);
if (hSerial == NULL){
while (1);

Display_printf (hSerial、0、0、"*** GPIO 中断测试***\n");// UART-0发送 YAPILIYOR

/*配置 LED 和按钮引脚*/
GPIO_setConfig (Output1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Input1、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input2、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input3、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input4、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input5、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input6、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input7、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input8、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);
GPIO_setConfig (Input9、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_FALLING);

/*打开用户 LED */
GPIO_WRITE (Output1、Board_GPIO_ON);

/*安装按钮回调*/
GPIO_setCallback (Input1、gpioButtonFxn0);
GPIO_setCallback (Input2、gpioButtonFxn1);
GPIO_setCallback (Input3、gpioButtonFxn2);
GPIO_setCallback (Input4、gpioButtonFxn3);
GPIO_setCallback (Input5、gpioButtonFxn4);
GPIO_setCallback (Input6、gpioButtonFxn5);
GPIO_setCallback (Input7、gpioButtonFxn6);
GPIO_setCallback (Input8、gpioButtonFxn7);
GPIO_setCallback (Input9、gpioButtonFxn8);

/*启用中断*/
GPIO_enableInt (Input1);
GPIO_enableInt (Input2);
GPIO_enableInt (Input3);
GPIO_enableInt (Input4);
GPIO_enableInt (Input5);
GPIO_enableInt (Input6);
GPIO_enableInt (Input7);
GPIO_enableInt (Input8);
GPIO_enableInt (Input9);

while (1);

//返回(NULL);

(二    SKB_BOARD.h    

#ifndef __Board_H
#define __Board_H

#define Board_CC3220SF_LAUNCHXL

#ifdef __cplusplus
extern "C"{
#endif

#include

#define Board_initGeneral() Board_init()/*已弃用*/

#include "CC3220SF_SKB.h"

#define ADC0 CC3220SF_ADC0

//#define Board_CAPTURE0 CC3220SF_LAUNCHXL_CAPTURE0
//#define Board_CAPTURE1 CC3220SF_LAUNCHXL_CAPTURE1

//#define Board_CRYPTO0 CC3220SF_LAUNCHXL_CRYPTO0

#define Board_GPIO_on CC3220SF_GPIO_on
#define Board_GPIO_off CC3220SF_GPIO_off
#define Output1 CC3220SF_GPIO_OUT_9 // PIN-64 -红色 LED
#define output2 CC3220SF_GPIO_OUT_17 // PIN-8
#define Output3 CC3220SF_GPIO_OUT_22 // PIN-15
#define Output4 CC3220SF_GPIO_OUT_25 // PIN-21

#define Input1 CC3220SF_GPIO_IN_28 // PIN-18
#define Input2 CC3220SF_GPIO_IN_22 // PIN-15
#define Input3 CC3220SF_GPIO_IN_5 // PIN-60
#define Input4 CC3220SF_GPIO_IN_7 // PIN-62
#define Input5 CC3220SF_GPIO_IN_8 // PIN-63
#define Input6 CC3220SF_GPIO_IN_9 // PIN-64
#define Input7 CC3220SF_GPIO_IN_3 // PIN-58
#define Input8 CC3220SF_GPIO_IN_4 // PIN-59
#define Input9 CC3220SF_GPIO_IN_30 // PIN-53

#define Board_GPIO_TMP116_EN CC3220SF_LAUNCHXL_GPIO_TMP116_EN

#define I2C0 CC3220SF_LAUNCHXL_I2C0

//#define Board_I2S0 CC3220SF_LAUNCHXL_I2S0

/* CC3220SF_LAUNCHXL_SPI0为 NWP 保留*/
#define Board_SPI0 CC3220SF_LAUNCHXL_SPI1
#define BOARD_SPI_MASTER CC3220SF_LAUNCHXL_SPI1
#define Board_SPI_SLAVE CC3220SF_LAUNCHXL_SPI1

#define DEBUG_UART CC3220SF_UART0
#define IMU_UART CC3220SF_UART1

#define Board_WATCHDOG0 CC3220SF_LAUNCHXL_WATCHDOG0

/*特定于电路板的 I2C 地址*/
#define Board_TMP006_ADDR (0x41)
#define Board_I2C_TMP006_ADDR Board_TMP006_ADDR

#ifdef __cplusplus

#endif

#endif /*__Board_H */

e2e.ti.com/.../GPIO_5F00_INPUT_5F00_INTERRUPT_5F00_TEST_5F00_CCS.rar

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

    是否有更新??

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

    您好、Kemal、

    您的代码中没有任何内容可以立即向我发出声音。 您能描述一下您的计划是如何冻结的、以便我们更好地了解问题的确切位置吗?

    Jesu

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

    您好!

    下面是来自 UART0的我的调试数据。 ı 在我的 while (1)循环中添加了"usleep(1000);"。

    我将输入接地、然后转到回调函数。 因此、我得到的回答如下。

    调试输出:

    *** GPIO 中断测试***

    *** GPIO-22输入***

    *** GPIO-22输入***

    *** GPIO-22输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    *** GPIO-7输入***

    ***此时不能使用***

    一些输入测试试用我的运行代码冻结、我无法从串行端口或 LED 获得任何响应。 现在可以帮帮我吗?

    此外、为什么我无法激活 其他输入'(INPUT3、INPUT6、INPUT7、INPUT8、INPUT9) 回调函数?



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

    您能否尝试使用 CCS 调试器运行代码并查看代码在冻结后的结束位置? 我想知道您是否遇到某种硬件故障或只是代码卡住的错误。 我正在努力更好地理解当它是"冻结"时到底发生了什么。  

    Jesu

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

    您好!

    您能否指导我如何进行硬件中断调试? 我要将断点设置到哪个寄存器? 如果你逐步指引我、我会很高兴。 谢谢。  

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

    您好、Kemal、

    我只想知道、当发生此冻结时、代码中会发生什么情况。 如果您在冻结后暂停调试会话、您是否只停留在某些其他函数或某些硬件故障例程中? 了解这一点可以表明我们是处理应用程序问题还是驱动程序问题。

    此外、我还对您的代码进行了第二次查看、 我认为、在回调中执行任何其他操作之前、禁用 GPIO 中断(GPIO_disableInt)、然后在回调返回主循环或选择处理此清除操作的任何位置(GPIO_clearInt)时、重新启用中断(GPIO_enableInt)是不错的选择。 请尝试此操作、并告诉我它是否发生了任何变化。  

    Jesu

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

    您好!

    当我禁用回调函数中的 UART_WRITE (或 Display_printf)函数时、我的代码已在没有任何冻结的情况下运行。 因此,使用 UART_write()函数时回调函数内出现问题。

    我的多 GPIO 模板代码如下所示。 最后、您能否检查并评论它?

    谢谢。

    /*
    *==== gpiointerrupt.c ====
    *
    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include
    #include

    /*示例/板头文件*/
    #include "SSKB_Board.h"

    UART_Handle UART;

    /*
    *==== gpioButtonFxn0 ===
    * Input1上 GPIO 中断的回调函数。
    *
    void gpioButtonFxn0 (uint_least8_t 索引)

    GPIO_DisableInt (Input1);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Output1);
    //_UART_WRITE (UART、"*** GPIO-01输入***\n"、20);
    GPIO_clearInt (Input1);

    /*
    *==== gpioButtonFxn1 =========
    * Input2上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    *
    void gpioButtonFxn1 (uint_least8_t 索引)

    GPIO_DisableInt (Input2);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Output1);
    //_UART_WRITE (UART、"*** GPIO-22输入***\n"、20);
    GPIO_clearInt (Input2);

    /*
    *==== gpioButtonFxn2 =========
    * Input3上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    *
    void gpioButtonFxn2 (uint_least8_t 索引)

    GPIO_DisableInt (Input3);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Output1);
    //_UART_WRITE (UART、"*** GPIO-05输入***\n"、20);
    GPIO_clearInt (Input3);

    /*
    *==== gpioButtonFxn3 ===
    * Input4上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    *
    void gpioButtonFxn3 (uint_least8_t 索引)

    GPIO_DisableInt (Input1);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Output1);
    //_UART_WRITE (UART、"*** GPIO-07输入***\n"、20);
    GPIO_clearInt (Input4);

    /*
    *==== gpioButtonFxn4 ===
    * Input5上 GPIO 中断的回调函数。
    *并非所有电路板都使用此功能。
    *
    void gpioButtonFxn4 (uint_least8_t 索引)

    GPIO_DisableInt (Input1);
    /*清除 GPIO 中断并切换 LED */
    GPIO_TOGGLE (Output1);
    //_UART_WRITE (UART、"*** GPIO-08输入***\n"、20);
    GPIO_clearInt (Input5);

    /*
    *==== mainThread ====
    *
    void * mainThread (void * arg0)

    UART_Params uartParams;

    /*调用驱动程序初始化函数*/
    GPIO_init();
    UART_INIT();

    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 115200;

    UART = UART_OPEN (DEBUG_UART、uartParams);

    if (UART == NULL){
    /* UART_open()失败*/
    while (1);

    /*配置 LED 和按钮引脚*/
    GPIO_setConfig (Output1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (output2、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (Output3、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (Output4、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (Input1、GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_INT_RISING);
    GPIO_setConfig (Input2、GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_INT_RISING);
    GPIO_setConfig (Input3、GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_INT_RISING);
    GPIO_setConfig (Input4、GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_INT_RISING);
    GPIO_setConfig (Input5、GPIO_CFG_IN_PD | GPIO_CFG_IN_INT_INT_RISING);

    /*打开用户 LED */
    GPIO_WRITE (Output1、Board_GPIO_ON);
    GPIO_write (output2、Board_GPIO_on);
    GPIO_WRITE (Output3、Board_GPIO_ON);
    GPIO_write (Output4、Board_GPIO_on);

    /*安装按钮回调*/
    GPIO_setCallback (Input1、gpioButtonFxn0);
    GPIO_setCallback (Input2、gpioButtonFxn1);
    GPIO_setCallback (Input3、gpioButtonFxn2);
    GPIO_setCallback (Input4、gpioButtonFxn3);
    GPIO_setCallback (Input5、gpioButtonFxn4);


    while (1)

    /*启用中断*/
    GPIO_enableInt (Input1);
    GPIO_enableInt (Input2);
    GPIO_enableInt (Input3);
    GPIO_enableInt (Input4);
    GPIO_enableInt (Input5);

    //返回(NULL);