在 LOCKAUX 位被置位期间可以写入 AUXKEY 吗? (将 AUXCTL2配置为下面的代码)
AUXCTL0_H = AUXKEY_H; AUXCTL2 = (AUXMR_0 | AUX0LVL_6 | AUX1LVL_5 | AUX2LVL_0);

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.
在 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)
此致、
卢克
尊敬的 Tink:
您能否检查 SYSRSTIV 寄存器以查看是否触发了 POR? 有几个 错误与 POR 错误激活 (PMM18和 PMM20)相关。 我想确认我们没有意外地触及那些 导致重置以锁定 AUX 的错误。
(为方便起见、用户指南: MSP430F6779A 用户指南)
此致、
卢克