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.

[参考译文] CC3220SF:CC3220sf-外部中断问题(CC3220挂起)

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/875577/cc3220sf-cc3220sf-external-interrupt-issue-cc3220-hangs

器件型号:CC3220SF

您好!

我一直在使用 CC3220sf launchpad 并在 WiFi 门锁参考设计( TIDC-01005)上开发我的应用 。

我写了一个逻辑 、用于在电路板上按下开关5秒钟时发布 MQTT 消息。当按下 开关5秒钟时、控制器会被挂起。我需要在之后重置它。

我甚至无法调试这个问题、因为我不清楚它何时发生、无论是开关问题还是逻辑问题。

我之前甚至评论了 MQTT 发布 API、认为它可能会导致这种情况。 但它仍然挂起、以确保它是开关或中断逻辑问题。

我更换了电路板上的开关、工作了半小时、我认为是开关问题、但新开关也突然再次出现了问题。

我使用的逻辑是 GPIO 作为双边沿的外部中断当按下按钮时,计时器开始计数,直到 5秒,当我离开时,任务将被执行。

我甚至将按下按钮超时减少到1秒。它仍然挂起。

我不明白为什么它会使控制器挂起? 如何解决这一问题?

注意:我使用的中断逻辑与 WiFi 门锁参考 project.it 中使用的中断逻辑相同、甚至还有软件去抖计时器。

此致

Sanath

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

    您好、Sanath、

    请提供显示您的问题的简明代码(CCS 项目)。 之后、有人可以查看它。

    1月

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

    您好、Jan、

    昨天测试后,我想问题可能是  UART_write() ,这使得它在极少数情况下挂起 sometimes.it。当 UART_write 被回调时,它挂起,但在我的应用程序中,我在按下按钮1秒钟后调用它。 在极少数情况下、它仍然挂起。 我不明白为什么。

    更新:我从回调中删除了 UART_WRITE 并对其进行了测试。它的工作没有任何问题。只有当我将 UART_WRITE 放入回调中时、此问题才会定期发生。

     

    下面的任何方法都是 GPIO 中断的回调。 这与我之前提到的 wifi 参考设计相同。

    去抖超时为200ms、保持超时为1秒

    当我按下1秒时、我将 通过 UART_WRITE 函数传输 UART 数据。

     

    void  pushButtonInterruptHandler2 (uint_least8_t 索引){

    GPIO_DisableInt (Board_BUTTON0);

    GPIO_clearInt (Board_BUTTON0);

    if (!pressStarted1)

    pressStarted1 = true;
    debounceInProgres1 = true;

    Platform_TimerStart (debounce_timer_timeout、debounceTimer1、0);
    Platform_TimerStart (HOLD_TIMER_TIMEOUT、HOLDTimer1、0);

    }如果(pressStarted1 &&!debounceInProgres1 &&!threeSecondPress1),则为其他

    /*结束印刷事件*/
    pressStarted1 = false;
    Platform_TimerStop (保持 Timer1);

    GPIO_enableInt (Board_BUTTON0);

    否则(pressStarted1 &&!debounceInProgres1 && threeSecondPres1)

    睡眠(4);
    UART_WRITE (uartHandle、"^[B]>"、5);

    pressStarted1 = false;
    三级预置1 = false;
    Platform_TimerStop (保持 Timer1);


    GPIO_enableInt (Board_BUTTON0);

    保持计时器

    保持 TimerIntHandler1 (sigval)


    if (!threeSecondPres1)

    /*切换 LED 以指示检测到长按*/


    三级预置1 = true;
    /*重置计时器*/
    Platform_TimerStart (HOLD_TIMER_TIMEOUT、HOLDTimer1、0);


    去抖动 TimerIntHandler1 (sigval)

    去抖动 InProgres1 = false;
    GPIO_enableInt (Board_GPIO_BUTTON0);

    /*读取 GPIO 边沿以检测在去抖间隔期间是否按压结束*/
    if (!GPIO_Read (Board_GPIO_BUTTON0))

    /*检测到无效的按压操作、重置按钮状态*/
    pressStarted1 = false;

    /*停止保持计时器*/

    Platform_TimerStop (保持 Timer1);

    谢谢、

    Sanath

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

    您好、Sanath、

    很抱歉、我无法理解您的代码。 借助所有"启用和禁用中断"、"二进制变量"和"如果存在其他中断、我无法确定该代码是否存在问题。 如果没有调试实数代码、我将无法执行此操作。

    BTW... 我不喜欢您在中断中调用 sleep()。 在中断中使用 UART_write()也应该避免。

    1月

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

    您好、Sanath、

    更好的软件设计是通过回调发布信标、或设置稍后处理 UART 写入的标志。  

    此外、很难遵循该代码。 请使用工具栏上的语法突出显示器。

    Jesu

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

    您好、Jan、

    很抱歉提供代码。

    感谢您的建议。

    我想问题是在回调中调用 UART_WRITE。

    我会查看并返回。

    此致

    Sanath。

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

    您好、Jesu、

    感谢您的建议。

    我将在我的代码中进行这些更改并尝试它们。

    此致、

    Sanath

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

    您好!

    中断处理程序内调用 UART_WRITE 时出现问题。

    我从那里删除了它、现在问题已解决。

    我将找到一种通过其他方式调用 UART_WRITE 的方法。

    此致

    Sanath