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/MSP432P401R:即使在更改发生后、程序也会挂起、等待更改

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/672330/ccs-msp432p401r-program-hangs-waiting-for-changes-even-after-the-change-occurs

器件型号:MSP432P401R

工具/软件:Code Composer Studio

在等待输入位更改以及等待中断例程中更改的变量更改时、我发生了这种情况。 如果我暂停该程序并立即运行、它可以正常工作。

等待位更改的部件是一个非常短的 while 循环、与另一个 while 循环相同、等待不同位在不同端口上更改。 我已经检查了端口方向寄存器、它是正确的。

等待变量更改的零件是等待测试变量更改的空循环。 它适用于第一次更改、但不适用于以后的更改。 再说一次、暂停并再次运行会使其正常运行。

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

    您可以随附代码的简化版本吗? 此外、无论您的应用使用的是 TI 驱动程序还是 DriverLib 函数调用、请告知我们您使用的是 SimpleLink SDK 版本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这会一直挂起、直到我暂停然后恢复:

        uint32_t chargeCount = 0;

        while (chargeCount = 0){

             if ((P6->IN & BIT6)=BIT6){

                  chargeCount++;

             }

        }

    工作正常:

    uint32_t risingEdgeCount = 0;

              //等待电流超过上限阈值

             while (risingEdgeCount!= 1){

                  if ((P2->IN & BIT6)=BIT6){

                        RisingEdgeCount++;

                  }

             }

    第一段代码第二次通过函数工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘记了、正在读取的引脚已通过调试器验证、可定义为输入、并且输入位为高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、

    变量是否声明为全局变量? 您是否还尝试在 Increment 语句中放置一个断点以查看条件是否正在执行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如代码中所示、变量在使用前立即声明。

    我在"IF 语句"之前放置一条语句、用于写入 LaunchPad 上的红色 LED、但它不执行。

    我第二次执行此函数时、它通常会起作用。

    它就像处理器将睡眠而不是唤醒。 我有一个 T32计时器中断处理程序、该处理程序应将其唤醒。 用户界面中断例程继续工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否正在使用 SlepOnIsrExit? 这可能会产生类似的症状。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    看看这是否会产生任何影响。

    volatile uint32_t chargeCount = 0;

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

    除了来自论坛成员的输入之外、您能否指定循环是在 main 中运行还是在中断处理程序中运行。 在中断处理程序内、您无需创建 while 循环、因为中断应唤醒 CPU、并且应设置该位的状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    该循环位于 main 中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    chargeCount 的值在哪里更改? 请显示与此变量相关的所有代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是唯一的地方。 它被设置为允许一些滤波。 我降低了测试值、以确保其正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在第一个循环中、如果使用 P2更改 P6、代码是否停止挂起? 如果是、请检查 P6位6是否已正确初始化、它应该与 P2类似。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../8561.gpio_5F00_input_5F00_interrupt.cHelloSteven

    我修改了最新 MSP432P4 SDK 中的 GPIO_INPUT_INTERRUPT 示例(请参阅随附的主代码)。 您提到的代码可以正常运行、无需停止和恢复。 我使用 ARM 编译器在 CCS 中运行代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的代码位于 main 中、而不是中断例程中。

    我不熟悉您使用的 MAP_GPIO 函数。 这些是标准吗? 在哪里可以找到有关这些信息的信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这没用。 我还试图将声明移到 main 的开头,但这没有帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我正在使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Steven

    从您的第一个帖子"我已经发生了这种情况、等待输入位更改、还等待在中断例程中更改的变量更改。" 在随后发布的中断例程中、我推断了该示例。

    其次、MAP_GPIO 函数作为 SDK 中 driverlib 示例的一部分提供。 您能否修改我提供的示例代码来重现此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试不要使用它(即 SlepOnIsrExit)、因为它可能会导致类似的症状。

    [编辑:已添加技术。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我输入断点尝试调试代码、但当我单步执行时、它会跳转。 它会向上或向下跳几行、然后再次返回。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这听起来像是工作中的优化器。 您可以尝试-O0或(我所做的)与它一起生活。

    当您停止使用 SlepOnIsrExit 时是否开始执行此操作? 它实际上可能表示您的程序正在正常运行(更多)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它现在可以正确单步执行。
    它仍然在主例程中停止。 看起来它会进入睡眠状态、但点击"Pause"和"Run"即可进入睡眠状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您没有给我们提供太多背景信息、所以我们都很猜测。 您的计划有多大? 这是您可以发布的内容吗? 甚至只是 main ()?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我屏蔽了 SlepOnExit 位、现在它可以工作了!!!!
    我不知道为什么它在启用了 SlepOnExit 的情况下可以正常工作、但我不在乎。
    感谢你能抽出时间。 我非常感谢你们所有人对我的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您的(整个)程序不能使用 SlepOnIsrExit,则它是危险的。

    一般来说,一旦你进入那个模式,你不应该依赖 main()来完成任何事情--也许它会完成,也许它不会完成,这取决于中断何时关闭。

    我很高兴您再次跑步。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议。 我正在考虑让 SlepOnIsrExit 在 UART 处理程序中再次工作、以便它不会干扰基于 Timer32中断延迟特定时间的函数。 现在、我将检查 Timer32中断处理程序中设置的标志。 如果它由于其他原因从睡眠中唤醒、则返回到睡眠状态、直到 Timer32中断。 不再为我提供 SlepOnIsrExit。