forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

wujiazhi
2024-06-13 72def895431ad7a08e635b11f3da738e2b2c4618
Function/POWER_MANAGE/power_manage.c
@@ -1,63 +1,36 @@
#include "power_manage.h"
#include "adc.h"
#include "stdlib.h"
#include "low_pwr_test.h"
#include "uart.h"
#include "sundry.h"
#include "extern_rtc.h"
#include "lcd.h"
#include "system_parameter.h"
#include "low_pwr_test.h"
#include "gpio.h"
#include "gprs.h"
#include "master_slave_inter.h"
#include "lcd.h"
#include "working_time_calculate.h"
#include "tim.h"
#include "sizhu_ctrl_word.h"
#include "system_run_fun.h"
#include "system_mem_para.h"
#include "sizhu_ctrl_word.h"
#include "linked_list.h"
PWR_VOL_T pwr_vol_g = {.lith_flag = LMS_PERIOD, .alka_flag = AMS_PERIOD, .mcu_temp_flag = SET,.lith_vcc_per = 100}; // Ä¬ÈÏÉϵç²É¼¯Ò»´ÎµçÁ¿ºÍMCUζÈ
#include "devicegpioinit.h"
PWR_VOL_T pwr_vol_g = {LMS_PERIOD, AMS_PERIOD, SET, .lith_vcc_per = 100}; // Ä¬ÈÏÉϵç²É¼¯Ò»´ÎµçÁ¿ºÍMCUζÈ
uint8_t first_power_get_cnt_g = 0;
void Power_IO_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   OutputIO(LITH_DETECTION_PORT,LITH_DETECTION_PIN,OUT_PUSHPULL);
   InputtIO( LITH_PWR_LOSE_PORT, LITH_PWR_LOSE_PIN, IN_NORMAL);
  CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
  OutputIO(LITHIUM_DETECTION_PORT, LITHIUM_DETECTION_PIN, OUT_PUSHPULL);
  InputtIO(LITHIUM_PWR_DOWN_PORT, LITHIUM_PWR_DOWN_PIN, IN_NORMAL);
  //   InputtIO( LIT_PWR_UNDER_PORT, LIT_PWR_UNDER_PIN, IN_NORMAL);
   OutputIO(ALKA_DETECTION_PORT,ALKA_DETECTION_PIN,OUT_PUSHPULL);
   InputtIO_H( ALKA_PWR_LOSE_PIN, IN_NORMAL);
   ALK_DEC_OFF;
   LIT_DEC_OFF;
   OutputIO(BORROW_PWR_PORT,BORROW_PWR_PIN,OUT_PUSHPULL);
   OutputIO(EX_PWR_EN_PORT,EX_PWR_EN_PIN,OUT_PUSHPULL);
   BORROW_PWR_OFF;
   EX_PWR_OFF;
}
  // OutputIO(ALKALI_DETECTION_PORT, ALKALI_DETECTION_PIN, OUT_PUSHPULL);
  InputtIO(ALKALI_PWR_DOWN_PORT, ALKALI_PWR_DOWN_PIN, IN_NORMAL);
void Lith_Battery_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   AnalogIO(LIT_ADC_PORT,LIT_ADC_PIN);//ADC_IN4
   OutputIO(LITH_DETECTION_PORT,LITH_DETECTION_PIN,OUT_PUSHPULL);
//   AnalogIO(LIT_PWR_UNDER_PORT,LIT_PWR_UNDER_PIN);//ADC_5
}
void Alka_Battery_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   AnalogIO_H(ALK_ADC_PIN);
   OutputIO(ALKA_DETECTION_PORT,ALKA_DETECTION_PIN,OUT_PUSHPULL);
}
void EX_Pwr_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( HWIDO_EX_PWR_PORT, HWIDO_EX_PWR_PIN, IN_NORMAL);
  // ALK_DEC_OFF;
  LIT_DEC_OFF;
}
/******************************************
@@ -71,7 +44,7 @@
 * output:  none
 * return:  calculation sample mean of 64 middle data,multiply by 1000. eg:1.0v -> 1000
 *****************************************/
uint32_t Get_vol_Average(ad_data_s *data_p)
uint32_t Get_vol_average(ad_data_s *data_p)
{
  u32 i, j, t;
  uint32_t temp;
@@ -114,20 +87,21 @@
  float sample_vol;
  float battery_vol = 0;
  ad_data_s *data_ins;
   Alka_Battery_GPIO_Clk_Init();
   ADC_IN8_Init();
  ALK_DEC_ON;
  delay_ms(5);
  // ÉêÇëÈáÐÔÊý×éÄÚ´æ¿Õ¼ä
  if ((data_ins = (ad_data_s *)malloc(sizeof(ad_data_s) + sizeof(uint16_t) * AD_ALKA_BAT_CNT)) != NULL)
  {
    data_ins->ad_buffer_cnt = AD_ALKA_BAT_CNT;
    data_ins->ad_ch = AD_ALKA_BAT_CH;
    volt_ret = Get_vol_Average(data_ins);
  // Alka_Battery_GPIO_Clk_Init();
  ADC_IN10_Init();
  ALKA_TEST_ON; // Ê¹Äܼîµç¼ì²â
      sample_vol = (float)volt_ret * 0.001;
      battery_vol = sample_vol * ALKA_VOL_COE;
    ALK_DEC_OFF;
  //  delay_ms(10);
  // ÉêÇëÈáÐÔÊý×éÄÚ´æ¿Õ¼ä
  if ((data_ins = (ad_data_s *)malloc(sizeof(ad_data_s) + sizeof(uint16_t) * Ad_ALKA_BAT_CNT)) != NULL)
  {
    data_ins->ad_buffer_cnt = Ad_ALKA_BAT_CNT;
    data_ins->ad_ch = Ad_ALKA_BAT_CH;
    volt_ret = Get_vol_average(data_ins);
    sample_vol = (float)volt_ret * 0.001;
    battery_vol = sample_vol * ALKA_VOL_COE;
    ALKA_TEST_OFF;
    /*ÊÍ·ÅÄÚ´æ*/
    free(data_ins);
    data_ins = NULL;
@@ -148,18 +122,18 @@
  float sample_vol;
  float battery_vol = 0;
  ad_data_s *data_ins;
   Lith_Battery_GPIO_Clk_Init();
   ADC_IN4_Init();
  LIT_DEC_ON;
  delay_ms(5);
  if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * AD_LITH_BAT_CNT)) != NULL)
  // Lith_Battery_GPIO_Clk_Init();
  ADC_IN5_Init();
  LITH_TEST_ON; // Ê¹ÄÜ﮵ç¼ì²â
  //  delay_ms(10);
  if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * Ad_LITH_BAT_CNT)) != NULL)
  {
    data_ins->ad_buffer_cnt = AD_LITH_BAT_CNT;
    data_ins->ad_ch = AD_LITH_BAT_CH;
    volt_ret = Get_vol_Average(data_ins);
      sample_vol = (float)volt_ret * 0.001;
      battery_vol = sample_vol * LITH_VOL_COE;
    LIT_DEC_OFF;
    data_ins->ad_buffer_cnt = Ad_LITH_BAT_CNT;
    data_ins->ad_ch = Ad_LITH_BAT_CH;
    volt_ret = Get_vol_average(data_ins);
    sample_vol = (float)volt_ret * 0.001;
    battery_vol = sample_vol * LITH_VOL_COE;
    LITH_TEST_OFF;
    /*ÊÍ·ÅÄÚ´æ*/
    free(data_ins);
    data_ins = NULL;
@@ -168,35 +142,34 @@
  return battery_vol;
}
//float Get_PF6_Bat_Voltage(void)
// float Get_PF6_Bat_Voltage(void)
//{
//   uint32_t volt_ret;
//  float sample_vol;
//  float battery_vol = 0;
//  ad_data_s *data_ins;
//   float sample_vol;
//   float battery_vol = 0;
//   ad_data_s *data_ins;
//   Lith_Battery_GPIO_Clk_Init();
//   ADC_IN5_Init();
//  if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * AD_LITH_PF6_BAT_CNT)) != NULL)
//  {
//    data_ins->ad_buffer_cnt = AD_LITH_PF6_BAT_CNT;
//    data_ins->ad_ch = AD_LITH_PF6_BAT_CH;
//    volt_ret = Get_vol_Average(data_ins);
//   if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * AD_LITH_PF6_BAT_CNT)) != NULL)
//   {
//     data_ins->ad_buffer_cnt = AD_LITH_PF6_BAT_CNT;
//     data_ins->ad_ch = AD_LITH_PF6_BAT_CH;
//     volt_ret = Get_vol_average(data_ins);
//      sample_vol = (float)volt_ret * 0.001;
//      battery_vol = sample_vol * LITH_PF6_VOL_COE;
//    /*ÊÍ·ÅÄÚ´æ*/
//    free(data_ins);
//    data_ins = NULL;
//  }
//  ADC_CR_EN_Setable(DISABLE);
//  return battery_vol;
//}
//     /*ÊÍ·ÅÄÚ´æ*/
//     free(data_ins);
//     data_ins = NULL;
//   }
//   ADC_CR_EN_Setable(DISABLE);
//   return battery_vol;
// }
float Get_Mcu_Temp(void)
{
  ad_data_s *data_ins_vtem;
  float temperature;
   ADC_Temp_Init();
  ADC_Temp_Init();
  if ((data_ins_vtem = (ad_data_s *)malloc(sizeof(ad_data_s) + sizeof(uint16_t) * AD_VTEM_CNT)) != NULL)
  {
@@ -210,324 +183,230 @@
  ADC_CR_EN_Setable(DISABLE);
  return temperature;
}
#define   LITH_BAT_VCC_MAX   7.2f
/*µç³Øµçѹ״̬ÅжÏ,״̬ÍùÉϱä¸üÐèÒª´óÓÚãÐÖµ+0.2V£¬·Àֹ״̬ÔÚãÐÖµÉÏÏÂÌø¶¯*/
void Lith_Bat_Voltage_Status(float lith_vcc,PWR_VOL_T *pwr_vol_p)
/*McuζÈ״̬±¨¾¯´¦Àí*/
#define LCD_TEMPERATURE_LOW_VALUE (-15)
void Mcu_TempStateAlarmHandler(float mcu_temperature, SYS_TEMP_ALARM_CFG_T *sys_temp_alarm_p)
{
   float fTemp;
   if(lith_vcc < bat_para_g.lith_bat_under_v*0.1){
      pwr_vol_p->lith_vcc_status = BAT_V_DOWN;
   }else if(lith_vcc < bat_para_g.lith_bat_under_v*0.1 + 0.2){
      if(pwr_vol_p->lith_vcc_status == BAT_V_DOWN){
         pwr_vol_p->lith_vcc_status = BAT_V_DOWN;
      }else{
         pwr_vol_p->lith_vcc_status = BAT_V_LOW;
      }
   }else if(lith_vcc < bat_para_g.lith_bat_low_v*0.1){
      pwr_vol_p->lith_vcc_status = BAT_V_LOW;
   }else if(lith_vcc < bat_para_g.lith_bat_low_v*0.1 + 0.2){
      if(pwr_vol_p->lith_vcc_status == BAT_V_LOW){
         pwr_vol_p->lith_vcc_status = BAT_V_LOW;
      }else{
         pwr_vol_p->lith_vcc_status = BAT_V_NONE;
      }
   }else{
      pwr_vol_p->lith_vcc_status = BAT_V_NONE;
   }
   /*****¸ù¾Ýµçѹֵ¼ÆËã°Ù·Ö±È£¬Âúµç°´LITH_BAT_VCC_MAXËã***/
   if(pwr_vol_p->lith_vcc_status == BAT_V_DOWN){
      pwr_vol_p->lith_vcc_per = 0;
   }else if(pwr_vol_p->lith_vcc_status == BAT_V_LOW){
      if(bat_para_g.lith_bat_low_v > bat_para_g.lith_bat_under_v){
         fTemp = BAT_PERSENT_LEVEL_1*(lith_vcc - bat_para_g.lith_bat_low_v*0.1) /(0.1*(bat_para_g.lith_bat_low_v - bat_para_g.lith_bat_under_v));
         if(fTemp > 20.0)
            fTemp = 20;
         else if(fTemp <0)
            fTemp = 0;
         pwr_vol_p->lith_vcc_per = fTemp;
      }else
      {
         pwr_vol_p->lith_vcc_per = 0;
      }
   }else
   {
      if(LITH_BAT_VCC_MAX>bat_para_g.lith_bat_low_v*0.1){
         fTemp = (100-BAT_PERSENT_LEVEL_1)*(lith_vcc - bat_para_g.lith_bat_low_v*0.1) /(LITH_BAT_VCC_MAX - bat_para_g.lith_bat_low_v*0.1);
         if(fTemp > 80.0)
            fTemp = 80;
         else if(fTemp <0.0)
            fTemp = 0.0;
         pwr_vol_p->lith_vcc_per = fTemp + 20.0;
      }else{
         pwr_vol_p->lith_vcc_per = 20;
      }
   }
  if (mcu_temperature < sys_temp_alarm_p->cpu_temp_up_scope &&
      mcu_temperature > sys_temp_alarm_p->cpu_temp_down_scope) // Õý³£Î¶Ƞcpu_temp_down < mcu_temp_now < cpu_temp_up
  {
    __SYS_STATUS_BYTES_STATUS(cpu_temp_up, RESET, AV_CPU_TEMP_UP);
    __SYS_STATUS_BYTES_STATUS(cpu_temp_down, RESET, AV_CPU_TEMP_DOWN);
  }
  else if (mcu_temperature >= sys_temp_alarm_p->cpu_temp_up_scope)
    __SYS_STATUS_ALARM_BYTES_SET(cpu_temp_up);
  else if (mcu_temperature <= sys_temp_alarm_p->cpu_temp_down_scope)
    __SYS_STATUS_ALARM_BYTES_SET(cpu_temp_down);
  if (mcu_temperature <= LCD_TEMPERATURE_LOW_VALUE)
    __SYS_STATUS_ALARM_BYTES_SET(lcd_temp_low);
  else
    __SYS_STATUS_BYTES_STATUS(lcd_temp_low, RESET, AV_LCD_TEMP_LOW);
}
/*µç³Øµçѹ״̬ÅжÏ*/
#define LITH_LOW_EFFECTIVE_VOLTAGE_VALUE (3.2f - 2.9f)
void Lith_Bat_Voltage_Status(float lith_vcc, int8_t *pLith_vcc_per)
{
  if (lith_vcc < 3.2f)
  {
    if (__SYS_STATUS_BYTES_GET(lith_under) == RESET || __SYS_STATUS_BYTES_GET(lith_remove) == RESET)
    {
      *pLith_vcc_per = (float)(lith_vcc - 2.9f) / (float)LITH_LOW_EFFECTIVE_VOLTAGE_VALUE * 20;
      if (*pLith_vcc_per < 0)
        *pLith_vcc_per = 1;
    }
  }
  else
    *pLith_vcc_per = 100;
  if (__SYS_STATUS_BYTES_GET(lith_low) == 0 && lith_vcc < 3.2f) // ï®µçµÍµç״̬×ÖδÖÃλ && ï®µç < Ä³µçÁ¿ = ï®µçµÍµç
    __SYS_STATUS_ALARM_BYTES_SET(lith_low);
  else if (__SYS_STATUS_BYTES_GET(lith_low) && lith_vcc >= 3.25f)
    __SYS_STATUS_BYTES_STATUS(lith_low, RESET, AV_LITH_LOW); // Çå³ý﮵çµÍµç״̬
  if (__SYS_STATUS_BYTES_GET(lith_under) == 0 && lith_vcc < 2.9f)
  {
    pwr_vol_g.lith_vcc_per = 0;
    __SYS_STATUS_ALARM_BYTES_SET(lith_under);
  }
  else if (__SYS_STATUS_BYTES_GET(lith_under) && lith_vcc >= 2.95f) // ï®µçǷѹÏû³ý
    __SYS_STATUS_BYTES_STATUS(lith_under, RESET, AV_LITH_UNDER);
  if (__SYS_STATUS_BYTES_GET(lith_remove) && lith_vcc >= 2.5f &&
      GPIO_ReadInputDataBit(LITHIUM_PWR_DOWN_PORT, LITHIUM_PWR_DOWN_PIN) == Bit_SET) // ï®µçÒÆ³ý/µôµçÏû³ý
  {
    __SYS_STATUS_BYTES_STATUS(lith_remove, RESET, AV_LITH_REMOVE);
    SLAVE_PWR_ON;
  }
}
#define   ALKA_BAT_VCC_MAX   6.4f
void Alka_Bat_Voltage_Status(float alka_vcc,PWR_VOL_T *pwr_vol_p)
void Alka_Bat_Voltage_Status(float alka_vcc)
{
   float fTemp;
   if(alka_vcc < bat_para_g.alka_bat_under_v*0.1){
      pwr_vol_p->alka_vcc_status = BAT_V_DOWN;
   }else if(alka_vcc < bat_para_g.alka_bat_under_v*0.1 + 0.2){
      if(pwr_vol_p->alka_vcc_status == BAT_V_DOWN){
         pwr_vol_p->alka_vcc_status = BAT_V_DOWN;
      }else{
         pwr_vol_p->alka_vcc_status = BAT_V_LOW;
      }
   }else if(alka_vcc < bat_para_g.alka_bat_low_v*0.1){
      pwr_vol_p->alka_vcc_status = BAT_V_LOW;
   }else if(alka_vcc < bat_para_g.alka_bat_low_v*0.1 + 0.2){
      if(pwr_vol_p->alka_vcc_status==BAT_V_LOW){
         pwr_vol_p->alka_vcc_status = BAT_V_LOW;
      }else{
         pwr_vol_p->alka_vcc_status = BAT_V_NONE;
      }
   }else{
      pwr_vol_p->alka_vcc_status = BAT_V_NONE;
   }
   /*****¸ù¾Ýµçѹֵ¼ÆËã°Ù·Ö±È£¬Âúµç°´ALKA_BAT_VCC_MAXËã***/
   if(pwr_vol_p->alka_vcc_status == BAT_V_DOWN){
      pwr_vol_p->alka_vcc_per = 0;
   }else if(pwr_vol_p->alka_vcc_status == BAT_V_LOW){
      if(bat_para_g.alka_bat_low_v > bat_para_g.alka_bat_under_v){
         fTemp = BAT_PERSENT_LEVEL_1*(alka_vcc - bat_para_g.alka_bat_low_v*0.1) /(0.1*(bat_para_g.alka_bat_low_v - bat_para_g.alka_bat_under_v));
         if(fTemp > 20.0)
            fTemp = 20;
         else if(fTemp <0)
            fTemp = 0;
         pwr_vol_p->alka_vcc_per = fTemp;
      }else
      {
         pwr_vol_p->alka_vcc_per = 0;
      }
   }else
   {
      if(ALKA_BAT_VCC_MAX>bat_para_g.alka_bat_low_v*0.1){
         fTemp = (100-BAT_PERSENT_LEVEL_1)*(alka_vcc - bat_para_g.alka_bat_low_v*0.1) /(ALKA_BAT_VCC_MAX - bat_para_g.alka_bat_low_v*0.1);
         if(fTemp > 80.0)
            fTemp = 80;
         else if(fTemp <0.0)
            fTemp = 0.0;
         pwr_vol_p->alka_vcc_per = fTemp + 20.0;
      }else{
         pwr_vol_p->alka_vcc_per = 20;
      }
   }
  if (__SYS_STATUS_BYTES_GET(alka_low) == 0 && alka_vcc < 4.85f) // ¼îµçµÍµç
    __SYS_STATUS_ALARM_BYTES_SET(alka_low);
  else if (__SYS_STATUS_BYTES_GET(alka_low) && alka_vcc >= 4.95f)
  {
    __SYS_STATUS_BYTES_STATUS(alka_low, RESET, AV_ALKA_LOW);
  }
  if (__SYS_STATUS_BYTES_GET(alka_under) == 0 && alka_vcc < 4.5f) // ¼îµçǷѹ
    __SYS_STATUS_ALARM_BYTES_SET(alka_under);
  else if (__SYS_STATUS_BYTES_GET(alka_under) && alka_vcc >= 4.6f)
    __SYS_STATUS_BYTES_STATUS(alka_under, RESET, AV_ALKA_UNDER);
  if (__SYS_STATUS_BYTES_GET(alka_remove) && alka_vcc >= 3.0f &&
      GPIO_ReadInputDataBit(ALKALI_PWR_DOWN_PORT, ALKALI_PWR_DOWN_PIN) == Bit_SET) // ¼îµçÒÆ³ý/µôµçÏû³ý
    __SYS_STATUS_BYTES_STATUS(alka_remove, RESET, AV_ALKA_REMOVE);
  if (GPIO_ReadOutputDataBit(LCD_PWR_GPIO_PORT, LCD_PWR_PIN))
    LCD_BACKLIGHT_SELECT(__SYS_STATUS_BYTES_GET(alka_low));
}
/**MCUζÈ״̬ÅжÏ*/
void MCU_temperature_Status(float mcu_tem,PWR_VOL_T *pwr_vol_p)
/*µçÔ´ÖÜÆÚʱ¼äÉèÖÃ*/
void Power_PeriodTimeSet(PWR_VOL_T *pwr_vol_p_p, __IO SYS_STATUS_T *sys_state_p)
{
  static uint8_t alka_last_state[3] = {0}, lith_last_state[3] = {0};
  static uint16_t alka_get_power_period_time_set = 720, lith_get_power_period_time_set = 720;
  /*¼îµç*/
  if (alka_last_state[0] != sys_state_p->alka_low) // ¼îµçµÍµç
  {
    if (sys_state_p->alka_low)
      alka_get_power_period_time_set = 360; // 6Сʱ
    else
      alka_get_power_period_time_set = 720;
    alka_last_state[0] = sys_state_p->alka_low;
    __PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
  }
  if (alka_last_state[1] != sys_state_p->alka_under)
  {
    if (sys_state_p->alka_under)
      alka_get_power_period_time_set = 60; // 1Сʱ
    else
      alka_get_power_period_time_set = 720;
    alka_last_state[1] = sys_state_p->alka_under;
    __PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
  }
  if (alka_last_state[2] != sys_state_p->alka_remove)
  {
    if (sys_state_p->alka_remove)
      alka_get_power_period_time_set = 10; // 1/6Сʱ
    else
      alka_get_power_period_time_set = 720;
    alka_last_state[2] = sys_state_p->alka_remove;
    __PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
  }
  /*﮵ç*/
  if (lith_last_state[0] != sys_state_p->lith_low)
  {
    if (sys_state_p->lith_low)
      lith_get_power_period_time_set = 360; // 6Сʱ
    else
      lith_get_power_period_time_set = 720;
    lith_last_state[0] = sys_state_p->lith_low;
    __PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
  }
  if (lith_last_state[1] != sys_state_p->lith_under)
  {
    if (sys_state_p->lith_under)
      lith_get_power_period_time_set = 60; // 1Сʱ
    else
      lith_get_power_period_time_set = 720;
    lith_last_state[1] = sys_state_p->lith_under;
    __PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
  }
  if (lith_last_state[2] != sys_state_p->lith_remove)
  {
    if (sys_state_p->lith_remove)
      lith_get_power_period_time_set = 10; // 1/6Сʱ
    else
      lith_get_power_period_time_set = 720;
    lith_last_state[2] = sys_state_p->lith_remove;
    __PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
  }
  if (calendar_g.Second == 0x10 &&
      Func_PeriodStartHandler(0, alka_get_power_period_time_set, &period_para_g.alka_get_power_period.period_flag, &period_para_g.alka_get_power_period.last_time_m, &calendar_g))
    pwr_vol_p_p->alka_flag = AMS_PERIOD;
  if (
      calendar_g.Second == 0x12 &&
      Func_PeriodStartHandler(0, lith_get_power_period_time_set, &period_para_g.lith_get_power_period.period_flag, &period_para_g.lith_get_power_period.last_time_m, &calendar_g))
    pwr_vol_p_p->lith_flag = LMS_PERIOD;
  if (calendar_g.Second == 0x14 &&
      Func_PeriodStartHandler(0, 30, &period_para_g.mcu_get_temperature_period.period_flag, &period_para_g.mcu_get_temperature_period.last_time_m, &calendar_g))
    pwr_vol_p_p->mcu_temp_flag = SET;
}
//ï®µç³ØÊ¹ÓÃʱ¼ä¼ÆÊý
void LithBatUseTimeCalculate(BAT_PARA_T *bat_para_p)
uint8_t sys_bst_flag = 0;
void Sys_BST_LithStatus(float lith_vcc)
{
   bat_para_p->lith_bat_used_sec ++;
   if(bat_para_p->lith_bat_used_sec >=3600){
      bat_para_p->lith_bat_used_sec = 0;
      if(bat_para_p->lith_bat_used_hour < 87600) //24Сʱ*365Ìì*10Äê
         bat_para_p->lith_bat_used_hour ++;
      //? ´æ´¢£¬Ôݶ¨Ã¿Ð¡Ê±´æ´¢Ò»´Î
   }
  if (first_power_get_cnt_g >= FIRST_POWER_TIM_MAX)
  {
    if (lith_vcc >= 3.2f)
    {
      SYS_BST_DIS;
      sys_bst_flag = 0;
    }
    else if (lith_vcc < /*3.1f*/ 3.0f)
    {
      SYS_BST_EN;
      sys_bst_flag = 1;
    }
  }
}
#define   EX_PWR_CONTINUE_TIME   5     //Íâµç³ÖÐøÊ±¼ä£¬³ÖÐøXÃëËãÓÐЧ
/*»ñµÃµçԴ״̬¡£ï®µç¡¢¼îµç¡¢Íâµç¡¢MCUζÈ*/
void GetPwrStatusPro(PWR_VOL_T *pwr_vol_p)
/*»ñµÃË«µç³Øµçѹ*/
void Get_Double_Bat_Voltage(PWR_VOL_T *pwr_vol_p)
{
   const uint16_t    DELAY_TIME = 5;
   static uint16_t delay_time_cnt = 0;
   /*¸ß¹¦ºÄ¹¦ÄÜÔËÐнáÊøÖ®ºóÑÓʱһ¶¨Ê±¼äÔÙ¼ì²âµç³Ø*/
   if((sys_fun_run_ctrl_g.rs485_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_g.wrc_ctrl_flag.running_flag == RESET)&&(sys_fun_run_ctrl_g.valve_ctrl_flag.running_flag == RESET)){
      if(delay_time_cnt < DELAY_TIME) delay_time_cnt ++;
   }
   else
      delay_time_cnt = 0;
  /*﮵ç¼îµçÖÜÆÚ´¥·¢*/ //Ôݶ¨¼òµ¥´¦Àí£¬Ò»Ìì¼ì²âÒ»´Î
   if((sys_clockBCD_g.hour == 23)&&(sys_clockBCD_g.min == 57)&&(sys_clockBCD_g.sec == 57)){
      pwr_vol_p->lith_flag = LMS_PERIOD;
      pwr_vol_p->alka_flag = AMS_PERIOD;
   }
   /*MCUζÈÖÜÆÚÐÔ¼ì²â*/ //Ôݶ¨Ã¿Ð¡Ê±¼ì²âÒ»´Î
   if((sys_clockBCD_g.min == 57)&&(sys_clockBCD_g.sec == 58))
      pwr_vol_p->mcu_temp_flag = SET;
   //﮵çµôµçÈ·ÈÏ
   if(pwr_vol_p->lith_lose_check_flag == SET){
      pwr_vol_p->lith_lose_check_flag = RESET;
      if(LITH_PWR_LOSE_IO_READ == Bit_RESET){
         //È·ÈÏ﮵çµôµç
         __SYS_STATUS_ALARM_BYTES_SET(lith_remove); //?﮵çµôµçÖ®ºóÐèҪһЩ½ô¼±´¦Àí£¬±ÈÈçʵʱÊý¾ÝÁ¢Âí´æ´¢Ò»´Î
      }
   }
   //¼îµçµôµçÈ·ÈÏ
   if(pwr_vol_p->alka_lose_check_flag == SET){
      pwr_vol_p->alka_lose_check_flag = RESET;
      if(ALKA_PWR_LOSE_IO_READ == Bit_RESET){
         //È·ÈÏ﮵çµôµç
         __SYS_STATUS_ALARM_BYTES_SET(alka_remove);
      }
   }
   if(pwr_vol_p->lith_flag != LMS_NONE ){
      pwr_vol_p->lith_flag = LMS_NONE;
      pwr_vol_p->lith_vcc = Get_Lith_Bat_Voltage();//﮵ç¼ì²â
      Lith_Bat_Voltage_Status(pwr_vol_p->lith_vcc,pwr_vol_p);
   }
   if((pwr_vol_p->alka_flag != AMS_NONE)&&(delay_time_cnt >= DELAY_TIME) ){
      pwr_vol_p->alka_flag = AMS_PERIOD;
      pwr_vol_p->alka_vcc = Get_Alka_Bat_Voltage();//¼îµç¼ì²â
      Alka_Bat_Voltage_Status(pwr_vol_p->alka_vcc,pwr_vol_p);
   }
   if(pwr_vol_p->mcu_temp_flag == SET){
      pwr_vol_p->mcu_temp_flag = RESET;
      pwr_vol_p->mcu_temperature = Get_Mcu_Temp();//mcuζȻñÈ¡
   }
   /*µç³ØÊ¹ÓÃʱ¼ä¼ÆË㣬ÔÙ¸ù¾Ýµçѹ״̬ºÍʹÓÃʱ¼ä״̬×ۺϵóö×îÖÕµÄµç³Ø×´Ì¬*/
   /*﮵çµçѹǷѹ£¬ÔòºÏ³ÉǷѹ£¬°Ù·Ö±È0£»ï®µçµçѹµÍµç£¬ÔòºÏ³ÉµÍµç£¬°Ù·Ö±È°´µçѹֵÏÔʾ0-20£» ·ñÔò£¬ºÏ³É=ʹÓÃʱ¼äÊ£Ó࣬ºÏ³ÉСÓÚ20ÅжÏΪµÍµç£¬20-100ΪÕý³£*/
   if(__SYS_STATUS_BYTES_GET(power_state) ==RESET)
      LithBatUseTimeCalculate(&bat_para_g);
   if(bat_para_g.lith_bat_used_hour >= bat_para_g.lith_bat_max_hour){
      pwr_vol_p->lith_remain_use_time_per = 0;
   }else{
      pwr_vol_p->lith_remain_use_time_per = 100*(bat_para_g.lith_bat_max_hour - bat_para_g.lith_bat_used_hour)/bat_para_g.lith_bat_max_hour;
   }
   if(pwr_vol_p->lith_vcc_status == BAT_V_DOWN){
      __SYS_STATUS_BYTES_STATUS(lith_down, SET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(lith_low, SET, ALARM_ID_LITH_BAT_LOW);
      pwr_vol_p->lith_synthesize_per = 0;
   }else if(pwr_vol_p->lith_vcc_status == BAT_V_LOW){
      __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(lith_low, SET, ALARM_ID_LITH_BAT_LOW);
      pwr_vol_p->lith_synthesize_per = pwr_vol_p->alka_vcc_per;
   }else{
      pwr_vol_p->lith_synthesize_per = (pwr_vol_p->lith_remain_use_time_per ==100)? 100:pwr_vol_p->lith_remain_use_time_per + 1;  //ΪÁË100%Äܹ»Î¬³ÖÒ»¶Îʱ¼ä£¬µçѹÕý³£×´Ì¬Ê±°Ù·Ö±È²»ÄÜΪ0£¬Îª0¾ÍÒªÏÔʾ¿ÕÁË£¬±£³Ö1¸ñÖÁµçѹ״̬±äΪǷѹ
      if(pwr_vol_p->lith_synthesize_per < 20){
         __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
         __SYS_STATUS_BYTES_STATUS(lith_low, SET, ALARM_ID_LITH_BAT_LOW);
      }else{
         __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
         __SYS_STATUS_BYTES_STATUS(lith_low, RESET, ALARM_ID_LITH_BAT_LOW);
      }
   }
   /*¼îµç³Ø¿ÉÄܸù¾ÝʹÓôÎÊý£¬¶ø²»ÊÇʱ¼ä£¬×îÖÕ״̬ÅжϷ½Ê½´ý¶¨£¿*/
   /****Íâµçʵʱ¼à²â******/
   EX_Pwr_GPIO_Clk_Init();
   if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
      if((pwr_vol_p->ex_pwr_out_cnt!=0)&&(pwr_vol_p->ex_pwr_out_cnt!=EX_PWR_CONTINUE_TIME)){
               //³ÖÐøÖÐ;״̬¸Ä±ä£¬¿ÉÄÜ´ú±íÍâµç²»Îȶ¨£¬Æµ·±³öÏÖÔò±¨¾¯
      }
      pwr_vol_p->ex_pwr_out_cnt = 0;
      if(pwr_vol_p->ex_pwr_in_cnt < EX_PWR_CONTINUE_TIME )
         pwr_vol_p->ex_pwr_in_cnt++;
      if(pwr_vol_p->ex_pwr_in_cnt >=EX_PWR_CONTINUE_TIME){
         if(__SYS_STATUS_BYTES_GET(power_state) != SET){
            EX_PWR_ON;
            __SYS_STATUS_BYTES_STATUS(power_state, SET, ALARM_ID_NORMAL);
            //?Ìí¼ÓÍâµç±ä»¯±¨¾¯
         }
      }
   }else
   {
      if((pwr_vol_p->ex_pwr_in_cnt!=0)&&(pwr_vol_p->ex_pwr_in_cnt!=EX_PWR_CONTINUE_TIME)){
               //³ÖÐøÖÐ;״̬¸Ä±ä£¬¿ÉÄÜ´ú±íÍâµç²»Îȶ¨£¬Æµ·±³öÏÖÔò±¨¾¯
      }
      pwr_vol_p->ex_pwr_in_cnt = 0;
      if(pwr_vol_p->ex_pwr_out_cnt < EX_PWR_CONTINUE_TIME )
         pwr_vol_p->ex_pwr_out_cnt++;
      if(pwr_vol_p->ex_pwr_out_cnt >=EX_PWR_CONTINUE_TIME){
         if(__SYS_STATUS_BYTES_GET(power_state) != RESET){
            EX_PWR_OFF;
            __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
            //?Ìí¼ÓÍâµç±ä»¯±¨¾¯
         }
      }
   }
  /*Ô¶´«·¢ËÍÖÐ*/
  if ((gprs_soft_para_g.gprs_state != GPRS_IDLE) && (gprs_soft_para_g.gprs_state != GPRS_RESTART))
  {
    if (__SYS_STATUS_BYTES_GET(lith_under) || __SYS_STATUS_BYTES_GET(lith_remove))
    {
      __SYS_DELAY_SEC_TIME_SET_(gprs_timeout_para, 0); // ³¬Ê±Ê±¼äÇåÁ㣬²»²úÉú³¬Ê±flag
      gprs_soft_para_g.gprs_state = GPRS_CLOSE_PWR;    // ¹Ø±ÕGPRSµçÔ´
      __SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 1);
    }
  }
  /*ÖÜÆÚ²É¼¯µçѹ*/
  Power_PeriodTimeSet(pwr_vol_p, &sys_admin_g.sys_admin.state_bytes);
  if (LargeCurrent_LimitingProcess() == 3)
  {
    if (pwr_vol_p->alka_flag != AMS_NONE) // ²É¼¯¼îµç
    {
      pwr_vol_p->alka_vcc = Get_Alka_Bat_Voltage();
      sys_realtime_data_g.state_para_s.alka_vcc = pwr_vol_p->alka_vcc * 10;
#ifdef RS232_PRINTF
      printf("alka vcc = %.2f \r\n", pwr_vol_p->alka_vcc);
#endif
      Alka_Bat_Voltage_Status(pwr_vol_p->alka_vcc); // µçÔ´µçÁ¿×´Ì¬ÅжÏ
      if ((pwr_vol_p->alka_flag == AMS_GPRS_BEFORE) && (pwr_vol_p->alka_vcc >= 4.5f))
        gprs_soft_para_g.gprs_state = GPRS_OPEN_PWR;
      else if (pwr_vol_p->alka_flag == AMS_GPRS_BEFORE)
        sys_mode_conversion_show_g = ERROR_1;
      pwr_vol_p->alka_flag = AMS_NONE;
    }
    if (pwr_vol_p->lith_flag != LMS_NONE) // ²É¼¯ï®µç
    {
      pwr_vol_p->lith_vcc = Get_Lith_Bat_Voltage();
      sys_realtime_data_g.state_para_s.lith_vcc = pwr_vol_p->lith_vcc * 10; // floatÀàÐÍ·Å´óÊ®±¶±ä³Éu8ÀàÐÍ
#ifdef RS232_PRINTF
      printf("lith vcc = %.2f \r\n", pwr_vol_p->lith_vcc);
#endif
      Lith_Bat_Voltage_Status(pwr_vol_p->lith_vcc, &pwr_vol_p->lith_vcc_per); // µçÔ´µçÁ¿×´Ì¬ÅжÏ
#ifdef CAL_TEST
      Sys_BST_LithStatus(pwr_vol_p->lith_vcc);
#endif
      if ((pwr_vol_p->lith_flag == LMS_OPEN_VALVE_BEFORE) && (pwr_vol_p->lith_vcc >= 2.9f))
        sys_valve_ctl_id_g = V_KEY_OP;
      else if (pwr_vol_p->lith_flag == LMS_OPEN_VALVE_BEFORE)
        sys_mode_conversion_show_g = ERROR_1;
      pwr_vol_p->lith_flag = LMS_NONE;
    }
    if (pwr_vol_p->mcu_temp_flag == SET) // ²É¼¯MCUζÈ
    {
      pwr_vol_p->mcu_temp_flag = RESET;
      sys_realtime_data_g.state_para_s.cpu_temperature = pwr_vol_p->mcu_temperature = Get_Mcu_Temp();
      Mcu_TempStateAlarmHandler(pwr_vol_p->mcu_temperature, &sys_temp_alarm_cfg_g);
    }
  }
  Remaining_WorkingTime_CalculateProcess(pwr_vol_p->lith_vcc_per, pwr_vol_p->lith_vcc);
}
//³ÌÐòÆô¶¯ºóµçÔ´¹ÜÀí³õʼ»¯£¬ Ê×´ÎÍâµçÅжϣ¬Ê×´Îµç³Øµçѹ²É¼¯
void PowerManagrInit(void)
{
   pwr_vol_g.lith_vcc = Get_Lith_Bat_Voltage();//﮵ç¼ì²â
   if(pwr_vol_g.lith_vcc < bat_para_g.lith_bat_under_v*0.1){
      __SYS_STATUS_BYTES_STATUS(lith_down, SET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(lith_low, SET, ALARM_ID_LITH_BAT_LOW);
   }else if(pwr_vol_g.lith_vcc < bat_para_g.lith_bat_low_v*0.1){
      __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(lith_low, SET, ALARM_ID_LITH_BAT_LOW);
   }else{
      __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(lith_low, RESET, ALARM_ID_LITH_BAT_LOW);
   }
   pwr_vol_g.alka_vcc = Get_Alka_Bat_Voltage();//¼îµç¼ì²â
   if(pwr_vol_g.alka_vcc < bat_para_g.alka_bat_under_v*0.1){
      __SYS_STATUS_BYTES_STATUS(alka_down, SET, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(alka_low, SET, ALARM_ID_ALKA_BAT_LOW);
   }else if(pwr_vol_g.alka_vcc < bat_para_g.alka_bat_low_v*0.1){
      __SYS_STATUS_BYTES_STATUS(alka_down, RESET, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(alka_low, SET, ALARM_ID_ALKA_BAT_LOW);
   }else{
      __SYS_STATUS_BYTES_STATUS(alka_down, RESET, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(alka_low, RESET, ALARM_ID_ALKA_BAT_LOW);
   }
   //Íâµç¼ì²â,HWID0µÍλÓÐÍâµç
   EX_Pwr_GPIO_Clk_Init();
   if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
      delay_ms(10);
      if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
         EX_PWR_ON;
         __SYS_STATUS_BYTES_STATUS(power_state, SET, ALARM_ID_NORMAL);
      }else{
         EX_PWR_OFF;
      __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
      }
   }else{
      EX_PWR_OFF;
      __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
   }
}