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.

[参考译文] MSP430G2553:从调用和实际执行停止 WDT 到停止的延迟

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1344956/msp430g2553-delay-from-stop-wdt-being-called-and-actually-being-executed

器件型号:MSP430G2553
主题中讨论的其他器件:MSP430WARE

您好!  

因此我一直在观察到这种奇怪的行为、我尝试写入闪存、但写入后立即会导致复位。 经过进一步调查、我们在其中一个论坛中发现"无法在闪存写入期间执行 CPU 指令"。 我们得出的结论是、即使我们 停止了 WDT 、仍需要等待一段时间才能设置 Erase 位、因为我们假设该位允许执行命令来 完全关闭 WDT。 我们查看的示例中的任何地方都没有记录这一点。 我们想知道这是预期行为还是其他潜在问题。 我们使用的是 MSP430ware_3_80_14_01。 下面的代码片段是我们是如何写入闪存的。

WDTCTL = WDTPW + WDTHOLD; 

// Wait inserted here

FCTL1 = FWKEY + ERASE;                  // Set Erase bit
FCTL3 = FWKEY;                          // Clear Lock bit
dest[0] = 0;                            // Dummy write to erase Flash segment
FCTL1 = FWKEY + WRT;                    // Set WRT bit for write operation

for (uint8_t i=0; i<size; i++)
{
    *dest++ = *settings++;
}

FCTL1 = FWKEY;                          // Clear WRT bit
FCTL3 = FWKEY + LOCK;                   // Set LOCK bit

WDTCTL = WDT_ARST_1000;

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

    CPU 在假写入之后(dest[0]=0)被保持、而不是在之前。 我计数8个周期、差不多或更少、在停止狗和开始擦除之间。

    本指南中的示例依次写入 FCTL2、FCTL3和 FCTL1。 顺序可能重要、也可能不重要、但 FCTL2中的设置有影响。 您是在其他地方设置的吗? 以使闪存时钟在规格范围内? 如果您尚未更改时钟配置、则默认值(MCLK/3)通常是可以的。

    MSP430是流水线型的、所以这个危害不是指令执行所花费的时间比您想象的长、而是指令在您预计之前开始执行。 这是因为在当前指令完成之前获取并调度下一条指令。 或多或少。 这就是通常在设置 LPM 模式后放置 NOP 的原因。 该指令要在 LPM 模式生效之前执行。