175 lines
6.5 KiB
C
175 lines
6.5 KiB
C
/**
|
||
****************************************************************************************************
|
||
* @file fm33lg0xx_fl_pmu.c
|
||
* @author FMSH Application Team
|
||
* @brief Src file of PMU FL Module
|
||
****************************************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) [2021] [Fudan Microelectronics]
|
||
* THIS SOFTWARE is licensed under Mulan PSL v2.
|
||
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||
* You may obtain a copy of Mulan PSL v2 at:
|
||
* http://license.coscl.org.cn/MulanPSL2
|
||
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||
* See the Mulan PSL v2 for more details.
|
||
*
|
||
****************************************************************************************************
|
||
*/
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "fm33lg0xx_fl.h"
|
||
|
||
/** @addtogroup FM33LG0XX_FL_Driver
|
||
* @{
|
||
*/
|
||
|
||
/** @addtogroup PMU
|
||
* @{
|
||
*/
|
||
|
||
#ifdef FL_PMU_DRIVER_ENABLED
|
||
|
||
/* Private macros ------------------------------------------------------------*/
|
||
/** @addtogroup UART_FL_Private_Macros
|
||
* @{
|
||
*/
|
||
|
||
|
||
|
||
#define IS_FL_PMU_INSTANCE(INSTANCE) (((INSTANCE) == PMU))
|
||
|
||
#define IS_FL_PMU_MODE(__VALUE__) (((__VALUE__) == FL_PMU_POWER_MODE_ACTIVE_OR_LPACTIVE)||\
|
||
((__VALUE__) == FL_PMU_POWER_MODE_LPRUN_ONLY)||\
|
||
((__VALUE__) == FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP))
|
||
|
||
#define IS_FL_PMU_COREVOLTAGESCALING(__VALUE__) (((__VALUE__) == FL_DISABLE)||\
|
||
((__VALUE__) == FL_ENABLE))
|
||
|
||
#define IS_FL_PMU_DEEPSLEEP(__VALUE__) (((__VALUE__) == FL_PMU_SLEEP_MODE_DEEP)||\
|
||
((__VALUE__) == FL_PMU_SLEEP_MODE_NORMAL))
|
||
|
||
#define IS_FL_PMU_WAKEUPFREQUENCY(__VALUE__) (((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_8MHZ)||\
|
||
((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_16MHZ)||\
|
||
((__VALUE__) == FL_PMU_RCHF_WAKEUP_FREQ_24MHZ))
|
||
|
||
#define IS_FL_PMU_LDOLOWMODE(__VALUE__) (((__VALUE__) == FL_PMU_LDO_LPM_DISABLE)||\
|
||
((__VALUE__) == FL_PMU_LDO_LPM_ENABLE))
|
||
|
||
#define IS_FL_PMU_WAKEUPDELAY(__VALUE__) (((__VALUE__) == FL_PMU_WAKEUP_DELAY_0US)||\
|
||
((__VALUE__) == FL_PMU_WAKEUP_DELAY_2US)||\
|
||
((__VALUE__) == FL_PMU_WAKEUP_DELAY_4US)||\
|
||
((__VALUE__) == FL_PMU_WAKEUP_DELAY_8US))
|
||
|
||
/**
|
||
*@}
|
||
*/
|
||
|
||
/* Exported functions --------------------------------------------------------*/
|
||
/** @addtogroup PMU_FL_EF_Init
|
||
* @{
|
||
*/
|
||
|
||
/**
|
||
* @brief 复位pmu外设
|
||
*
|
||
* @param 外设入口地址
|
||
*
|
||
* @retval 返回错误状态,可能值:
|
||
* -FL_PASS 外设寄存器值回复复位值
|
||
* -FL_FAIL 位成功执行
|
||
*/
|
||
FL_ErrorStatus FL_PMU_Sleep_DeInit(PMU_Type *PMUx)
|
||
{
|
||
FL_ErrorStatus status = FL_FAIL;
|
||
/* 参数合法性检测 */
|
||
assert_param(IS_FL_PMU_INSTANCE(PMUx));
|
||
PMUx->CR = 0x00060000U;
|
||
PMUx->WKTR = 0xC0000001U;
|
||
PMUx->IER = 0x00000000U;
|
||
status = FL_PASS;
|
||
return status;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 根据lpm_initstruct结构体包含的配置信息配置pmu寄存器
|
||
*
|
||
* @note 为更好的睡眠功耗用户可能需要根据实际应用,调用 @ref fm33lg0xx_fl_pmu.h中的其他接口
|
||
* 来完成睡眠前的模式配置,包括睡眠行为和唤醒后的行为(注:此函数会关闭BOR)
|
||
* @param PMUx 外设入口地址
|
||
* @param LPM_InitStruct 指向一个 @ref FL_PMU_SleepInitTypeDef 类型的结构体,它包含指定PMU外设的配置信息
|
||
*
|
||
* @retval ErrorStatus枚举值
|
||
* -FL_FAIL 配置过程发生错误
|
||
* -FL_PASS PMU配置成功
|
||
*/
|
||
FL_ErrorStatus FL_PMU_Sleep_Init(PMU_Type *PMUx, FL_PMU_SleepInitTypeDef *LPM_InitStruct)
|
||
{
|
||
FL_ErrorStatus status = FL_FAIL;
|
||
/* 参数合法性检查 */
|
||
assert_param(IS_FL_PMU_INSTANCE(PMUx));
|
||
// assert_param(IS_FL_PMU_MODE(LPM_InitStruct->powerMode));
|
||
assert_param(IS_FL_PMU_COREVOLTAGESCALING(LPM_InitStruct->coreVoltageScaling));
|
||
assert_param(IS_FL_PMU_LDOLOWMODE(LPM_InitStruct->LDOLowPowerMode));
|
||
assert_param(IS_FL_PMU_DEEPSLEEP(LPM_InitStruct->deepSleep));
|
||
assert_param(IS_FL_PMU_WAKEUPFREQUENCY(LPM_InitStruct->wakeupFrequency));
|
||
assert_param(IS_FL_PMU_WAKEUPDELAY(LPM_InitStruct->wakeupDelay));
|
||
/* 唤醒时间 */
|
||
FL_PMU_SetWakeupDelay(PMUx, LPM_InitStruct->wakeupDelay);
|
||
/* 唤醒后RCHF的频率 */
|
||
FL_PMU_SetRCHFWakeupFrequency(PMUx, LPM_InitStruct->wakeupFrequency);
|
||
/* 睡眠下内核电压配置 */
|
||
if(LPM_InitStruct->coreVoltageScaling == FL_ENABLE)
|
||
{
|
||
FL_PMU_EnableCoreVoltageScaling(PMUx);
|
||
}
|
||
else
|
||
{
|
||
FL_PMU_DisableCoreVoltageScaling(PMUx);
|
||
}
|
||
/* LDO低功耗配置 */
|
||
FL_PMU_SetLDOLowPowerMode(PMUx, LPM_InitStruct->LDOLowPowerMode);
|
||
/* M0系统控制器,一般配置为0即可*/
|
||
SCB->SCR = 0;
|
||
/* 睡眠模式 */
|
||
FL_PMU_SetSleepMode(PMUx, LPM_InitStruct->deepSleep);
|
||
|
||
status = FL_PASS;
|
||
return status;
|
||
}
|
||
|
||
/**
|
||
* @brief LPM_InitStruct 为默认配置
|
||
* @param LPM_InitStruct 指向需要将值设置为默认配置的结构体 @ref FL_PMU_SleepInitTypeDef structure
|
||
* 结构体
|
||
* @retval None
|
||
*/
|
||
void FL_PMU_StructInit(FL_PMU_SleepInitTypeDef *LPM_InitStruct)
|
||
{
|
||
LPM_InitStruct->powerMode = FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP;
|
||
LPM_InitStruct->deepSleep = FL_PMU_SLEEP_MODE_NORMAL;
|
||
LPM_InitStruct->LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE;
|
||
LPM_InitStruct->wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ;
|
||
LPM_InitStruct->wakeupDelay = FL_PMU_WAKEUP_DELAY_2US;
|
||
LPM_InitStruct->coreVoltageScaling = FL_DISABLE;
|
||
}
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
#endif /* FL_PMU_DRIVER_ENABLED */
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/**
|
||
* @}
|
||
*/
|
||
|
||
/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/
|
||
|