MindSDK_MM32F5270/device/drivers/hal_pwr.c
Yilin Sun 3977144e90
Initial MM32F527x commit.
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-03-27 21:54:40 +08:00

164 lines
3.8 KiB
C

/*
* Copyright 2022 MindMotion Microelectronics Co., Ltd.
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "hal_pwr.h"
void PWR_EnableLowPowerRunMode(PWR_Type * PWRx, bool enable)
{
if (enable)
{
PWRx->CR1 |= PWR_CR1_LPR_MASK;
}
else
{
PWRx->CR1 &= ~PWR_CR1_LPR_MASK;
}
}
void PWR_EnterStopMode(PWR_Type * PWRx, bool deep_stop)
{
PWRx->CR1 &= ~PWR_CR1_PDDS_MASK;
if (deep_stop)
{
PWRx->CR1 |= PWR_CR1_LPDS_MASK;
}
else
{
PWRx->CR1 &= ~PWR_CR1_LPDS_MASK;
}
}
void PWR_EnableStandbyWakeUpPin(PWR_Type * PWRx, PWR_StandbyWakeUpPinConf_Type * conf)
{
if (NULL != conf)
{
PWRx->CR2 |= PWR_CR2_EWUP(conf->Pins);
if (conf->TrgIn == PWR_StandbyWakeUpPinTriggerIn_FallingEdge)
{
PWRx->CR3 |= PWR_CR3_WP(conf->Pins);
}
if (conf->TrgIn == PWR_StandbyWakeUpPinTriggerIn_RisingEdge)
{
PWRx->CR3 &= ~PWR_CR3_WP(conf->Pins);
}
}
else
{
PWRx->CR2 &= ~PWR_CR2_EWUP_MASK;
}
}
void PWR_EnableStandbyWakeUpPinFilter0(PWR_Type * PWRx, PWR_StandbyWakeUpPinFilter0Conf_Type * conf)
{
if (NULL != conf)
{
if (conf->Pin == PWR_WAKEUP_PIN_0)
{
PWRx->CR4 |= PWR_CR4_FILTSEL0(0u);
}
if (conf->Pin == PWR_WAKEUP_PIN_1)
{
PWRx->CR4 |= PWR_CR4_FILTSEL0(1u);
}
if (conf->Pin == PWR_WAKEUP_PIN_2)
{
PWRx->CR4 |= PWR_CR4_FILTSEL0(2u);
}
if ( (conf->Pin == PWR_WAKEUP_PIN_0) || (conf->Pin == PWR_WAKEUP_PIN_1) || (conf->Pin == PWR_WAKEUP_PIN_2) )
{
PWRx->CR4 |= PWR_CR4_FILTE0(conf->TrgIn);
PWRx->CR4 |= PWR_CR4_FILTCNT0(conf->CountValue);
PWRx->CR4 |= PWR_CR4_FILTF0(1u);
}
else
{
PWRx->CR4 |= PWR_CR4_FILTF0(0u);
}
}
else
{
PWRx->CR4 |= PWR_CR4_FILTF0(0u);
}
}
void PWR_EnableStandbyWakeUpPinFilter1(PWR_Type * PWRx, PWR_StandbyWakeUpPinFilter1Conf_Type * conf)
{
if (NULL != conf)
{
if (conf->Pin == PWR_WAKEUP_PIN_3)
{
PWRx->CR5 |= PWR_CR5_FILTSEL1(0u);
}
if (conf->Pin == PWR_WAKEUP_PIN_4)
{
PWRx->CR5 |= PWR_CR5_FILTSEL1(1u);
}
if (conf->Pin == PWR_WAKEUP_PIN_5)
{
PWRx->CR5 |= PWR_CR5_FILTSEL1(2u);
}
if ( (conf->Pin == PWR_WAKEUP_PIN_3) || (conf->Pin == PWR_WAKEUP_PIN_4) || (conf->Pin == PWR_WAKEUP_PIN_5) )
{
PWRx->CR5 |= PWR_CR5_FILTE1(conf->TrgIn);
PWRx->CR5 |= PWR_CR5_FILTCNT1(conf->CountValue);
PWRx->CR5 |= PWR_CR5_FILTF1(1u);
}
else
{
PWRx->CR5 |= PWR_CR5_FILTF1(0u);
}
}
else
{
PWRx->CR5 |= PWR_CR5_FILTF1(0u);
}
}
void PWR_EnterStandbyMode(PWR_Type * PWRx, PWR_StandbyWakeUpDelay_Type delay)
{
PWRx->CR1 |= PWR_CR1_PDDS_MASK;
PWRx->SCR |= ( PWR_WAKEUP_PIN_0
| PWR_WAKEUP_PIN_1
| PWR_WAKEUP_PIN_2
| PWR_WAKEUP_PIN_3
| PWR_WAKEUP_PIN_4
| PWR_WAKEUP_PIN_5
);
PWRx->CR6 |= PWR_CR6_STDBYFSWK(delay);
}
uint32_t PWR_GetStatus(PWR_Type * PWRx)
{
uint32_t flags = 0u;
if ( 0u != (PWR_CR1_LPR_MASK & PWRx->CR1) )
{
flags |= PWR_STATUS_LOWPOWERRUN;
}
if ( 0u != (PWR_CSR_SBF_MASK & PWRx->CSR) )
{
flags |= PWR_STATUS_STANDBYRESET;
}
return flags;
}
void PWR_ClearStatus(PWR_Type * PWRx, uint32_t flags)
{
if ( 0u != (PWR_STATUS_LOWPOWERRUN & flags) )
{
PWRx->CR1 &= ~PWR_CR1_LPR_MASK;
}
if ( 0u != (PWR_STATUS_STANDBYRESET & flags) )
{
PWRx->CR1 |= PWR_CR1_CSBF_MASK;
}
}
/* EOF. */