337 lines
7.7 KiB
C
337 lines
7.7 KiB
C
#include "low_power_app.h"
|
|
#include "Cpu.h"
|
|
#include "Can_BusOff.h"
|
|
#include "app_encoder.h"
|
|
#include "CanNm.h"
|
|
#include "can_app.h"
|
|
#include "Com_Cfg.h"
|
|
#include "led_app.h"
|
|
#include "main.h"
|
|
#include "Can_Pl.h"
|
|
#include "CanIf.h"
|
|
#include "pwm_manage.h"
|
|
#include "can_app.h"
|
|
#include "WheelHeat.h"
|
|
#include "SimpleOs_Time.h"
|
|
#define LOW_POWER_TASK_PERIOD_TIME 10u
|
|
|
|
#define GOTO_SLEEP_TIMEOUT (5000u / LOW_POWER_TASK_PERIOD_TIME)
|
|
#define LOW_POWER_PRE_WAKEUP_DELAY_2S (2000u / LOW_POWER_TASK_PERIOD_TIME)
|
|
|
|
#define LOW_POWER_APP_ENTER_CRITICAL() System_DisableIrqGlobal()
|
|
#define LOW_POWER_APP_EXIT_CRITICAL() System_EnableIrqGlobal()
|
|
|
|
|
|
uint8_t lp_tim16_wakeup_flag = 0;
|
|
uint8_t gpio_wakeup_flag = 0;
|
|
uint16_t goto_sleep_timer = 0;
|
|
|
|
uint8_t u8LowPowerPreWakeUpDelay = 0u;
|
|
uint8_t u8LowPower4BFMsgWakeUpFlag = 0u;
|
|
void lp_tim16_wakeup_flag_set(void)
|
|
{
|
|
lp_tim16_wakeup_flag = 1;
|
|
}
|
|
|
|
void lp_tim16_wakeup_flag_clear(void)
|
|
{
|
|
lp_tim16_wakeup_flag = 0;
|
|
}
|
|
|
|
uint8_t lp_tim16_wakeup_flag_get(void)
|
|
{
|
|
return (lp_tim16_wakeup_flag);
|
|
}
|
|
|
|
void LowPower4BFMsgWakeUpFlag_Set(void)
|
|
{
|
|
u8LowPower4BFMsgWakeUpFlag = 1u;
|
|
}
|
|
void LowPower4BFMsgWakeUpFlag_Clear(void)
|
|
{
|
|
u8LowPower4BFMsgWakeUpFlag = 0u;
|
|
}
|
|
|
|
void gpio_wakeup_flag_set(void)
|
|
{
|
|
gpio_wakeup_flag = 1;
|
|
}
|
|
|
|
void gpio_wakeup_flag_clear(void)
|
|
{
|
|
gpio_wakeup_flag = 0;
|
|
}
|
|
|
|
uint8_t gpio_wakeup_flag_get(void)
|
|
{
|
|
return gpio_wakeup_flag;
|
|
}
|
|
|
|
/**
|
|
* @brief Sleep
|
|
* @param void
|
|
* @retval void
|
|
*/
|
|
void Sleep(void)
|
|
{
|
|
|
|
FL_PMU_SleepInitTypeDef LPM_InitStruct;
|
|
|
|
// FL_CMU_RCLF_Enable(); /* 暂开启RCLF */
|
|
FL_RMU_PDR_Enable(RMU); /* 打开PDR */
|
|
FL_RMU_BOR_Disable(RMU); /* 关闭BOR 2uA */
|
|
|
|
FL_VREF_Disable(VREF); /* 关闭VREF1p2 */
|
|
|
|
LPM_InitStruct.deepSleep = FL_PMU_SLEEP_MODE_NORMAL;
|
|
LPM_InitStruct.powerMode = FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP;
|
|
LPM_InitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ;
|
|
LPM_InitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US;
|
|
LPM_InitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE;
|
|
LPM_InitStruct.coreVoltageScaling = FL_DISABLE;
|
|
FL_PMU_Sleep_Init(PMU, &LPM_InitStruct);
|
|
/* 使能BOR */
|
|
FL_RMU_BOR_Enable(RMU);
|
|
/* 睡眠电源模式*/
|
|
FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP);
|
|
/* 休眠 */
|
|
__WFI();
|
|
/* 使能VREF1p2 */
|
|
FL_VREF_Enable(VREF);
|
|
}
|
|
|
|
|
|
|
|
void low_power_goto_sleep(void)
|
|
{
|
|
LOW_POWER_APP_ENTER_CRITICAL();
|
|
(void)Led_EnterSleepMode();
|
|
(void)tim_de_init();
|
|
(void)adc_de_init();
|
|
(void)CanTrcv_Disable();
|
|
(void)gpio_goto_sleep();
|
|
(void)pwm_manage_deinit();
|
|
(void)lptim16_init();
|
|
|
|
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
|
|
LOW_POWER_APP_EXIT_CRITICAL();
|
|
}
|
|
|
|
|
|
uint8_t low_power_pre_wakeup_Process(void)
|
|
{
|
|
logic_timer_s logic_delay_100ms;
|
|
uint8_t time_out;
|
|
uint8_t power_gear;
|
|
uint8_t ret;
|
|
uint8_t time_100ms_cnt;
|
|
|
|
(void)clk_init();
|
|
(void)tim_init();
|
|
(void)gpio_goto_wakeup();
|
|
(void)Can_Init();
|
|
(void)CanIf_SetControllerMode(0,CANIF_CS_STARTED);
|
|
(void)Com_RxStart();
|
|
(void)logic_timer_start((logic_timer_s*)&logic_delay_100ms, (void*)NULL_POINT , 100);
|
|
time_100ms_cnt = 0;
|
|
for(;;)
|
|
{
|
|
|
|
can_app_receive_signal(COM_RXSIGBCM1_POWER_GEAR, &power_gear);
|
|
if(power_gear == POWER_GEAR_ON)
|
|
{
|
|
ret = true;
|
|
break;
|
|
}
|
|
if( CanNm_RxIndFlg[0] == TRUE )
|
|
{
|
|
CanNm_RxIndFlg[0] = FALSE;
|
|
ret = true;
|
|
break;
|
|
}
|
|
time_out = logic_timer_out((logic_timer_s*)&logic_delay_100ms);
|
|
if(time_out)
|
|
{
|
|
(void)logic_timer_start((logic_timer_s*)&logic_delay_100ms, (void*)NULL_POINT , 100);
|
|
wdog_task();
|
|
time_100ms_cnt ++;
|
|
if(time_100ms_cnt >= 20u)
|
|
{
|
|
ret = false;
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
void low_power_goto_wakeup(void)
|
|
{
|
|
LOW_POWER_APP_ENTER_CRITICAL();
|
|
|
|
clk_init();
|
|
gpio_init();
|
|
adc_init();
|
|
tim_init();
|
|
system_voltage_manage_init();
|
|
(void)app_encoder_init();
|
|
stack_check_init();
|
|
CanTrcv_Init();
|
|
(void)Can_Init();
|
|
CanIf_Init();
|
|
(void)CanIf_SetControllerMode(0,CANIF_CS_STARTED);
|
|
Com_Init();
|
|
//Com_TxStart();
|
|
Com_RxStart();
|
|
CanTp_Init(((void *) 0));
|
|
CAN_BusOff_Init();
|
|
Dcm_Init(((void *) 0));
|
|
key_app_init();
|
|
(void)key_encoder_driver_init();
|
|
cal_did_init();
|
|
boot_app_init();
|
|
random_init();
|
|
service_27_init();
|
|
dem_task_init();
|
|
WheelHeat_Init();
|
|
(void)CanApp_WakeupProcess();
|
|
// CanNm_PassiveStartUp(0);
|
|
FL_LPTIM16_DeInit(LPTIM16);
|
|
SimpleOsTime_Init();
|
|
goto_sleep_timer = 0;
|
|
u8LowPowerPreWakeUpDelay = LOW_POWER_PRE_WAKEUP_DELAY_2S;
|
|
u8LowPower4BFMsgWakeUpFlag = 0;
|
|
LOW_POWER_APP_EXIT_CRITICAL();
|
|
}
|
|
void low_power_process(void)
|
|
{
|
|
for(;;)
|
|
{
|
|
wdog_task();
|
|
|
|
(void)lp_tim16_wakeup_flag_clear();
|
|
(void)gpio_wakeup_flag_clear();
|
|
(void)low_power_goto_sleep();
|
|
(void)CanTrcv_Disable();
|
|
Sleep();
|
|
if(gpio_wakeup_flag_get() != 0u)
|
|
{
|
|
low_power_goto_wakeup();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void LowPowerPreWakeUpDelay_Start(void)
|
|
{
|
|
u8LowPowerPreWakeUpDelay = LOW_POWER_PRE_WAKEUP_DELAY_2S;
|
|
}
|
|
|
|
uint8_t Is_LowPowerPreWakeUpDelay_Empty(void)
|
|
{
|
|
uint8_t Ret;
|
|
|
|
if(u8LowPowerPreWakeUpDelay != 0U)
|
|
{
|
|
Ret = FALSE;
|
|
}
|
|
else
|
|
{
|
|
Ret = TRUE;
|
|
}
|
|
return Ret;
|
|
}
|
|
|
|
|
|
void low_power_app_task(void)
|
|
{
|
|
Nm_StateType can_nm_state;
|
|
Nm_ModeType can_nm_mode;
|
|
uint8_t power_gear;
|
|
uint8_t led_app_allow_sleep;
|
|
|
|
CanNm_GetState(0 ,(Nm_StateType *)(&can_nm_state),(Nm_ModeType *)(&can_nm_mode));
|
|
can_app_receive_signal(COM_RXSIGBCM1_POWER_GEAR, &power_gear);
|
|
|
|
switch(can_nm_state)
|
|
{
|
|
case NM_STATE_UNINIT:
|
|
while(1);
|
|
break;
|
|
case NM_STATE_BUS_SLEEP:
|
|
if(u8LowPowerPreWakeUpDelay)
|
|
{
|
|
u8LowPowerPreWakeUpDelay --;
|
|
if((power_gear != POWER_GEAR_OFF) || (u8LowPower4BFMsgWakeUpFlag != 0u))
|
|
{
|
|
u8LowPowerPreWakeUpDelay = 0;
|
|
CanNm_PassiveStartUp(0);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
led_app_allow_sleep = is_led_app_allow_sleep();
|
|
goto_sleep_timer ++;
|
|
if((led_app_allow_sleep == true) || (goto_sleep_timer >= GOTO_SLEEP_TIMEOUT))
|
|
{
|
|
low_power_process();
|
|
}
|
|
}
|
|
|
|
break;
|
|
case NM_STATE_PREPARE_BUS_SLEEP:
|
|
goto_sleep_timer = 0;
|
|
if((power_gear != POWER_GEAR_OFF))
|
|
{
|
|
CanNm_PassiveStartUp(0);
|
|
}
|
|
break;
|
|
case NM_STATE_READY_SLEEP:
|
|
goto_sleep_timer = 0;
|
|
if((power_gear != POWER_GEAR_OFF))
|
|
{
|
|
CanNm_NetworkRequest(0);
|
|
}
|
|
break;
|
|
case NM_STATE_REPEAT_MESSAGE:
|
|
goto_sleep_timer = 0;
|
|
if((power_gear != POWER_GEAR_OFF))
|
|
{
|
|
CanNm_NetworkRequest(0);
|
|
}
|
|
else
|
|
{
|
|
CanNm_NetworkRelease(0);
|
|
}
|
|
break;
|
|
case NM_STATE_NORMAL_OPERATION:
|
|
case NM_STATE_SYNCHRONIZE:
|
|
case NM_STATE_WAIT_CHECK_ACTIVATION:
|
|
case NM_STATE_WAIT_NETWORK_STARTUP:
|
|
goto_sleep_timer = 0;
|
|
if((power_gear == POWER_GEAR_OFF))
|
|
{
|
|
CanNm_NetworkRelease(0);
|
|
}
|
|
break;
|
|
default:
|
|
while(1);
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|