/** * @file Power.c * @author Wang, Zhiyu(wangzy49@midea.com) * @brief Power of ebike * @version 0.1 * @date 2021-09-29 * * @copyright Copyright (c) 2021 * */ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #include "syspar.h" #include "typedefine.h" #include "mathtool.h" //#include "at32f421.h"//#include "stm32f10x.h" #include "power.h" #include "AssistCurve.h" #include "bikeinformation.h" //#include "api.h" #include "board_config.h" #include "FSM_2nd.h" #include "usart.h" #include "UserGpio_Config.h" /****************************** * * Parameter * ******************************/ POWER_OUT power_stPowStateOut = POWER_OUT_DEFAULT; static POWER_COF power_stPowStateCof = POWER_COF_DEFAULT; void Power_KeyChangeHandle(void); /*************************************************************** Function: power_voPowerInit; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void power_voPowerInit(void) { power_stPowStateOut.powerstate = POWER_START; power_stPowStateOut.blPowerShutdownFlg = FALSE; power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerOn2OffCnt = 0; power_stPowStateOut.uwPowerShutdnCnt = 0; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateOut.uwPowerKeySta =0; power_stPowStateOut.uwPowerKeyMode =0; UWORD uwStartUpTime,uwShutDownTime; uwStartUpTime = (ass_ParaCong.uwAutoPowerOffTime & 0xF000)>>12; // uwStartUpTime = 2; uwShutDownTime = (ass_ParaCong.uwAutoPowerOffTime & 0x0F00)>>8; if(uwStartUpTime != 0) { power_stPowStateCof.uwPowerStartTouchTimeCnt = uwStartUpTime * 200 / POWER_START_TIMERUNIT; } else { power_stPowStateCof.uwPowerStartTouchTimeCnt = POWER_START_TOUCHING_TIME / POWER_START_TIMERUNIT; } if(uwShutDownTime != 0) { power_stPowStateCof.uwPowerShutTouchTimeCnt = uwShutDownTime * 200 / POWER_SHUT_TIMERUNIT; } else { power_stPowStateCof.uwPowerShutTouchTimeCnt = POWER_SHUT_TOUCHING_TIME / POWER_SHUT_TIMERUNIT; } power_stPowStateCof.uwPowerStartEndCnt = POWER_START_FULLYON_TIME / POWER_START_TIMERUNIT; power_stPowStateCof.uwPowerShutEndCnt = POWER_SHUT_FULLYOFF_TIME / POWER_SHUT_TIMERUNIT; power_stPowStateCof.uwPowerOn2OffTimeCnt = POWER_ON2OFF_TIME / POWER_SHUT_TIMERUNIT; } /*************************************************************** Function: power_voPowerManagement; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void power_voPowerManagement( _Bool ParaSaveEEFlg, _Bool PowerSleepFlg) { #if(BIKE_OXFORD_EN!=0) if (power_stPowStateOut.powerstate == POWER_START && GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12) != 0) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt) { cp_stHistoryPara.uwOpenTimes++; GPIO_SetBits(POWER_LOCK_PORT,POWER_LOCK_PIN);// iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_HighLevel); power_stPowStateOut.powerstate = POWER_ON; power_stPowStateOut.uwPowerStartupCnt = 0; } } else if (power_stPowStateOut.powerstate == POWER_ON) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartEndCnt) { power_stPowStateOut.powerstate = POWER_ON_END; power_stPowStateOut.blPowerStartupFlg = TRUE; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateOut.uwPowerOn2OffCnt = 0; } } /////////////////////////////////////////////////////// off ///////////////////////////////////////////// // if ( (GPIO_ReadInputDataBit(POWER_SWSTATE_PORT, POWER_SWSTATE_PIN) == RESET)) if(( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_12) == 0)&&(power_stPowStateOut.powerstate == POWER_ON_END)) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutTouchTimeCnt) { power_stPowStateOut.powerstate = POWER_OFF; cp_stFlg.ParaHistorySaveEEFinishFlg = FALSE; power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerShutdnCnt = 0; } } else if (power_stPowStateOut.powerstate == POWER_OFF) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutEndCnt && cp_stFlg.ParaHistorySaveEEFinishFlg == TRUE && ParaSaveEEFlg == FALSE) { power_stPowStateOut.powerstate = POWER_OFF_END; power_stPowStateOut.blPowerShutdownFlg = TRUE; power_stPowStateOut.uwPowerShutdnCnt = 0; GPIO_ResetBits(POWER_LOCK_PORT,POWER_LOCK_PIN);// iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_LowLevel); } } else { power_stPowStateOut.uwPowerShutdnCnt = 0; } // if (power_stPowStateOut.powerstate == POWER_ON_END && GPIO_ReadInputDataBit(POWER_SWSTATE_PORT, POWER_SWSTATE_PIN) == RESET) // { // power_stPowStateOut.powerstate = POWER_ON_END; // power_stPowStateOut.uwPowerStartupCnt = 0; // power_stPowStateOut.uwPowerShutdnCnt = 0; // } #else if((adc_stUpOut.uwPoweAdcrLpfPu < NULL_KEYMAXVOL)&&(adc_stUpOut.uwPoweAdcrLpfPu > NULL_KEYMINVOL)) { power_stPowStateOut.uwPowerKeySta=0; if(power_stPowStateCof.uwPowerModeTime>0) power_stPowStateCof.uwPowerModeTime--; } else if(adc_stUpOut.uwPoweAdcrLpfPu > High_KEYVOL) { if(power_stPowStateCof.uwPowerModeTime<10) { power_stPowStateCof.uwPowerModeTime++; } else { power_stPowStateOut.uwPowerKeySta=1; if(power_stPowStateOut.powerstate == POWER_START) { power_stPowStateOut.uwPowerKeyMode=1; } } } else if(adc_stUpOut.uwPoweAdcrLpfPu < LOW_KEYVOL) { if(++power_stPowStateCof.uwPowerModeTime<10) { power_stPowStateCof.uwPowerModeTime++; } else { power_stPowStateOut.uwPowerKeySta=1; if(power_stPowStateOut.powerstate == POWER_START) { power_stPowStateOut.uwPowerKeyMode=2; } } } ////////////////////////////////////////////////// on and standby //////////////// if( power_stPowStateOut.uwPowerKeyMode ==1) { if (((power_stPowStateOut.powerstate == POWER_START)||(power_stPowStateOut.blPowerShutdownFlg==TRUE) ) && power_stPowStateOut.uwPowerKeySta != 0) // if (power_stPowStateOut.powerstate == POWER_START ) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt) { cp_stHistoryPara.uwOpenTimes++; Set_POWER_LOCK_PORT();// GPIO_SetBits(POWER_LOCK_PORT,POWER_LOCK_PIN);//iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_HighLevel); power_stPowStateOut.powerstate = POWER_ON; power_stPowStateOut.uwPowerStartupCnt = 0; } } else if (power_stPowStateOut.powerstate == POWER_ON) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartEndCnt) { power_stPowStateOut.powerstate = POWER_ON_END; power_stPowStateOut.blPowerStartupFlg = TRUE; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateOut.uwPowerOn2OffCnt = 0; power_stPowStateOut.blPowerShutdownFlg = FALSE; } } else { power_stPowStateOut.uwPowerStartupCnt = 0; } /////////////////////////////////////////////////////// off ///////////////////////////////////////////// if ((power_stPowStateOut.powerstate == POWER_ON_END) && (power_stPowStateOut.uwPowerKeySta == 0 /* || PowerSleepFlg == TRUE*/)) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutTouchTimeCnt) { power_stPowStateOut.powerstate = POWER_OFF; // if(adc_stUpOut.uwVdcLpfPu> POWERMINVOLT) { cp_stFlg.ParaHistorySaveEEFinishFlg = FALSE; } power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerShutdnCnt = 0; //SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN"); } } else if (power_stPowStateOut.powerstate == POWER_OFF) { power_stPowStateOut.uwPowerShutdnCnt++; if ((power_stPowStateOut.uwPowerShutdnCnt >= POWER_SHUT_STOPDELAY_TIME)||(FSM2nd_Run_state.state == Exit)) { power_stPowStateOut.powerstate = POWER_OFF_END; // if(adc_stUpOut.uwVdcLpfPu> POWERMINVOLT) { cp_stFlg.ParaHistorySaveEEFinishFlg = FALSE; } power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerShutdnCnt = 0; } } else if(power_stPowStateOut.powerstate == POWER_OFF_END) { power_stPowStateOut.uwPowerShutdnCnt++; if ((power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutEndCnt) && (cp_stFlg.ParaHistorySaveEEFinishFlg == TRUE) && (ParaSaveEEFlg == FALSE)) { power_stPowStateOut.uwPowerShutdnCnt = 0; Reset_POWER_LOCK_PORT();// GPIO_ResetBits(POWER_LOCK_PORT,POWER_LOCK_PIN);// iGpio_Write(HW_GPIO_POWERLOCK_PIN,ApiGpio_LowLevel); // DL_WWDT_disablePower(WWDT0_INST); // NVIC_SystemReset(); //Power_KeyChangeHandle(); power_stPowStateOut.uwPowershutDownSta=1; } } else { power_stPowStateOut.uwPowerShutdnCnt = 0; } } ////////////////////////////--------------------------uwPowerKeyMode 2-------- /////////////////////////////////////////////////////// else if(power_stPowStateOut.uwPowerKeyMode==2) { if (power_stPowStateOut.powerstate == POWER_START && power_stPowStateOut.uwPowerKeySta != 0) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartTouchTimeCnt) { cp_stHistoryPara.uwOpenTimes++; Set_POWER_LOCK_PORT(); power_stPowStateOut.powerstate = POWER_ON; power_stPowStateOut.uwPowerStartupCnt = 0; } } else if (power_stPowStateOut.powerstate == POWER_ON) { power_stPowStateOut.uwPowerStartupCnt++; if (power_stPowStateOut.uwPowerStartupCnt == power_stPowStateCof.uwPowerStartEndCnt) { power_stPowStateOut.powerstate = POWER_ON_END; power_stPowStateOut.blPowerStartupFlg = TRUE; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateOut.uwPowerOn2OffCnt = 0; power_stPowStateOut.blPowerShutdownFlg = FALSE; } } else if (power_stPowStateOut.powerstate == POWER_ON_END) { if ((power_stPowStateOut.uwPowerOn2OffCnt < power_stPowStateCof.uwPowerOn2OffTimeCnt) && (power_stPowStateOut.uwPowerKeySta == 0)) { power_stPowStateOut.uwPowerOn2OffCnt++; } } else { power_stPowStateOut.uwPowerStartupCnt = 0; } /////////////////////////////////////////////////////// off ///////////////////////////////////////////// if (((power_stPowStateOut.powerstate == POWER_ON_END) ) && (power_stPowStateOut.uwPowerOn2OffCnt == power_stPowStateCof.uwPowerOn2OffTimeCnt) &&((power_stPowStateOut.uwPowerKeySta != 0) || (PowerSleepFlg == TRUE))) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutTouchTimeCnt) { power_stPowStateOut.powerstate = POWER_OFF; cp_stFlg.ParaHistorySaveEEFinishFlg = FALSE; power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerShutdnCnt = 0; power_stPowStateOut.uwPOwerForceShutdnCnt=0; // SendData(ID_MC_BC, MODE_REPORT, 0x1808, (uint8_t *)"SHUTDOWN"); } } else if (power_stPowStateOut.powerstate == POWER_OFF) { power_stPowStateOut.uwPowerShutdnCnt++; if ((power_stPowStateOut.uwPowerShutdnCnt >= POWER_SHUT_STOPDELAY_TIME)||(FSM2nd_Run_state.state == Exit)) { power_stPowStateOut.powerstate = POWER_OFF_END; cp_stFlg.ParaHistorySaveEEFinishFlg = FALSE; power_stPowStateOut.blPowerStartupFlg = FALSE; power_stPowStateOut.uwPowerShutdnCnt = 0; power_stPowStateOut.uwPOwerForceShutdnCnt=0; } } else if(power_stPowStateOut.powerstate == POWER_OFF_END) { power_stPowStateOut.uwPowerShutdnCnt++; if (power_stPowStateOut.uwPowerShutdnCnt >= power_stPowStateCof.uwPowerShutEndCnt && cp_stFlg.ParaHistorySaveEEFinishFlg == TRUE && ParaSaveEEFlg == FALSE) { power_stPowStateOut.uwPowerShutdnCnt = 0; Reset_POWER_LOCK_PORT(); // Power_KeyChangeHandle(); if(power_stPowStateOut.uwPowerKeySta==0) //松开按键 power_stPowStateOut.uwPowershutDownSta=1; } if(power_stPowStateOut.uwPowerKeySta != 0) { if(++power_stPowStateOut.uwPOwerForceShutdnCnt>(power_stPowStateCof.uwPowerShutEndCnt+50)) { power_stPowStateOut.uwPowerShutdnCnt = 0; Reset_POWER_LOCK_PORT(); // Power_KeyChangeHandle(); } } else { power_stPowStateOut.uwPOwerForceShutdnCnt=0; } } else { power_stPowStateOut.uwPowerShutdnCnt = 0; power_stPowStateOut.uwPOwerForceShutdnCnt=0; } if ((power_stPowStateOut.powerstate == POWER_ON_END && (power_stPowStateOut.uwPowerKeySta == 0)&&(PowerSleepFlg == FALSE))) { power_stPowStateOut.powerstate = POWER_ON_END; power_stPowStateOut.uwPowerStartupCnt = 0; power_stPowStateOut.uwPowerShutdnCnt = 0; } } //--------------------------解决开机异常------ if((power_stPowStateOut.powerstate == POWER_START) && (power_stPowStateOut.uwPowerKeySta == 0)) //供电下没有按下开机键 { if(++power_stPowStateOut.uwNulltime>500) { power_stPowStateOut.uwNulltime=0; power_stPowStateOut.uwPowershutDownSta=1; } } else { power_stPowStateOut.uwNulltime=0; } if(power_stPowStateOut.uwPowershutDownSta!=0) { Power_KeyChangeHandle(); } #endif } void Power_KeyChangeHandle(void) { static UWORD uWPtime=0; if(uWPtime<=200) { uWPtime++; DL_GPIO_initDigitalOutput(IOMUX_PINCM60); DL_GPIO_clearPins(GPIOA,DL_GPIO_PIN_27); DL_GPIO_enableOutput(GPIOA, DL_GPIO_PIN_27); DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_27); } else { //if(uWPtime<50) { uWPtime=0; SYSCFG_DL_ADC12_0_init(); DL_WWDT_disablePower(WWDT0_INST); NVIC_SystemReset(); power_stPowStateOut.uwPowershutDownSta=0; power_stPowStateOut.blPowerShutdownFlg = TRUE; } } } /************************************************************************* End of this File (EOF)! Do not put anything after this part! *************************************************************************/