在 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 用户指南)
此致、
卢克