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.

[参考译文] MSP430F6779A:是否可以在 LOCKAUX 被置位期间写入 AUXKEY?

Guru**** 2391195 points
Other Parts Discussed in Thread: MSP430F6779A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1315974/msp430f6779a-can-the-auxkey-be-written-during-lockaux-is-set

器件型号:MSP430F6779A


在 LOCKAUX 位被置位期间可以写入 AUXKEY 吗? (将 AUXCTL2配置为下面的代码)


AUXCTL0_H = AUXKEY_H;
AUXCTL2 = (AUXMR_0 | AUX0LVL_6 | AUX1LVL_5 | AUX2LVL_0);

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

    器件型号:MSP430F6779A

    在其他情况下、LOCKAUX 会被锁定而不复位吗?

    通过我们的系统发现有时(在极少数情况下) LOCKAUX 在调用 PMM API 后锁定而未复位

    下面提供

    PMM_setVCore (PMM_CORE_LEVEL_3);

    uint16_t PMM_setVCoreUp ( uint8_t level){
        uint32_t PMMRIE_backup, SVSMHCTL_backup, SVSMLCTL_backup;
    
        //The code flow for increasing the Vcore has been altered to work around
        //the erratum FLASH37.
        //Please refer to the Errata sheet to know if a specific device is affected
        //DO NOT ALTER THIS FUNCTION
    
        //Open PMM registers for write access
        HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0xA5;
    
        //Disable dedicated Interrupts
        //Backup all registers
        PMMRIE_backup = HWREG16(PMM_BASE + OFS_PMMRIE);
        HWREG16(PMM_BASE + OFS_PMMRIE) &= ~(SVMHVLRPE | SVSHPE | SVMLVLRPE |
                                              SVSLPE | SVMHVLRIE | SVMHIE |
                                              SVSMHDLYIE | SVMLVLRIE | SVMLIE |
                                              SVSMLDLYIE
                                              );
        SVSMHCTL_backup = HWREG16(PMM_BASE + OFS_SVSMHCTL);
        SVSMLCTL_backup = HWREG16(PMM_BASE + OFS_SVSMLCTL);
    
        //Clear flags
        HWREG16(PMM_BASE + OFS_PMMIFG) = 0;
    
        //Set SVM highside to new level and check if a VCore increase is possible
        HWREG16(PMM_BASE + OFS_SVSMHCTL) = SVMHE | SVSHE | (SVSMHRRL0 * level);
    
        //Wait until SVM highside is settled
        while ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
    
        //Clear flag
        HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
    
        //Check if a VCore increase is possible
        if ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVMHIFG) == SVMHIFG){
            //-> Vcc is too low for a Vcore increase
            //recover the previous settings
            HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
            HWREG16(PMM_BASE + OFS_SVSMHCTL) = SVSMHCTL_backup;
    
            //Wait until SVM highside is settled
            while ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
    
            //Clear all Flags
            HWREG16(PMM_BASE +
                OFS_PMMIFG) &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
                                 SVMLVLRIFG | SVMLIFG |
                                 SVSMLDLYIFG
                                 );
    
            //Restore PMM interrupt enable register
            HWREG16(PMM_BASE + OFS_PMMRIE) = PMMRIE_backup;
            //Lock PMM registers for write access
            HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
            //return: voltage not set
            return ( STATUS_FAIL) ;
        }
    
        //Set also SVS highside to new level
        //Vcc is high enough for a Vcore increase
        HWREG16(PMM_BASE + OFS_SVSMHCTL) |= (SVSHRVL0 * level);
    
        //Wait until SVM highside is settled
        while ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0) ;
    
        //Clear flag
        HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMHDLYIFG;
    
        //Set VCore to new level
        HWREG8(PMM_BASE + OFS_PMMCTL0_L) = PMMCOREV0 * level;
    
        //Set SVM, SVS low side to new level
        HWREG16(PMM_BASE + OFS_SVSMLCTL) = SVMLE | (SVSMLRRL0 * level) |
                                             SVSLE | (SVSLRVL0 * level);
    
        //Wait until SVM, SVS low side is settled
        while ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ;
    
        //Clear flag
        HWREG16(PMM_BASE + OFS_PMMIFG) &= ~SVSMLDLYIFG;
        //SVS, SVM core and high side are now set to protect for the new core level
    
        //Restore Low side settings
        //Clear all other bits _except_ level settings
        HWREG16(PMM_BASE + OFS_SVSMLCTL) &= (SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 +
                                               SVSMLRRL1 + SVSMLRRL2
                                               );
    
        //Clear level settings in the backup register,keep all other bits
        SVSMLCTL_backup &=
            ~(SVSLRVL0 + SVSLRVL1 + SVSMLRRL0 + SVSMLRRL1 + SVSMLRRL2);
    
        //Restore low-side SVS monitor settings
        HWREG16(PMM_BASE + OFS_SVSMLCTL) |= SVSMLCTL_backup;
    
        //Restore High side settings
        //Clear all other bits except level settings
        HWREG16(PMM_BASE + OFS_SVSMHCTL) &= (SVSHRVL0 + SVSHRVL1 +
                                               SVSMHRRL0 + SVSMHRRL1 +
                                               SVSMHRRL2
                                               );
    
        //Clear level settings in the backup register,keep all other bits
        SVSMHCTL_backup &=
            ~(SVSHRVL0 + SVSHRVL1 + SVSMHRRL0 + SVSMHRRL1 + SVSMHRRL2);
    
        //Restore backup
        HWREG16(PMM_BASE + OFS_SVSMHCTL) |= SVSMHCTL_backup;
    
        //Wait until high side, low side settled
        while (((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMLDLYIFG) == 0) ||
               ((HWREG16(PMM_BASE + OFS_PMMIFG) & SVSMHDLYIFG) == 0)) ;
    
        //Clear all Flags
        HWREG16(PMM_BASE + OFS_PMMIFG) &= ~(SVMHVLRIFG | SVMHIFG | SVSMHDLYIFG |
                                              SVMLVLRIFG | SVMLIFG | SVSMLDLYIFG
                                              );
    
        //Restore PMM interrupt enable register
        HWREG16(PMM_BASE + OFS_PMMRIE) = PMMRIE_backup;
    
        //Lock PMM registers for write access
        HWREG8(PMM_BASE + OFS_PMMCTL0_H) = 0x00;
    
        return ( STATUS_SUCCESS) ;
    }

    我认为之所以设置它、是因为 VCORE 变化 API 期间的电压下降、对吧?

    什么样的条件下 MCU 检测到内核断电、并设置 LOCKAUX 位?

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

    尊敬的 Tink:

    AUXKEY 将需要被写入使能 LOCKAUX 位、所以在你的第一行我会把 AUXCTL0_H 替换为仅 AUXCTL0、这样你也可以设置 LOCKAUX 位。

    在一个 BOR 后或从 LPMx.5低功耗模式中恢复时、LOCKAUX 可被置位。 您的电压下降是否过低而导致触发 BOR? 或者您是否在使用任何 LPMx.5模式? (LPM3.5或 LPM4.5)  

    此致、
    卢克

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

    Luke、您好!  

    否、 我不使用 LPM 3.5和 LPM 4.5、并且未发生 BOR。

    我在行112 LOCKAUX 被清零前调试了源码。 但在113行 LOCKAUX 被置位后。

    你是否认为在 LOCKAUX 被置位期间会写入 AUXKEY 有可能引起意想不到的结果? (在我发现的极少数情况下)

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

    尊敬的 Tink:

    您能否检查 SYSRSTIV 寄存器以查看是否触发了 POR? 有几个 错误与 POR 错误激活 (PMM18和 PMM20)相关。 我想确认我们没有意外地触及那些 导致重置以锁定 AUX 的错误。

    (为方便起见、用户指南: MSP430F6779A 用户指南)  

    此致、
    卢克