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.

[参考译文] SIMPLELINK-MSP432-SDK:启用 GPIO 中断会在30小时后导致 I2C 故障

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1107490/simplelink-msp432-sdk-enabling-the-gpio-interrupt-causes-the-i2c-failure-after-30-hours

器件型号:SIMPLELINK-MSP432-SDK
主题中讨论的其他器件:MSP432P401R

大家好、

我将 MSP432P401R 与 FreeRTOS 配合使用。 当我将 GPIO 配置为处理中断时、I2C 读取故障在 I2C 从设备上自启动30小时后发生。

配置 GPIO 中断的方法:

GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);

/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);

/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);

GPIO 中断配置是否有任何原因会导致此类故障?

此致、

Amit

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

    进一步调试后、我们发现 当 GPIO_setCallback 被注释时、不会观察到 I2C 故障。 因此、GPIO_setCallback 会在 ~30小时后导致 I2C 故障。

    此外、当中断处理程序为空时、问题大约在7h 45分钟内发生、如果处理程序有一些代码、则问题在~30h 发生。

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

    Amit、您好!

    仅当您禁用中断但退出回调时、问题是否就会消失?   您是否认为这是运行时问题/堆栈内存泄漏?  您是否在失败时检查了堆栈指针?

    遗憾的是、不建议在新设计中使用 MSP432、并且不再维护或更新 MSP432 SDK。  我不能在我这边进行太多的调试。   

    谢谢、

    JD

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

    感谢 JD 的回应。  

    "仅当您禁用中断但退出回调时、问题是否会消失?"

    答案:是的

    您是否认为这是运行时问题/堆栈内存泄漏?  您是否在失败时检查了堆栈指针?

    答案:当问题发生时、故障持续1秒、则 I2C 通信开始正常工作。 如何检查堆栈指针? 我无法在调试模式下运行应用程序。

    是否有任何其他方法来配置中断? 我正在使用 FreeRTOS 项目。

    此致、

    Amit

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

    (已启用)引脚连接到什么? 您是否有理由怀疑它是(曾经)触发的?

    FreeRTOS 会为您的 ISR 设定最大优先级、而 TI 驱动程序似乎并不了解这一点。 我这里没有我的材料、但是每当我启用中断时、我都会使用类似的东西(来自存储器):

    > NVIC_setPriority (Port1_IRQn、 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);  

    我的经验是、违反此规定会导致 FreeRTOS 崩溃(无法恢复)、这与您的症状不符。 您是否正在使用看门狗(WDT)?

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

    中断未触发、I2C 故障仍然在~30小时发生。

    是已配置看门狗计时器。

     调用 GPIO_setCallback 时会发生什么情况、我们可以将其与问题相关?

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

    我不使用 TI 驱动程序、但相关源(在我的系统上)位于:

    C:\ti\simplelink_msp432p4_sdk_3_40_01_02\source\ti\drivers\gpio

    因此、您可以检查那里是否存在冲突。 我是在想知道它是否会清除端口引脚 IFG (确实如此)、所以我进行了挖掘。 虽然 GPIO_init()创建了一个信标,但它的作用似乎相当简单,我想知道它是否与 FreeRTOS 正常配合。

    我询问看门狗、因为如果系统锁定(出于任何原因)、看门狗会在一段时间后"修复"该情况、以便我们可以在诊断中考虑"致命"错误。

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

    JD、您好!

    如果我使用"GPIOMSP432_Config"结构中的"GPIO_CallbackFxn"寄存器中断、则不会观察到问题。  GPIO_setCallback 机制有什么问题?

    此致、

    Amit

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

    您好 Amit、

    因此、您会说、如果您在 GPIO_CallbackFxn 元素中静态定义回调函数、则代码会起作用。  但是,如果您使用 GPIO_setCallback()函数动态设置它,它最终会中断吗?   

    我在 TI 驱动程序 GPIO 文档中阅读了这两个文档、该文档可在以下 SDK 中找到: https://dev.ti.com/tirex/explore/node?node=ANw0S9TRUnZu6GuxbMlzjA__J4.hfJy__LATEST  

    唯一真正的区别应该是在编译工程时、一个是静态的、而不是动态加载的。  在功能上、我希望两者都能保持相同的工作方式。  动态运行时、指针是否可以保存在 RAM 中、并 在很长时间后以某种方式被破坏/覆盖?  

    谢谢、

    JD  

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

    是否还设置了相应的 portCallbackInfo[].pinindex[]元素? GPIO_init 将此设置为 callback_index_not _configured、因此如果您未(手动)设置、则不会调用回调。

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

    回调设置正确、并且在信号生效时调用处理程序。 当信号未发出时、该问题在正常情况下发生。 我们通过 I2C 读取传感器数据、工作正常、在~30小时后、我们看到 I2C 故障持续1秒、然后 I2C 通信开始正常工作。