/* ****************************************************************************** * * @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. } /* ******************************************************************************* * 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. } /* ******************************************************************************* * 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_STA_ING ) || ( 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