ZNY_Pakistan/Anjiehui7_ZNY/User/rtc_wakeup.c

816 lines
19 KiB
C
Raw Permalink Normal View History

2025-04-03 15:24:54 +08:00
#include "includes.h"
#include "drv_dtu.h"
#include "drv_gps.h"
RTC_HandleTypeDef hrtc;
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ģʽ
uint8_t Wakeup_workMode = WORK_MODE_NORMAL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־
uint8_t bat_veryLow = 0;
// <20><><EFBFBD>߱<EFBFBD>ʶ
volatile uint8_t Wakeup_Sleeping = 0;
// <20>Ƿ<EFBFBD>˯<EFBFBD><CBAF>ģʽ
volatile uint8_t Wakeup_SleepMode = 0;
// ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>INITIAL_YEAR<41><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPS<50><53>λ<EFBFBD><CEBB>GPRS<52><53><EFBFBD>ӻ<EFBFBD>վ<EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD>ã<EFBFBD>
volatile uint32_t RTC_offsetSeconds = 0;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽΪNuvotonоƬ<D0BE><C6AC>ʽ
void RTC_GetDateAndTime(S_RTC_TIME_DATA_T *sRTC)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
sRTC->u32Year = sDate.Year + RTC_YEAR2000;
sRTC->u32Month = sDate.Month;
sRTC->u32Day = sDate.Date;
if(sDate.WeekDay == RTC_WEEKDAY_SUNDAY)
sRTC->u32DayOfWeek = 0;
else
sRTC->u32DayOfWeek = sDate.WeekDay;
sRTC->u32Hour = sTime.Hours;
sRTC->u32Minute = sTime.Minutes;
sRTC->u32Second = sTime.Seconds;
sRTC->u32TimeScale = RTC_CLOCK_24;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽΪNuvotonоƬ<D0BE><C6AC>ʽ
void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sRTC)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
sDate.Year = sRTC->u32Year - RTC_YEAR2000;
sDate.Month = sRTC->u32Month;
sDate.Date = sRTC->u32Day;
if(sRTC->u32DayOfWeek == RTC_SUNDAY)
sDate.WeekDay = RTC_WEEKDAY_SUNDAY;
else
sDate.WeekDay = sRTC->u32DayOfWeek;
sTime.Hours = sRTC->u32Hour;
sTime.Minutes = sRTC->u32Minute;
sTime.Seconds = sRTC->u32Second;
sTime.SubSeconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT_24;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}
void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sRTC)
{
uint8_t try_count = 3;
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = sRTC->u32Hour;
sAlarm.AlarmTime.Minutes = sRTC->u32Minute;
sAlarm.AlarmTime.Seconds = sRTC->u32Second;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT_24;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = sRTC->u32Day;
sAlarm.Alarm = RTC_ALARM_A;
while(try_count--)
{
if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) == HAL_OK)
break;
delay_ms(10);
}
}
void RTC_SetAlarmDateAndTime_B(S_RTC_TIME_DATA_T *sRTC)
{
uint8_t try_count = 3;
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = sRTC->u32Hour;
sAlarm.AlarmTime.Minutes = sRTC->u32Minute;
sAlarm.AlarmTime.Seconds = sRTC->u32Second;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT_24;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = sRTC->u32Day;
sAlarm.Alarm = RTC_ALARM_B;
while(try_count--)
{
if(HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) == HAL_OK)
break;
delay_ms(10);
}
}
void Wakeup_ShowTime(char *preStr, S_RTC_TIME_DATA_T *pRTC)
{
S_RTC_TIME_DATA_T sRTC;
uint32_t totalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, pRTC->u32Year, pRTC->u32Month, pRTC->u32Day,
pRTC->u32Hour, pRTC->u32Minute, pRTC->u32Second);
totalSeconds += RTC_offsetSeconds;
Wakeup_CalcUTCTime(totalSeconds, &sRTC);
printf("\n%s%04d-%02d-%02d %02d:%02d:%02d\n", preStr, sRTC.u32Year, sRTC.u32Month,
sRTC.u32Day, sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
}
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
uint8_t IsLeapYear(uint16_t year)
{
if(year % 4)
return 0;
if(year % 100 == 0 && year % 400)
return 0;
return 1;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EABFAA><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t Calc_SecondsFromYear(uint16_t startYear, uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec)
{
uint32_t totalSeconds = 0ul;
uint16_t i;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i = startYear; i < year; i++)
{
totalSeconds += 31536000ul; // 365 * 86400
if(IsLeapYear(i)) // <20><><EFBFBD><EFBFBD>+1<><31>
totalSeconds += 86400ul;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
for(i = 1; i < mon; i++)
{
totalSeconds += 2678400ul; // 31 * 86400
if(i == 4 || i == 6 || i == 9 || i == 11)
totalSeconds -= 86400ul;
else if(i == 2)
{
totalSeconds -= 259200ul; // 3 * 86400
if(IsLeapYear(year)) // <20><><EFBFBD><EFBFBD>+1<><31>
totalSeconds += 86400ul;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
totalSeconds += (day - 1) * 86400ul;
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
totalSeconds += hour * 3600ul;
totalSeconds += min * 60ul;
totalSeconds += sec;
return totalSeconds;
}
uint16_t get_year_days(uint16_t year)
{
if(IsLeapYear(year))
return 366;
return 365;
}
uint16_t get_month_days(uint16_t year, uint8_t month)
{
if(month == 4 || month == 6 || month == 9 || month == 11)
return 30;
if(month == 2)
{
if(IsLeapYear(year))
return 29;
return 28;
}
return 31;
}
// <20><><EFBFBD><EFBFBD>INITIAL_YEAR<41><52>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Wakeup_CalcUTCTime(uint32_t totalSeconds, S_RTC_TIME_DATA_T *pRTC)
{
uint32_t totalDays, days;
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD><D1B5><EFBFBD>¡<EFBFBD><C2A1><EFBFBD>
pRTC->u32Year = INITIAL_YEAR;
pRTC->u32Month = 1;
pRTC->u32Day = 1;
totalDays = totalSeconds / 86400ul;
while(totalDays >= 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
days = get_year_days(pRTC->u32Year);
if(totalDays >= days)
{
pRTC->u32Year++;
totalDays -= days;
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
days = get_month_days(pRTC->u32Year, pRTC->u32Month);
if(totalDays >= days)
{
pRTC->u32Month++;
totalDays -= days;
continue;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pRTC->u32Day += totalDays;
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>֡<EFBFBD><D6A1><EFBFBD>
totalSeconds %= 86400ul;
pRTC->u32Hour = totalSeconds / 3600ul;
totalSeconds %= 3600;
pRTC->u32Minute = totalSeconds / 60ul;
totalSeconds %= 60ul;
pRTC->u32Second = totalSeconds;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD>ʱ<EFBFBD><CAB1>
void Wakeup_CalcWakeupTime(S_RTC_TIME_DATA_T *pRTC, uint8_t charging)
{
uint32_t period = 300;
// <20>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t totalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, pRTC->u32Year, pRTC->u32Month, pRTC->u32Day,
pRTC->u32Hour, pRTC->u32Minute, pRTC->u32Second);
if(dcBuff.configData.intervalTrans > 0 && period > dcBuff.configData.intervalTrans)
period = dcBuff.configData.intervalTrans;
if(dcBuff.configData.intervalSample > 0 && period > dcBuff.configData.intervalSample)
period = dcBuff.configData.intervalSample;
// <20><><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>Ƶ<EFBFBD>ʲ<EFBFBD><CAB2>ܿ<EFBFBD><DCBF><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
if((!VCC_POWER_STATUS() || (dcBuff.configDisplay.op_USE_SOLAR && dcBuff.dtuData.batVoltage <= 4500)) && period < 60)
period = 60;
if(dcBuff.configDisplay.op_ANTI_OVERFILL && Charge_Enabled && period > 10)
period = 10;
if(Manual_Charing && period > 10)
period = 10;
if(charging && period > 60)
period = 60;
if(dcBuff.configDisplay.op_ANTI_NORM_OPEN && Anti_Enabled && charging && period > 10)
period = 10;
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵı<DAB5><C4B1><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ÿ<EFBFBD>θ<EFBFBD>λ<EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>Ȼʱ<C8BB><CAB1><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t sec = totalSeconds + period;
sec -= sec % period;
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>̫<EFBFBD><CCAB>
if(sec <= totalSeconds + 2)
totalSeconds = sec + period;
else
totalSeconds = sec;
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD><D1B5><EFBFBD>¡<EFBFBD><C2A1><EFBFBD>
Wakeup_CalcUTCTime(totalSeconds, pRTC);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD>ʱ<EFBFBD><CAB1>
void Wakeup_CalcWakeupTime_B(S_RTC_TIME_DATA_T *pRTC)
{
// <20>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ӳ<EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t totalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, pRTC->u32Year, pRTC->u32Month, pRTC->u32Day,
pRTC->u32Hour, pRTC->u32Minute, pRTC->u32Second);
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
totalSeconds += 15;
// <20><><EFBFBD><EFBFBD><EFBFBD>´λ<C2B4><CEBB>ѵ<EFBFBD><D1B5><EFBFBD>¡<EFBFBD><C2A1><EFBFBD>
Wakeup_CalcUTCTime(totalSeconds, pRTC);
}
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
void Wakeup_SetAlarm(uint8_t charging)
{
S_RTC_TIME_DATA_T sRTC;
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
RTC_GetDateAndTime(&sRTC);
// <20><>ʾ<EFBFBD><CABE>ǰʱ<C7B0><CAB1>
Wakeup_ShowTime("RTC time is: ", &sRTC);
Wakeup_CalcWakeupTime(&sRTC, charging);
RTC_SetAlarmDateAndTime(&sRTC);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Wakeup_ShowTime("***********************************************\nWakeup time is: ", &sRTC);
}
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
void Wakeup_SetAlarm_B()
{
S_RTC_TIME_DATA_T sRTC;
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
RTC_GetDateAndTime(&sRTC);
Wakeup_CalcWakeupTime_B(&sRTC);
RTC_SetAlarmDateAndTime_B(&sRTC);
}
/**
* @brief Alarm A callback.
* @param hrtc RTC handle
* @retval None
*/
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
S_RTC_TIME_DATA_T sRTC;
static uint32_t gpsSeconds = 0;
uint32_t totalSeconds;
if(Wakeup_Sleeping)
{
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
delay_ms(10);
Vcc_Enable();
delay_ms(40);
printf("\n\nWake up by RTC.\n\n");
}
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>gps<70><73>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
totalSeconds = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>С2Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD>죩δ<ECA3A9><CEB4><EFBFBD>ͳɹ<CDB3><C9B9><EFBFBD><EFBFBD><EFBFBD>λ
if((totalSeconds >= DTU_succTime + 7200 && totalSeconds >= DTU_succTime + dcBuff.configData.intervalTrans * 6) || totalSeconds >= DTU_succTime + 86400)
{
if(!dcBuff.configDisplay.op_LOCAL_DISP)
NVIC_SystemReset();
}
// ÿ<><C3BF>24Сʱ<D0A1><CAB1>λһ<CEBB><D2BB>(3<><33><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
if(totalSeconds + 3 >= gpsSeconds + 86400ul)
{
// <20><><EFBFBD><EFBFBD>λ
GPS_Located = 0;
GPS_Locate = 1;
// <20><><EFBFBD>¼<EFBFBD>ʱ
gpsSeconds = totalSeconds;
}
if(Wakeup_Sleeping)
DTU_semSync = 1;
else
DTU_semGPRS = 1;
Wakeup_Sleeping = 0;
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
Wakeup_SetAlarm(dcBuff.sampleData.charging);
}
/**
* @brief Alarm B callback.
* @param hrtc RTC handle
* @retval None
*/
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
{
DTU_CheckSleep();
}
// <20><><EFBFBD><EFBFBD><E7BBBD><EFBFBD>ж<EFBFBD>
void Vcc_Power_Handler(void)
{
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DAC7311_Open();
if(Wakeup_Sleeping)
{
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
delay_ms(10);
Vcc_Enable();
delay_ms(40);
Wakeup_Sleeping = 0;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>
if(!VCC_POWER_STATUS())
{
printf("\nWakeup by DISTURB ...\n");
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>
return;
}
printf("\n\nWake up by POWER.\n\n");
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Sample_NotifyFromISR();
}
// Modbus<75><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VCC_RS485_ON();
}
void Wakeup_Init()
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
// <20><><EFBFBD><EFBFBD><E7BBBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE7);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_7;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
LL_GPIO_SetPinPull(GPIOE, LL_GPIO_PIN_7, LL_GPIO_PULL_DOWN);
/**/
LL_GPIO_SetPinMode(GPIOE, LL_GPIO_PIN_7, LL_GPIO_MODE_INPUT);
}
void Wakeup_InitializeTime(S_RTC_TIME_DATA_T *pRTC)
{
pRTC->u32Year = INITIAL_YEAR;
pRTC->u32Month = 1;
pRTC->u32Day = 1;
pRTC->u32DayOfWeek = RTC_WEEKDAY_FRIDAY;
pRTC->u32Hour = 0;
pRTC->u32Minute = 0;
pRTC->u32Second = 0;
pRTC->u32TimeScale = RTC_CLOCK_24;
}
void Wakeup_Open()
{
S_RTC_TIME_DATA_T sRTC;
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* Set RTC date and time */
Wakeup_InitializeTime(&sRTC);
RTC_SetDateAndTime(&sRTC);
printf("\n*******************************\n");
printf("system reseted ...\n");
// <20><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʱ<EFBFBD><CAB1>
Wakeup_SetAlarm(dcBuff.sampleData.charging);
NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(EXTI9_5_IRQn);
if(VCC_POWER_STATUS())
{
// Modbus<75><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VCC_RS485_ON();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
void Wakeup_Powerdown()
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
uint32_t curr_time;
S_RTC_TIME_DATA_T sRTC;
static uint8_t last_PowerStatus = 0;
uint8_t powerStatus;
#if 0
// ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷŵ磺ÿ<E7A3BA><C3BF>10<31><30><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>һ<EFBFBD><D2BB>
if(dcBuff.configDisplay.op_SEND_GPS_DATA)
{
RTC_GetDateAndTime(&sRTC);
curr_time = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
powerStatus = (curr_time / 600 % 2 == 0);
}
else
#endif
{
// <20><>¼<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ʱ<EFBFBD><CAB1>
powerStatus = VCC_POWER_STATUS();
}
if(last_PowerStatus != powerStatus && !powerStatus)
{
RTC_GetDateAndTime(&sRTC);
Poweroff_time = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
}
last_PowerStatus = powerStatus;
// <20><><EFBFBD><EFBFBD><EFBFBD>Dz۳<C7B2><DBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><E7A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(powerStatus && dcBuff.configDisplay.op_SEND_GPS_DATA)
return;
// <20><>λδ<CEBB>ɹ<EFBFBD><C9B9><EFBFBD>δ<EFBFBD><CEB4>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!dcBuff.configDisplay.op_SEND_GPS_DATA && Wakeup_GetWorkMode() == WORK_MODE_NORMAL && GPS_Waiting)
return;
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(Sample_Busy() || Config_Vacuum_Request)
return;
// <20>۳<EFBFBD><DBB3><EFBFBD><EFBFBD>նϵ<D5B6><CFB5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ӳ<EFBFBD>20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.configDisplay.op_SEND_GPS_DATA)
{
// <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD>
if(!powerStatus && Wakeup_GetWorkMode() == WORK_MODE_NORMAL)
{
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
curr_time = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
if(Poweroff_time > 0 && curr_time >= Poweroff_time && curr_time < Poweroff_time + 1200)
// if(Poweroff_time > 0 && curr_time >= Poweroff_time && curr_time < Poweroff_time + 60)
{
if((curr_time - Poweroff_time) % 10 == 0)
printf("\ndelay sleep time: %d\n", curr_time - Poweroff_time);
return;
}
}
}
// <20>ر<EFBFBD>DTU
if(Wakeup_GetWorkMode() != WORK_MODE_NORMAL || LCD_Disabled)
{
if(dcBuff.dtuData.networked)
DTU_Sleep();
else
DTU_PowerOff();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(Wakeup_GetWorkMode() == WORK_MODE_NORMAL && !LCD_Disabled)
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.configDisplay.op_ANTI_OVERFILL)
{
if((!dcBuff.configDisplay.op_ANTI_SINGLE_CTRL && IS_CHARGE_ENABLE_HIGH()) || IS_CHARGE_DISABLE_HIGH())
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD>ڱպ<DAB1>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.configDisplay.op_ANTI_NORM_OPEN)
{
if(!IS_NORM_OPEN_ENABLED())
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B1A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.configDisplay.op_ALARM_OUTPUT)
{
if(powerStatus)
return;
}
// <20><><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>4.5v<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(powerStatus && (!dcBuff.configDisplay.op_USE_SOLAR || dcBuff.dtuData.batVoltage > 4500))
return;
// <20><><EFBFBD><EFBFBD>RFδ<46>رգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(IS_VCC_RF_ON())
return;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LNG-LORA<52><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.configDisplay.op_LNG_LORA)
return;
// Modbus<75><73><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>
VCC_RS485_OFF();
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NVIC_DisableIRQ(EXTI3_IRQn);
NVIC_DisableIRQ(EXTI4_IRQn);
NVIC_DisableIRQ(EXTI9_5_IRQn);
// <20>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD><E6A3AC>ֹ<EFBFBD><D6B9><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
if(!dcBuff.configDisplay.op_BOX_VER)
{
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = DISABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
}
printf("\nEnter to Power-Down ......\n");
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3A8>ι<EFBFBD><CEB9><EFBFBD><EFBFBD>
Watchdog_Feed();
Wakeup_Sleeping = 1;
VCC_SFLASH_FRAM_OFF();
Vcc_Disable();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD><D1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_3);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_4);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_5);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
NVIC_EnableIRQ(EXTI3_IRQn);
NVIC_EnableIRQ(EXTI4_IRQn);
NVIC_EnableIRQ(EXTI9_5_IRQn);
// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ʱ<EFBFBD><CAB1>Դ
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
// <20><>ֹSystick<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
// Wakeup_Sleeping<6E>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3A8><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>
do
{
/* Enter STOP 2 mode */
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}while(Wakeup_Sleeping);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۳<EFBFBD><DBB3><EFBFBD><E6A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
if(dcBuff.configDisplay.op_BOX_VER || dcBuff.configDisplay.op_SEND_GPS_DATA)
{
// <20><>ȡ<EFBFBD>˶<EFBFBD>״̬
Accelero_ReadStatus(LL_GPIO_IsInputPinSet(GPIOD, LL_GPIO_PIN_10));
// <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
}
delay_ms(20);
SFlash_UnlockBPR();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ߡ<EFBFBD>Ϩ<EFBFBD><CFA8><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD>
void Wakeup_SleepDown()
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
uint32_t curr_time;
S_RTC_TIME_DATA_T sRTC;
// <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ
Wakeup_SleepMode = 1;
// <20>ر<EFBFBD><D8B1><EFBFBD>ʾ<EFBFBD><CABE>
HT1621_ScreenOff();
// <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ
VCC_GSM_OFF();
VCC_GPS_OFF();
VCC_RS485_OFF();
VCC_RF_OFF();
VCC_BD_OFF();
VCC_SENSOR_5V_OFF();
// <20>رյ<D8B1><D5B5>ŷ<EFBFBD>
KZ_CHARGE_ENABLE_LOW();
KZ_CHARGE_DISABLE_HIGH();
delay_ms(1000);
KZ_CHARGE_DISABLE_LOW();
// <20>رձ<D8B1><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
KZ_ALARM_OFF();ALARM_OFF();
KZ_LOW_ALARM_OFF();
KZ_LOW_LEVEL_OFF();
KZ_LEVEL_OFF();
// <20><>ֹRTC<54>ж<EFBFBD>
HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A);
HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_B);
// <20><>ֹ<EFBFBD><D6B9><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_10;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = DISABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NVIC_DisableIRQ(EXTI3_IRQn);
NVIC_DisableIRQ(EXTI4_IRQn);
NVIC_DisableIRQ(EXTI9_5_IRQn);
printf("\nEnter to Sleep mode ......\n");
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3A8>ι<EFBFBD><CEB9><EFBFBD><EFBFBD>
Watchdog_Feed();
VCC_SFLASH_FRAM_OFF();
Vcc_Disable();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѣ<EFBFBD><D1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_3);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_4);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_5);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
NVIC_EnableIRQ(EXTI3_IRQn);
NVIC_EnableIRQ(EXTI4_IRQn);
NVIC_EnableIRQ(EXTI9_5_IRQn);
// <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ʱ<EFBFBD><CAB1>Դ
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
// <20><>ֹSystick<63><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
do
{
/* Enter STOP 2 mode */
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
}while(Wakeup_SleepMode);
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ģʽ
uint8_t Wakeup_GetWorkMode()
{
return Wakeup_workMode;
}
// <20><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD>ģʽ
void Wakeup_SetWorkMode()
{
// Ĭ<><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
uint8_t mode = WORK_MODE_NORMAL;
// <20>ŵ<EFBFBD>״̬
if(!VCC_POWER_STATUS())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>ģʽ
if(bat_veryLow)
mode = WORK_MODE_PROTECT;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾģʽ
else if(dcBuff.dtuData.batLow)
mode = WORK_MODE_CHARGE;
}
printf("\nchange work mode from %d to %d\n", Wakeup_workMode, mode);
// <20><><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>ģʽ
if(mode == WORK_MODE_PROTECT)
{
// <20>ر<EFBFBD>DTU<54>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_PowerOff();
// VCC_SENSOR_24V_OFF();
// <20><><EFBFBD><EFBFBD>ģʽ
Wakeup_workMode = mode;
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD>ģʽ
if(Wakeup_workMode == WORK_MODE_PROTECT)
{
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾģʽ
if(mode == WORK_MODE_CHARGE)
{
// <20>ر<EFBFBD>DTU<54>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DTU_PowerOff();
// VCC_SENSOR_24V_OFF();
}
else
{
// VCC_SENSOR_24V_ON();
}
// <20><><EFBFBD><EFBFBD>ģʽ
Wakeup_workMode = mode;
}