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.

[参考译文] MSP430F2617:无效的 CPU 启动

Guru**** 2528190 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1042433/msp430f2617-invalid-cpu-startup

器件型号:MSP430F2617

在测试我们的其中一款产品时、我们发现在启动时偶然检测到看门狗计时器(WDT)跳闸。

经进一步调查、发现 WDT 似乎在用户代码执行之前发生-这是通过使用`_LOW_LEVEL_INIT ()`函数来确认的、该函数会尽快将一个 GPIO 置为有效、然后在 WDT IFG 被置位时将另一个 GPIO 置为有效。 在后续的示波器捕获中、大多数器件相对较快(< 2ms)、表示未发生 WDT。 但是、某些器件似乎在经过一段很长的时间(>30ms)后出现、并在代码执行之前立即指示看门狗超时。 这个30ms 周期与预期看门狗持续时间(~1.1MHz 标称 CPU 速度、32768看门狗周期)非常接近。

捕获图例:

* CH1 (黄色)-电池使能信号(将电源从慢速开启稳压器切换到内部电池、这会快得多)

* CH2 (绿色)-检测到 WDT IFG、如果 WDT IFG 被置位、则会在_LOW_LEVEL_INIT 中置位高电平。 如果 IFG 为低电平、则该引脚无效

* CH3 (蓝色)-处理器开始执行__low_level_init ()时始终有效的 GPIO

* CH4 (粉色)- VCC 电源轨

图1:标称启动情况-执行__low_level_init ()并且未检测到 WDT 事件(绿色轨迹保持低电平)。



图2: 在执行代码之前、可以看到处理器在 WDT 置位的情况下开始执行我们的代码(绿色线迹变为高电平、蓝色线迹变为高电平)。

30ms 周期与看门狗周期密切一致这一事实似乎意味着 DCO/MCLK 正在运行、但我们的代码看起来没有执行、我们需要确定在此期间处理器中发生的确切情况。

问题:对于这些需要大于30ms 启动并指示立即看门狗的器件、CPU 在此期间将执行什么操作? 它是否已暂停? 它是否执行任意代码(例如在杂草中关闭)?

 

背景:

我们在设计中发现了一个带有指定错误旁路电容器的 LDO、这会导致 MSP430的 VCC 电源的上升速度比预期的慢。 当这个旁路电容器被预充电时、我们的电源启动得快得多、我们看不到这些看门狗/缓慢启动问题。

此问题仅发生在我们的少数产品上(例如、10%发生)、我们怀疑它与 VCC 启动过程相关。

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

    这种行为与初始化的数据"太大"且数据复制期间 WDT 超时的情况一致。 我想缓坡可能会影响"太大"的定义。

    通常的权变措施是添加类似[参考 CC 用户指南(SLAU132U)第6.9.1]节的内容

    int _system_pre_init(void) {
        WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog
        return(1);                  // You can finish C initialization now
    }

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

    我认识到数据初始化可能会导致这种情况,但正如我所指出的,我们使用的是`_low_level_init ()`,这是 IAR 版本的`系统_pre_init ()`,因此在进行任何数据初始化之前都要执行所有测量。

    我@了反汇编并验证了在启动代码 Δ Σ 复位中初始化 SP 后立即在指令中调用__low_level_init(),因此不会出现数据初始化导致这些意外看门狗的情况。

    我们还单独测量了数据初始化阶段、使其持续约7-8ms、因此我们知道这不是根本原因。

    上下文-为了清晰起见、下面附上了我们的低级初始化代码

    /**
     * Low-level pre-init code.
     *
     * @return Non-zero if segment initialization should continue normally. Zero if segment
     *         initialization should be skipped.
     */
    int __low_level_init(void)
    {
        // Debug code to indicate processor startup
        CHIP_GPIO_OUTPUT_HIGH(P3OUT, BIT6);
    
        // Debug code to flag initial watchdog indication
        if (IFG1 & WDTIFG)
        {
            CHIP_GPIO_OUTPUT_HIGH(P3OUT, BIT7);
        }
        else
        {
            CHIP_GPIO_OUTPUT_LOW(P3OUT, BIT7);
        }
    
        // (Not shown) Configure P3.6 and P3.7 as outputs
    
        // Wait for the supply to ramp up to at least 2.1V before configuring the internal battery.
        SVSCTL = (VLD1);
    
        // (Not shown) Wait for the SVS to turn on and indicate no low voltage
    
        // Disable the SVS to conserve power.
        SVSCTL = 0;
    
        // (Not shown) ... Enable power via the internal battery
        
        return 1;
    }

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

    很抱歉,我没有这种区别。 我不知道答案。 (我认为我在 F26-es 中没有看到过这种情况。) [有人?]

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

    1.非正常器件是否每次都能解决此问题? 如果是、您能否将电源设置为大约2V 以检查器件是否可以正常运行。

    2.您能否仅使用一个 while (1)循环和 GPIO 切换来测试非正常器件、以再次检查它与代码之间是否存在关系、但器件本身。

    我在数据表中唯一能找到的东西就是这个。 但 V (SVS_IT–)仅在电压从高电平变为低电平时工作。 很奇怪。

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

    1.否-问题非常间歇性(在某些测试期间、它会在50%的时间发生、但随后将进行数千次重试而不会失败)

    2.我们开发了一个定制应用程序,其中仅包含:

    # RESET vector set to start execution at 0x3100
    @ 0xFFFE: 0x3100
    
    # Startup routine
    @ 0x3100:
       MOV.W #0x30FC, SP
       CALL.A #__low_level_init
       
    # Low-level-init actually located at 0xAE78, flash address in mid memory
    @ __low_level_init:
        BIS.B #0x80, &P3OUT
        BIS.B #0x80, &P3DIR
        
        MOV.W #0x5A80,&WDTCTL
        
        # Infinite loop, implemented as 0x3FFF binary instruction.
        JMP PC

    然后、我们用0x4343 (NOP)填充闪存的其余部分、并以256字节的间隔放入以下指令:

    BIS.B #0x40, &P3OUT
    BIS.B #0x40, &P3DIR
    
    MOV.W #0x5A80, &WDTCTL
    JMP PC

    名义上、我们希望 P3.7有效。 正常运行的器件(例如、在 P3.7有效后无限循环)。 但是、我们偶尔会看到 P3.6生效、这向我们表明处理器正在闪存中执行任意代码。

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

    1.有线连接很好。 如果 P3.6生效、则表示 P3OUT 和 P3DIR 中的 BIT6被置位。

    2.由于无法始终重新创建、我认为它可能位于规格的边界。 由于数据表中的限制、很难判断路由原因是什么。 对于 MCU 状态、我不知道它是否在引导代码中被阻止、或者 CPU 甚至不工作。

    至少我们知道问题与电源有关。 您能否将电源电压设置为2V 并对其重新供电、以查看它是否能够正常运行至主函数。 这可能是一种消除某些不确定选择的方法。