/**
******************************************************************************
* @file xl_pmc.c
* @author Kirk ,xu.wang
* @version 4.5.2
* @date Fri Mar 26 17:29:12 2021
* @brief This file provide function about PMC firmware program
******************************************************************************
* @attention
*
* 2019 by Chipways Communications,Inc. All Rights Reserved.
* This software is supplied under the terms of a license
* agreement or non-disclosure agreement with Chipways.
* Passing on and copying of this document,and communication
* of its contents is not permitted without prior written
* authorization.
*
*
© COPYRIGHT 2019 Chipways
******************************************************************************
*/
#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
/* Includes ---------------------------------------------------------------*/
#include "xl_pmc.h"
/** @addtogroup XL6600_StdPeriph_Driver
* @{
*/
/** @defgroup PMC PMC Module
* @brief PMC Driver Modules Library
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup PMC_Private_Functions
* @{
*/
/**
* @brief ½«PMCµÄÄ£¿éÉèÖÃΪ³õʼ״̬¡£
* @param None
* @retval None.
*/
void PMC_Deinit(void)
{
PMC->SPMSC = 0x001Cu;
}
/**
* @brief PMC³õʼ»¯
* @param PMC_InitStruct: PMC_InitTypeDef ÀàÐÍÖ¸Õ룬°üº¬ÁËPMC³õʼ»¯ÅäÖõIJÎÊýÐÅÏ¢
* @retval None
*/
void PMC_Init(const PMC_InitTypeDef *PMC_InitStruct)
{
uint16_t tmpreg;
/*********************** configure the register. ****************************/
/* Get the PMC SPMSC value */
tmpreg = (uint16_t)PMC->SPMSC ;
/* clear the bits in SPMSC register */
tmpreg &= ~(uint16_t)(PMC_SPMSC_LVDE_MASK | PMC_SPMSC_LVDSE_MASK | PMC_SPMSC_LVDRE_MASK | \
PMC_SPMSC_LVWIE_MASK | PMC_SPMSC_LVWV_MASK | PMC_SPMSC_LVDV_MASK) ;
/* set PMC SPMSC: System Power Management Status and Control Register */
tmpreg |= ( (uint16_t)( ((uint16_t)PMC_InitStruct->PMC_LVWIntEnable << PMC_SPMSC_LVWIE_SHIFT) & PMC_SPMSC_LVWIE_MASK) | \
(uint16_t)( ((uint16_t)PMC_InitStruct->PMC_LVDRstEnable << PMC_SPMSC_LVDRE_SHIFT) & PMC_SPMSC_LVDRE_MASK) | \
(uint16_t)( ((uint16_t)PMC_InitStruct->PMC_LVDStopEnable << PMC_SPMSC_LVDSE_SHIFT) & PMC_SPMSC_LVDSE_MASK) | \
(uint16_t)( ((uint16_t)PMC_InitStruct->PMC_LVDectEnable << PMC_SPMSC_LVDE_SHIFT) & PMC_SPMSC_LVDE_MASK) | \
(uint16_t)( ((uint16_t)PMC_InitStruct->PMC_lvwvselect << PMC_SPMSC_LVWV_SHIFT) & PMC_SPMSC_LVWV_MASK) | \
(uint16_t)( ((uint16_t)PMC_InitStruct->PMC_lvdvselect << PMC_SPMSC_LVDV_SHIFT) & PMC_SPMSC_LVDV_MASK) );
/* Write to PMC SPMSC */
PMC->SPMSC = tmpreg ;
}
/**
* @brief ÓÃÔËÐС¢µÈ´ý¡¢Í£Ö¹À´½øÐÐÉèÖÃPMCģʽ
* @param u8PmcMode: ÒªÖ¸¶¨µÄPMCµÄģʽ.
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
* @arg PMC_ModeRun: ÔËÐÐģʽ
* @arg PMC_ModeWait: WAITģʽ
* @arg PMC_ModeStop4: STOPģʽʹÄÜLVD
* @arg PMC_ModeStop3: STOPģʽÊÇÄÜLVD
* @retval None
*/
void PMC_SetMode(uint8_t u8PmcMode)
{
switch(u8PmcMode & 0x3u)
{
case PMC_ModeRun:
break;
case PMC_ModeWait:
/* Clear the SLEEPDEEP bit to make sure we go into WAIT (sleep) mode instead
* of deep sleep.
*/
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
/* using KEIL's uVision, use the CMSIS intrinsic */
__WFI();
break;
case PMC_ModeStop4:
/* enable LVD in stop mode */
PMC->SPMSC |= (PMC_SPMSC_LVDE_MASK | PMC_SPMSC_LVDSE_MASK);
/* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
/* using KEIL's uVision, use the CMSIS intrinsic */
__WFI();
break;
case PMC_ModeStop3:
default:
/* disable LVD in stop mode */
PMC->SPMSC &= ~(PMC_SPMSC_LVDE_MASK | PMC_SPMSC_LVDRE_MASK | PMC_SPMSC_LVDSE_MASK);
/* Set the SLEEPDEEP bit to enable deep sleep mode (STOP) */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
/* using KEIL's uVision, use the CMSIS intrinsic */
__WFI();
break;
}
}
/**
* @brief »ñµÃlvm¾¯¸æ±ê־λ
* @param None.
* @retval PMC±ê־λ
*/
FlagStatus PMC_GetLVWFlag(void)
{
FlagStatus ret;
if( (PMC->SPMSC & PMC_SPMSC_LVWF_MASK) == PMC_SPMSC_LVWF_MASK)
{
ret = SET;
}
else
{
ret= RESET;
}
return ret;
}
/**
* @brief Çå¿Õlvm¾¯¸æ±ê־λ.
* @param None.
* @retval None.
*/
void PMC_ClrLVWFlag(void)
{
if((PMC->SPMSC & PMC_SPMSC_LVWF_MASK) == PMC_SPMSC_LVWF_MASK)
{
/* LVWF must be cleared by writing LVWACK */
PMC->SPMSC |= PMC_SPMSC_LVWACK_MASK;
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
#ifdef __cplusplus
}
#endif /* __cplusplus */