mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
164 lines
3.8 KiB
C
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. */
|