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.

[参考译文] CC2340R5:具有 usleep (packet_INTERVALU)或 SLEEP (packet_INTERVALU)的外部中断(GPIO 中断)

Guru**** 2392905 points
Other Parts Discussed in Thread: CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1512876/cc2340r5-extrnal-intrupt-gpio-intrupt-with-usleep-packet_intervalu-or-sleep-packet_intervalu

器件型号:CC2340R5

工具/软件:

您好、

我正在使用 CC2340R5并成功实现了rfPacketTx示例代码、到目前为止、一切都正常运行。

现在、我想使用 GPIO 进行外部中断。 目标是每当发生外部中断时、

CC2340R5应从待机模式唤醒、传输数据、然后返回待机模式。

我还想使用内部中断、该中断是周期性的(例如每1秒或5秒)、

和安全功能。 因此、每次中断(无论是内部中断还是外部中断)时、CC2340R5都应从待机模式唤醒、传输数据、然后返回待机模式。

目前、我正在使用usleep(PACKET_INTERVAL)sleep(PACKET_INTERVAL)作为内部中断、这样可以正常工作。 但是、外部 GPIO 中断无法按预期工作。

您能否提供有关如何解决此问题并正确实现外部 GPIO 中断的指导?

提前感谢!

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

    你好 Dharmendra Kumar,

    我希望您做得好。 在我们的 SDK 中的驱动程序示例下有一个 gpiointerrupt 示例、该示例展示了我们如何设置外部中断来总结重要部分:

            /* Configure BUTTON1 pin */
            GPIO_setConfig(CONFIG_GPIO_BUTTON_1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
    
            /* Install Button callback */
            GPIO_setCallback(CONFIG_GPIO_BUTTON_1, gpioButtonFxn1);
            GPIO_enableInt(CONFIG_GPIO_BUTTON_1);

    我们设置外部 GPIO 的配置、然后设置回调(*如果需要)、最后启用中断。

    谢谢、
    Alex F

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

    您好 Alex、

    感谢您的快速答复。 当我单独使用外部中断或与一起使用Power_idleFunc()时,它工作正常。 但是、当我尝试将其与usleep(PACKET_INTERVAL)或一起使用sleep(PACKET_INTERVAL)时、外部中断停止工作。

    我想知道使用usleep()或是否有任何限制sleep()、具体来说、在这些功能处于活动状态时、是否不可能使用外部中断?

    谢谢、

    Kharmendra K

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

    你好 Dharmendra K,

    我测试了 gpiointerrupt.c 示例,但使用 sleep ();在一个 while 循环中测试上述注释;我能够确认回调仍然可以正常运行。 因此、使用这里的 sleep 函数应该没有问题。  

        while(1)
        {
        if (CONFIG_GPIO_BUTTON_0 != CONFIG_GPIO_BUTTON_1)
        {
            /* Configure BUTTON1 pin */
            GPIO_setConfig(CONFIG_GPIO_BUTTON_1, GPIO_CFG_IN_PU | GPIO_CFG_IN_INT_FALLING);
    
            /* Install Button callback */
            GPIO_setCallback(CONFIG_GPIO_BUTTON_1, gpioButtonFxn1);
            GPIO_enableInt(CONFIG_GPIO_BUTTON_1);
        }
    
        sleep(10);
        }

    谢谢、
    Alex F

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

    尊敬的 Alex F:

    感谢您的快速答复。 根据您的说明、外部中断被正确触发。 但是、问题是该中断无法将芯片从睡眠模式唤醒。 当外部中断发生时、它会在 ISR 中设置一个标志、但程序仅在芯片在安排的睡眠持续时间后唤醒时检查并响应该标志。

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

    您好 Kumar、

    我刚刚测试了我的基本版本,你是正确的。 如果我将 gpiointerrupt 代码放入 rfpacketx 项目中、则数据包只会在睡眠持续时间之后发送、但是、如果我将传输代码置于 gpiointerrupt 的上下文(而是通过 mainthread)中、那么一旦调用外部中断、数据包就会立即关闭。

    因此、在本例中、将我们要立即在 gpiointerrupt 回调/函数(即 gpioButtonFxn0)内执行的代码放置在函数中。 我们也可以创建一些回调调用的自定义函数、但前提是需要。

    谢谢、
    Alex F