ZDBMS/code_app/LowPower.c

226 lines
6.4 KiB
C
Raw Normal View History

2025-02-06 07:35:32 +00:00
/********************************************************************************
Copyright (C), Sinowealth Electronic. Ltd.
Author: Sino
Version: V0.0
Date: 2020/04/26
History:
V2.0 2020/04/26 Preliminary
********************************************************************************/
#include "Main.h"
BOOL bSleepFlg; //ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>IDLE<4C><45>־
BOOL bPDFlg;
BOOL bWakeupFlg;
BOOL bPCEnterPDFlg; //PC֪ͨϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>SLEEP<45><50>־
U8 xdata ucSleepTimerCnt;
U8 xdata ucPDTimerCnt;
U8 xdata ucResetFlag;
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: WakeUpProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>Sleepģʽ<EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
void WakeUpProcess(void)
{
if(bWakeupFlg)
{
bWakeupFlg = 0;
if(bSleepFlg)
{
McuClockSet(MCU_CLK_24MHz);
IrqEn();
bSleepFlg = 0;
ucSleepTimerCnt = 0;
Delay1ms(1);
#if (UART0_DEFINE != 0)
IrqUart0En(); //<2F><><EFBFBD><EFBFBD>uart0<74>ж<EFBFBD>
#endif
IrqTimer3En(); //<2F><><EFBFBD><EFBFBD>Timer3<72>ж<EFBFBD>
McuTwiEn(); //<2F><><EFBFBD><EFBFBD>MCU Twiģ<69><C4A3>
AfeAlarmDis(AFE_ALARM_SC | AFE_ALARM_OV | AFE_ALARM_CD);
AfeTempADCEn(); //<2F><><EFBFBD><EFBFBD>AFE<46>¶Ȳɼ<C8B2>
AfeWDTEn(); //<2F><><EFBFBD><EFBFBD>AFE WDT
}
ucSleepTimerCnt = 0;
ucPDTimerCnt = 0;
ucUart0TimeoutCnt = 0;
ucUart1TimeoutCnt = 0;
ucUart2TimeoutCnt = 0;
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SystemIntoPD
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
*************************************************************************************************/
void SystemIntoPD(void)
{
while(1)
{
McuWDTClear(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ź<EFBFBD>
IrqDis(); //<2F>ر<EFBFBD><D8B1>ж<EFBFBD>Դ
// LEDAllOff(); //<2F>ر<EFBFBD>LED<45><44>ʾ
BlueToothPowerDis(); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
AFEMosCtl(0); //<2F>ر<EFBFBD>MOS<4F><53><EFBFBD><EFBFBD>
AFEEnterPD(); //<2F>ر<EFBFBD>3.3V<EFBFBD><EFBFBD>Դ
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: SystemIntoSleep
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD>͹<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDLE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PD
*************************************************************************************************/
void SystemIntoSleep(void)
{
// LEDAllOff(); //<2F>ر<EFBFBD>LED<45><44>ʾ
BlueToothPowerDis(); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
bLedDisBleFlg = 0;
AfeWDTDis(); //<2F>ر<EFBFBD>AFE WDT
AfeTempADCDis(); //<2F>ر<EFBFBD>AFE<46>¶Ȳɼ<C8B2>
AfeAlarmEn(AFE_ALARM_SC | AFE_ALARM_OV | AFE_ALARM_CD); //<2F><><EFBFBD><EFBFBD>SC,OV,CD<43><44>Alarm<72><6D><EFBFBD><EFBFBD>
McuTwiDis(); //<2F>ر<EFBFBD>MCU Twiģ<69><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
McuPWM2Dis(); //<2F>ر<EFBFBD>MCU PWMģ<4D><C4A3>
if(bDSGMOS) //DSG<53><47><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ
{
IO_DSG_PWM = 1;
}
else
{
IO_DSG_PWM = 0;
}
Delay1ms(1);
IrqDis(); //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж<EFBFBD>Դ
#if (UART0_DEFINE != 0)
IrqUart0Dis();
#endif
#if (UART1_DEFINE != 0)
IrqUart1Dis();
#endif
#if (UART2_DEFINE != 0)
IrqUart2Dis();
#endif
IrqTimer3Dis(); //<2F>ر<EFBFBD>Timer3<72>ж<EFBFBD>
IrqINT4FlgClr(); //<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD>ж<EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
McuClockSet(MCU_CLK_128KHz); //<2F><><EFBFBD><EFBFBD>ϵͳʱ<CDB3><CAB1>Ϊ128KHz
IrqEn();
McuIntoPD(); //MCU<43><55><EFBFBD><EFBFBD>PD<50><44><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ALARM<52><4D><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3>sleep<65><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>й<EFBFBD>DSG MOS<4F><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD>Ŀգ<C4BF><D5A3><EFBFBD><EFBFBD>ǣ<EFBFBD>AFE<46>ڲ<EFBFBD>Ԥ<EFBFBD><D4A4>FUSE<53><45><EFBFBD><EFBFBD>VDD<44><44>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>4Vʱ<56><CAB1><EFBFBD>ر<EFBFBD>LDO<44><4F>ʹV33<33>ϵ硣
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: LowPowerCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDLE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PD
*************************************************************************************************/
void LowPowerCheck(void)
{
if(bPCEnterPDFlg && (bUart0SndAckFlg||bUart1SndAckFlg||bUart2SndAckFlg)) //<2F><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>PD
{
bPCEnterPDFlg = 0;
bPDFlg = 1;
}
else if(bCTO) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>PD
{
if(++ucPDTimerCnt >= E2ucLowPowerDeley)
{
ucPDTimerCnt = E2ucLowPowerDeley;
bPDFlg = 1;
}
}
else if(!bLedDisFlg) //LED<45><44>ʾ<EFBFBD>رպ<D8B1><D5BA><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
{
if(!bCHGING && !bDSGING) //<2F>dz<EFBFBD><C7B3>Ƿ<EFBFBD>״̬
{
if(bUV) //<2F><><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>PD
{
if(++ucPDTimerCnt >= E2ucLowPowerDeley)
{
ucPDTimerCnt = E2ucLowPowerDeley;
bPDFlg = 1;
}
}
else //δ<><CEB4><EFBFBD><EFBFBD>Ƿѹ<C7B7><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>IDLE
{
ucPDTimerCnt = 0;
if(!(bOTC | bUTC | bOV | bOCC | bOTD | bUTD | bUV | bOCD1 | bOCD2 | bAFE_SC | bLedDisBleFlg))
{
if(++ucSleepTimerCnt >= E2ucLowPowerDeley)
{
ucSleepTimerCnt = E2ucLowPowerDeley;
bSleepFlg = 1;
}
}
else
{
ucSleepTimerCnt = 0;
}
}
}
else
{
ucSleepTimerCnt = 0;
ucPDTimerCnt = 0;
}
}
else
{
ucSleepTimerCnt = 0;
ucPDTimerCnt = 0;
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: LowPowerProcess
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD>͹<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDLE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>PD
*************************************************************************************************/
void LowPowerProcess(void)
{
if(!bSleepFlg && !bPDFlg)
{
IrqDis();
if(!(bKeyFlg | bCaliFlg | bMcuFlashWrFlg | bWakeupFlg | bISPFlg | bTimer50msFlg | bTimer1sFlg) && (ucResetFlag!=0x12))
{
IrqEn();
McuIntoIdle();
}
IrqEn();
}
else if(bPDFlg)
{
bMcuFlashWrFlg = 1;
McuFlashProcess();
SystemIntoPD();
}
else if(bSleepFlg)
{
SystemIntoSleep();
}
WakeUpProcess(); //ϵͳ<CFB5>ӵ͹<D3B5><CDB9>Ļ<EFBFBD><C4BB><EFBFBD>
}