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.

[参考译文] MSP430F5438A:启用时PMM SVSM异常行为

Guru**** 2538930 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1091522/msp430f5438a-pmm-svsm-strange-behavior-when-enabled

部件号:MSP430F5438A
主题中讨论的其他部件:MSPWARE

您好!

我们使用MSP430为我们的定制 器件执行室内维护功能。 MSP430   使用SPI与外部处理器进行通信并接收代码升级。 我们将DCO用作MCLK (~22MHz),为了支持这一点,我们将Vcore提高到3级。  

我们始终禁用SVSM的高侧和低侧(DVcc和Vcore)以节省电源, 我们注意 到MSP偶尔 会挂起。 中断在此状态下不起作用。 我们还启用了看门狗计时器,但它也不会重置。 这种情况很难重现,但我们认为它可以通过两种方式实现:

  • 我们推测,当该局发出临市局的临时市政局时,该局可如以下 网址所述,将会中止临市局的会议:https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/35.3287万/msp430-hangs-up-even-when-wdt-timer-is-enabled。 我们目前没有NMI/SNMI的处理程序,因此不确定是否发生了OFIFG。 我们正在考虑将WDT用作计时器,并在WDT中断处理程序中发出软BOR,这样它就不会发出POC。 这是否可以防止WDT悬挂MSP, 是否安全?
  •  我们可能会出现MSP电源电压下降的情况,但未进行确认。 由于我们禁用了SVSM,因此我们没有保护功能,因此我认为如果电源不稳定,MSP可能会挂起。  启用 SVSM会导致一系列意外问题:  
    • 如果启用SVSM低端,则会中断SPI通信。 我认为这 是因为SVSM触发POR/NMI,所以我将PMMRIE的整个寄存器设置为0,这种情况仍然发生。 为什么低侧SVSM会影响UCAx?  如果我连接调试器,则通信正常,表明存在耗材问题。 在探测外部Vcore引脚时,  无论 是否连接了调试器,当通信失败时,我都看到稳定的1.92V (3级)。  如果Vcore稳定,为什么SVSM低端会做些什么?
    • 如果我们启用SVSM高端,它将中断MSP升级(通过SPI通信,大量闪存写入)。 我不相信它是 由SVSM触发POR/NMI引起的,因为我将PMMRIE设置为0。  为什么高端SVSM会影响UCAx?  如果我在连接调试器时执行升级,它可以正常工作。 我在升级过程中探测了DVcc,并且看到了稳定的3.3V电压,不管我是否连接了调试器。 如果DVcc稳定,为什么SVSM高端会做什么?

我在 下面提供了相关的代码片段,这与  MSPWARE PMM驱动程序库基本相同。

///将PMM内核设置为特定电压
///@param[IN]调平要设置的电压电平
///@返回呼叫成功
布尔系统时钟::configVCore (uint16_t级别)

UINT16_t实际值;
布尔状态=真;

//为最大级别设置掩码
级别&= PMMCOREV_3;
//获取实际值
实际=(PMMCTL0和PMMCOREV_3);

//逐步增加或减少
while (((level != actual)&& status)||(level < actual ))

IF (水平>实际值)
状态= incVCore(++actual);
否则
状态= decVCore(--actual);
}


返回true;
}

///将VCORE增加到指定的值
///@param[IN]调平要设置VCORE的级别
///@返回呼叫成功
布尔系统时钟::incVCore (uint16_t级别)

UINT16_t PMMRIE_BACKUP,SVSMHCTL_BACKUP,SVSMLCTL_BACKUP;
布尔台=真;

//增加VCORE的代码流已被修改为有效
//围绕错误FLASH37。

//打开PMM寄存器以进行写入访问
PMMCTL0_H = 0xA5;

//禁用专用中断并备份所有寄存器
PMMRIE_BACKUP = U16 (PMMRIE);
PMMRIE &= N16(SVMHVLRPE | SVSHPE | SVMLVLRPE | SVSLPE | SVMHVLRIE | SVMHIE | SVSMHDLYIE | SVMLVLRIE | SVMLIE | SVSMLLYLIE ));
SVSMHCTL_BACKUP = U16 (SVSMHCTL);
SVSMLCTL_BACKUP = U16 (SVSMLCTL);

//清除标记
PMMIFG = 0;
//将SVM Highside设置为新级别,并检查是否可以增加VCORE
SVSMHCTL = SVMHE | SVSHE |(SVSMHRRL0 *级别);
//等待SVM高端解决
safeWait (&PMMIFG,SVSMHDLYIFG,FALSE);
//清除标记
PMMIFG &= N16(SVSMHDLYIFG);

//检查是否可以增加VCORE
IF ((PMMIFG和SVMHIFG)== SVMHIFG)

// VCC太低,不能增加VCORE,因此我们将恢复以前的设置
PMMIFG &= N16(SVSMHDLYIFG);
SVSMHCTL = SVSMHCTL_BACKUP;
//等待SVM高端解决
safeWait (&PMMIFG,SVSMHDLYIFG,FALSE);
RET =假;
}
否则

//还将SVS的高端设置为新的Vcc级别,其高到足以使VCORE增加
SVSMHCTL ||(SVSHRVL0 *级别);
//等待SVM高端解决
safeWait (&PMMIFG,SVSMHDLYIFG,FALSE);
//清除标记
PMMIFG &= N16(SVSMHDLYIFG);
//将VCORE设置为新级别
PMMCTL0_L = U8 (PMMCOREV0 *级别);
//将SVM,SVS低侧设置为新级别
SVSMLCTL = SVMLE |(SVSMLRRL0 *级别)| SVSLE |(SVSLRVL0 *级别);
//等待SVM,SVS低侧稳定下来
safeWait (&PMMIFG,SVSMLDLYIFG,FALSE);
//清除标记
PMMIFG &= N16(SVSMLDLYIFG);
// SVS,SVM核心和高端现已设置为针对新的核心级别进行保护
//恢复低端设置,清除除级别设置之外的所有其他位
SVSMLCTL &=(SVSLRVL0 | SVSLRVL1 | SVSMLRRL0 | SVSMLRRL1 | SVSMLRRL2);
//清除备份寄存器中的级别设置,保留所有其他位
SVSMLCTL_BACKUP &= N16 ((SVSLRVL0 | SVSLRVL1 | SVSMLRRL0 | SVSMLRRL1 | SVSMLRRL2);
//恢复低侧SVS监护仪设置
SVSMLCTL || SVSMLCTL_BACKUP;
//恢复高端设置。清除除级别设置之外的所有其他位
SVSMHCTL &=(SSVSHRVL0 | SVSHRVL1 | SVSMHRRL0 | SVSMHRRL1 | SVSMHRRL2);
//清除备份寄存器中的级别设置,保留所有其他位
SVSMHCTL_BACKUP &= N16(SSVSHRVL0 | SVSHRVL1 | SVSMHRRL0 | SVSMHRRL1 | SVSMHRRL2 ));
//恢复备份
SVSMHCTL || SVSMHCTL_BACKUP;
//等待高/低侧稳定下来
safeWait (&PMMIFG,SVSMHDLYIFG,FALSE);
safeWait (&PMMIFG,SVSMLDLYIFG,FALSE);
}

//清除所有标志
PMMIFG &= N16(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG | SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG));
//恢复PMM中断启用寄存器
PMMRIE = PMMRIE_BACKUP;
//禁用SVSM以防止在升级过程中挂起
//SVSMHCTL &= N16 ((SVMHE | SVSHE));
//SVSMLCTL &= N16 ((SVMLE | SVSLE));
//锁定PMM寄存器以进行写入访问
PMMCTL0_H = 0x00;

返回台;
}

 我们非常感谢您的任何指导!

谢谢!

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

    您好,Tian

    5438 enabled"]此解决方案是否可以防止WDT挂起MSP,是否 安全?

    这种情况的风险是MCU在执行某些ISR时挂起,或者进入某些中断但没有ISR时挂起, 将不会执行WTD的ISR。 我建议确保代码中的ISR简短,并 确保所有启用 的中断或NMI都具有ISR。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    启用 SVSM会导致一系列意外问题

    对于此问题,您可以尝试以下两种方法:

    1.  启动时检查SYSRSTIV,您可以看到 在SPI出现故障时SVS是否触发POR  

    2.在 调试模式下运行代码后,您能否向我显示SVSMHCTL和SVSMLCTL的寄存器值

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

    谢谢Gary,我们一定会考虑这一点。

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

    感谢 Gary的建议!

    我 为UNMI和SNMI设置了处理程序,ISR发布BOR。 启用SVSM后,SPI通信始终失败,但MSP未重置,因此我认为这不是SVSM中断或POR,而是与SVSM相关的其它内容。   

    启动后 ,MSP通常会运行 incVCore() 3次以达到级别3,之后我尝试读取 c 和 SVSMHCTL,并为两者读取0x4400。 所以这里没有什么特别之处。

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

    对于SVSMHCTL和SVSMLCTL,HI不 应为0x4400, SVSHRVL和 SVSMHRRL, SVSLRVL和 SVSMLRRL应为0x3,如下所示

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

    您好,Gary:

    感谢您的回复。 我使用了CCS视图寄存器工具,这次它看起来是正确的。

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

    我看到您创建了配置VCORE的功能,如何使用我们在演示代码(如  https://dev.ti.com/tirex/explore/node?node=ACn5myI1UKFNTOYH3qcXnQ__IOGqZri__LATEST)中使用的演示功能 

    这也是一个SPI演示代码,您在自己的一侧测试时,只需将时钟频率修改为22MHz,将Vcore修改为级别3

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

    谢谢Gary,

    我 使用了与 示例相同的setVCoreUp()函数,行为相同,SPI通信中断。 经过仔细研究和调查后,我们发现,SOMI和SIMO的通讯实际上都在进行。 信号完整性正常。 我们实际上能够成功地接收一些传输,但不能始终如一地接收。 SOMI方面的表现似乎更差。 此外,我们发现,如果我们在 尝试与蓝牙连接同时进行SPI通信(使用来自另一 个USCI模块的UART),MSP将挂起(WDT在此状态下也不工作)。 我可以理解,如果发生了大量中断,则可能会错过一些传输,但 不应 使MSP挂起。  

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

    我建议始终启用WDT,即使间隔较长(例如 16秒),因此,如果有任何SPI总线挂起,则至少430将重新启动。 我还喜欢读出重置原因,并在430启动时将其显示在控制台;这有助于了解它重置的原因。

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

    感谢您的回复。 我们通过处理NMI和禁用SVSM,对稳定性做了一些改进。 我还有一个问题,尽管SVSM已禁用(SVMHE,SVSHE,SVMLE和SVSLE),但我仍然启用 了SVSHPE和 SVSLPE。  如果电压低于阈值,POR是否仍会发生?

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

    很抱歉回复较晚,如果 禁用了SVMHE,SVSHE,SVMLE和SVSLE, SVS将不会触发POR。