主题中讨论的其他部件: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;
返回台;
}
我们非常感谢您的任何指导!
谢谢!
田


