222 lines
5.0 KiB
C
222 lines
5.0 KiB
C
/*
|
||
******************************************************************************
|
||
*
|
||
* @file sleep.c
|
||
* @brief sleep module
|
||
* @ic sy8835
|
||
*
|
||
* @version 1.0
|
||
* @date 2024/11/01 17:35:40
|
||
* @author Alex Xu
|
||
*
|
||
* Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd.
|
||
* All Rights Reserved
|
||
*
|
||
* History:
|
||
* Revision Date Author Desc
|
||
* 1.0.0 2024/11/01 Alex build this file
|
||
******************************************************************************
|
||
*/
|
||
#include "sleep.h"
|
||
#include "system.h"
|
||
#include "vox_module.h"
|
||
#include "sys_tim.h"
|
||
|
||
#if SLEEP_ENABLE
|
||
|
||
/******************************************************************************\
|
||
Macro definitions
|
||
\******************************************************************************/
|
||
|
||
/******************************************************************************\
|
||
Variables definitions
|
||
\******************************************************************************/
|
||
|
||
uint16_t gAwake_Source = 0; //唤醒源标志位
|
||
|
||
uint8_t Decnt_SleepDelay = ENTER_STANDBYMODE_CNT;
|
||
|
||
bit Enter_Sleep_Cnt_Restart_Flag = 0;
|
||
|
||
/******************************************************************************\
|
||
Functions definitions
|
||
\******************************************************************************/
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void WakeUp_Init_Set(void)
|
||
*
|
||
* Description : 系统唤醒源使能设置,系统初始化调用。
|
||
*
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
|
||
void WakeUp_Init_Set(void)
|
||
{
|
||
//set wakeup
|
||
#ifdef TIM_WKUP
|
||
|
||
SFRADDR = IRQ_EN10; //Standby Wakeup Timer Interrupt Enable.
|
||
SFRDATA |= 0x02;
|
||
|
||
SFRADDR = WKUP_EN0;
|
||
SFRDATA |= 0x08;
|
||
|
||
STBTIM_CTL = 0x87; //Force LOSC In Standby;Enable Wakeup Time Control In Standby Mode;Set The Wakeup Time In Standby Mode:12s.
|
||
|
||
#endif
|
||
|
||
#if HALL_ENABLE
|
||
|
||
SFRADDR = WKUP_EN0;
|
||
SFRDATA |= 0x04;
|
||
|
||
#endif
|
||
|
||
#if KEY_ENABLE
|
||
|
||
SFRADDR = WKUP_EN0;
|
||
SFRDATA |= 0x02;
|
||
|
||
#endif
|
||
|
||
#if VOX_ENABLE
|
||
|
||
if( Vox_Ocp_Flag )
|
||
{
|
||
SFRADDR = WKUP_EN3; //VOX LOADON Wake Up Disable.
|
||
SFRDATA &= ~0x3C;
|
||
}
|
||
else
|
||
{
|
||
SFRADDR = WKUP_EN3; //VOX LOADON Wake Up Enable.
|
||
SFRDATA |= 0x3C;
|
||
}
|
||
|
||
#endif
|
||
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void OutSleep_Handler(void)
|
||
*
|
||
* Description : 出Standby模式后开启中断和部分接口使能。
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void OutSleep_Handler(void)
|
||
{
|
||
ES0 = 1; //UART0 IRQ
|
||
|
||
IEN2 = 1; //UART1 IRQ
|
||
|
||
EX2 = 1; //VOL/R LOADON IRQ
|
||
EX6 = 1; //ADC IRQ
|
||
|
||
ET0 = 1; //timer0 IRQ
|
||
ET1 = 1; //timer1 IRQ
|
||
|
||
SFRADDR = ADC_CTL0;
|
||
SFRDATA |= 0xB0; //ADC enable, NTC RUP enable, ADC 2.5V enable.
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void InSleep_Handler(void)
|
||
*
|
||
* Description : 进Standby模式前的准备工作;关闭中断、关闭部分接口的使能
|
||
*
|
||
* Arguments : NONE
|
||
|
||
* Returns : NONE
|
||
|
||
* Notes : NONE
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void InSleep_Handler(void)
|
||
{
|
||
ES0 = 0; //UART0 IRQ Disable
|
||
|
||
IEN2 = 0; //UART1 IRQ Disable
|
||
|
||
EX2 = 1; //VOL/R LOADON IRQ
|
||
EX6 = 0; //ADC IRQ
|
||
|
||
ET0 = 0; //timer0 IRQ Disable
|
||
ET1 = 0; //timer1 IRQ Disable
|
||
|
||
SFRADDR = ADC_CTL0;
|
||
SFRDATA &= ~0xB0; //ADC Disable, NTC RUP Disable, ADC 2.5V Disable.
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* void Enter_Sleep(void)
|
||
*
|
||
* Description : 进入休眠函数。
|
||
*
|
||
* Arguments : None
|
||
|
||
* Returns : None
|
||
|
||
* Notes : None
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
void Enter_Sleep(void)
|
||
{
|
||
InSleep_Handler(); //Disable All IRQ
|
||
|
||
PCON |= 0x02; //Enter StandbyMode, Only int0 or int1 can wake up system
|
||
|
||
OutSleep_Handler(); //Enable IRQ
|
||
}
|
||
|
||
/*
|
||
*******************************************************************************
|
||
* bool Check_Require_Sleep(void )
|
||
*
|
||
* Description : 查询休眠唤醒源标志位函数。
|
||
*
|
||
* Arguments : None
|
||
|
||
* Returns : None
|
||
|
||
* Notes : bool Flag
|
||
*
|
||
*******************************************************************************
|
||
*/
|
||
bit Check_Require_Sleep(void )
|
||
{
|
||
if( ( ChgStatus > CHG_PROTECT ) || ( ON == Vox_Vout_Enable ) || Enter_Sleep_Cnt_Restart_Flag ) /*充电中、有中断、耳机处于充电状态情况下,Boost重载输出,系统不进休眠模式。 */
|
||
{
|
||
#ifdef _DEBUG_SLEEP
|
||
printf("Not Get Into Sleep(ChgStatus:%d,Vox_Vout:%d,Restart_Flag:%d).\r\n",(uint16_t)ChgStatus,(uint16_t)Vox_Vout_Enable,(uint16_t)Enter_Sleep_Cnt_Restart_Flag);
|
||
#endif
|
||
Enter_Sleep_Cnt_Restart_Flag = 0;
|
||
/*处理对应的保护和中断唤醒事件。*/
|
||
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
#endif
|
||
|