MSP430F5436A 锁定
MSP430F5436A Lock Up
我们有一款产品使用了 MSP430F5436A。它已经投入生产多年。在过去的几个月里,我们收到来自生产部门的报告,称一些设备没有完全关闭,它们的电源 LED 一直亮着。电源 LED 由 I2C GPIO 扩展器驱动,它没有直接连接到 MSP430。
当用户按下电源按钮时,MSP430 应该关闭许多外设,关闭电源 LED,然后进入 LPM2。定时中断会定期将其从 LPM2 唤醒,以检查是否已按下电源按钮以重新打开设备并执行其他一些内务处理。
用户按下电源按钮后,设备关机前会有延迟,这是通过定时器 ISR 驱动的。我把它撕掉并放入一个延迟循环。在该延迟循环中,我快速切换直接连接到 MSP430 的不同 LED。
如果我使循环持续时间短于两秒,则设备能够成功进入 LPM,并且 LED 停止切换。如果我将循环设置为超过两秒,我可以观察到我所看到的锁定行为。有时 LED 会处于开或关状态,这是随机的。
我试图在进入循环之前禁用所有可屏蔽中断。那没有效果。我还在 SYSNMI
和 UNMI
向量中放置了代码,以检测它们中的任何一个是否在触发,而两者都没有触发。还有,没有RTOS,这是一个协作的多任务系统。所以它似乎在自己执行循环时被锁定了。
最终我的设备从此锁定重新启动,但这是由于看门狗重置。我在启动时打印重置源。如果我拔出并重新插入电池,设备也会恢复。但是,如果我将复位线拉低,设备将保持锁定状态。一旦设备被锁定,我也无法将固件 JTAGGing 到设备上。
我查看了 MSP430F5436A 的勘误表中提到的锁定行为,唯一提到的是不相关的。
不幸的是,由于设备的包装和结构,很难探测到一些网络,但并非不可能。
我可以使用调试器连接到设备,但调试器 (CCS 7 + MSP-FET430UIF) 在设备启动后不久就断开了与设备的连接 运行。这是永远正确的事情,是一个设计问题。我们经常发生定时器中断,因此这种行为可能无法避免。
设备的电源稳定,它在我的工作台上运行,而不是在高 EMI/EMF 环境中。然而,当这个循环发生时,一些外围设备和电源将被关闭。因此,MSP430 的电源 rails 或 GPIO 引脚之一可能发生某种异常。
是什么导致了这种锁定行为?是否有任何我可以在重置时读取的持久寄存器可以给我线索,或者是否有任何 pins/nets 我可以探测可以给我线索?
更新:
我已经探测了 MSP430 的 VCC,rails MSP430 所连接的电源外设,以及复位线。我在锁定时没有看到任何这些变化。
编辑:
下面是我加的延迟循环
dprintf(PRINT_LOG, "Entering delay loop");
__disable_interrupt();
enable_backlight();
for(uint16_t j = 4u; 0u < j; --j)
{
__delay_cycles(14680064/20); // ~50mS delay w/ 14.680064 MHz MCLK
toggle_backlight();
}
disable_backlight();
__enable_interrupt();
dprintf(PRINT_LOG, "Exiting delay loop");
我错误地认为挂起发生在我的延迟循环中,因为中断被禁用,并且循环没有完成。事实证明循环是 运行 完成,并且在启用中断后,针对循环执行期间发生的事件进入 ISR。挂起发生在该 ISR 中。
延迟循环后不久(在时间上,但在代码中的其他地方)禁用了 GPIO 中断。当我关闭设备时,一个保持引脚高电平的外围设备被关闭,并且该引脚最终下降。如果我使延迟循环变短,则退出循环,并且在引脚下降之前禁用该特定中断。如果延迟循环很长,则引脚下降,并且当 GIE 位被 __enable_interrupt();
重置时,上下文切换到该 GPIO 中断开始。
我们有一款产品使用了 MSP430F5436A。它已经投入生产多年。在过去的几个月里,我们收到来自生产部门的报告,称一些设备没有完全关闭,它们的电源 LED 一直亮着。电源 LED 由 I2C GPIO 扩展器驱动,它没有直接连接到 MSP430。
当用户按下电源按钮时,MSP430 应该关闭许多外设,关闭电源 LED,然后进入 LPM2。定时中断会定期将其从 LPM2 唤醒,以检查是否已按下电源按钮以重新打开设备并执行其他一些内务处理。
用户按下电源按钮后,设备关机前会有延迟,这是通过定时器 ISR 驱动的。我把它撕掉并放入一个延迟循环。在该延迟循环中,我快速切换直接连接到 MSP430 的不同 LED。
如果我使循环持续时间短于两秒,则设备能够成功进入 LPM,并且 LED 停止切换。如果我将循环设置为超过两秒,我可以观察到我所看到的锁定行为。有时 LED 会处于开或关状态,这是随机的。
我试图在进入循环之前禁用所有可屏蔽中断。那没有效果。我还在 SYSNMI
和 UNMI
向量中放置了代码,以检测它们中的任何一个是否在触发,而两者都没有触发。还有,没有RTOS,这是一个协作的多任务系统。所以它似乎在自己执行循环时被锁定了。
最终我的设备从此锁定重新启动,但这是由于看门狗重置。我在启动时打印重置源。如果我拔出并重新插入电池,设备也会恢复。但是,如果我将复位线拉低,设备将保持锁定状态。一旦设备被锁定,我也无法将固件 JTAGGing 到设备上。
我查看了 MSP430F5436A 的勘误表中提到的锁定行为,唯一提到的是不相关的。
不幸的是,由于设备的包装和结构,很难探测到一些网络,但并非不可能。
我可以使用调试器连接到设备,但调试器 (CCS 7 + MSP-FET430UIF) 在设备启动后不久就断开了与设备的连接 运行。这是永远正确的事情,是一个设计问题。我们经常发生定时器中断,因此这种行为可能无法避免。
设备的电源稳定,它在我的工作台上运行,而不是在高 EMI/EMF 环境中。然而,当这个循环发生时,一些外围设备和电源将被关闭。因此,MSP430 的电源 rails 或 GPIO 引脚之一可能发生某种异常。
是什么导致了这种锁定行为?是否有任何我可以在重置时读取的持久寄存器可以给我线索,或者是否有任何 pins/nets 我可以探测可以给我线索?
更新: 我已经探测了 MSP430 的 VCC,rails MSP430 所连接的电源外设,以及复位线。我在锁定时没有看到任何这些变化。
编辑: 下面是我加的延迟循环
dprintf(PRINT_LOG, "Entering delay loop");
__disable_interrupt();
enable_backlight();
for(uint16_t j = 4u; 0u < j; --j)
{
__delay_cycles(14680064/20); // ~50mS delay w/ 14.680064 MHz MCLK
toggle_backlight();
}
disable_backlight();
__enable_interrupt();
dprintf(PRINT_LOG, "Exiting delay loop");
我错误地认为挂起发生在我的延迟循环中,因为中断被禁用,并且循环没有完成。事实证明循环是 运行 完成,并且在启用中断后,针对循环执行期间发生的事件进入 ISR。挂起发生在该 ISR 中。
延迟循环后不久(在时间上,但在代码中的其他地方)禁用了 GPIO 中断。当我关闭设备时,一个保持引脚高电平的外围设备被关闭,并且该引脚最终下降。如果我使延迟循环变短,则退出循环,并且在引脚下降之前禁用该特定中断。如果延迟循环很长,则引脚下降,并且当 GIE 位被 __enable_interrupt();
重置时,上下文切换到该 GPIO 中断开始。