M module-bsp/board/linux/lpm/LinuxLPM.cpp => module-bsp/board/linux/lpm/LinuxLPM.cpp +6 -0
@@ 51,4 51,10 @@ namespace bsp
void LinuxLPM::ConnectInternalLoadResistor()
{}
+ void LinuxLPM::SwitchToRegularModeLDO()
+ {}
+
+ void LinuxLPM::SwitchToLowPowerModeLDO()
+ {}
+
} // namespace bsp
M module-bsp/board/linux/lpm/LinuxLPM.h => module-bsp/board/linux/lpm/LinuxLPM.h +3 -0
@@ 25,6 25,9 @@ namespace bsp
void DisconnectInternalLoadResistor() final;
void ConnectInternalLoadResistor() final;
+
+ void SwitchToRegularModeLDO() final;
+ void SwitchToLowPowerModeLDO() final;
};
} // namespace bsp
M module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp +26 -0
@@ 143,4 143,30 @@ namespace bsp
DCDC->REG1 |= DCDC_REG1_REG_RLOAD_SW_MASK;
}
+ void RT1051LPM::SwitchToRegularModeLDO()
+ {
+ // Enable regular 2P5 and wait it stable
+ PMU->REG_2P5_SET = PMU_REG_2P5_ENABLE_LINREG_MASK;
+ // It is recommended to wait for stabilization (documentation Low Power AN12085)
+ while ((PMU->REG_2P5 & PMU_REG_2P5_OK_VDD2P5_MASK) == 0) {}
+ // Turn off weak 2P5
+ PMU->REG_2P5_CLR = PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK;
+ // Enable regular 1P1 and wait for stable
+ PMU->REG_1P1_SET = PMU_REG_1P1_ENABLE_LINREG_MASK;
+ // It is recommended to wait for stabilization (documentation Low Power AN12085)
+ while ((PMU->REG_1P1 & PMU_REG_1P1_OK_VDD1P1_MASK) == 0) {}
+ // Turn off weak 1P1
+ PMU->REG_1P1_CLR = PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK;
+ }
+
+ void RT1051LPM::SwitchToLowPowerModeLDO()
+ {
+ // Enable weak 2P5 and turn off regular 2P5
+ PMU->REG_2P5 |= PMU_REG_2P5_ENABLE_WEAK_LINREG_MASK;
+ PMU->REG_2P5 &= ~PMU_REG_2P5_ENABLE_LINREG_MASK;
+ // Enable weak 1P1 and turn off regular 1P1
+ PMU->REG_1P1 |= PMU_REG_1P1_ENABLE_WEAK_LINREG_MASK;
+ PMU->REG_1P1 &= ~PMU_REG_1P1_ENABLE_LINREG_MASK;
+ }
+
} // namespace bsp
M module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp +3 -0
@@ 28,6 28,9 @@ namespace bsp
void DisconnectInternalLoadResistor() final;
void ConnectInternalLoadResistor() final;
+ void SwitchToRegularModeLDO() final;
+ void SwitchToLowPowerModeLDO() final;
+
private:
std::shared_ptr<drivers::DriverGPIO> gpio_1;
std::shared_ptr<drivers::DriverGPIO> gpio_2;
M module-bsp/bsp/lpm/bsp_lpm.hpp => module-bsp/bsp/lpm/bsp_lpm.hpp +3 -0
@@ 48,6 48,9 @@ namespace bsp
virtual void DisconnectInternalLoadResistor() = 0;
virtual void ConnectInternalLoadResistor() = 0;
+ virtual void SwitchToRegularModeLDO() = 0;
+ virtual void SwitchToLowPowerModeLDO() = 0;
+
protected:
CpuFrequencyHz currentFrequency = CpuFrequencyHz::Level_6;
};
M module-sys/SystemManager/PowerManager.cpp => module-sys/SystemManager/PowerManager.cpp +5 -0
@@ 126,6 126,8 @@ namespace sys
lowPowerControl->DisableDcdcPowerSaveMode();
// Switch DCDC to full throttle during oscillator switch
lowPowerControl->SetHighestCoreVoltage();
+ // Enable regular 2P5 and 1P1 LDO and Turn off weak 2P5 and 1P1 LDO
+ lowPowerControl->SwitchToRegularModeLDO();
// switch oscillator source
lowPowerControl->SwitchOscillatorSource(bsp::LowPowerMode::OscillatorSource::External);
// then switch external RAM clock source
@@ 174,6 176,9 @@ namespace sys
}
if (level == bsp::CpuFrequencyHz::Level_1) {
+ // Enable weak 2P5 and 1P1 LDO and Turn off regular 2P5 and 1P1 LDO
+ lowPowerControl->SwitchToLowPowerModeLDO();
+
// then switch osc source
lowPowerControl->SwitchOscillatorSource(bsp::LowPowerMode::OscillatorSource::Internal);