/* ****************************************************************************** * * @file UserApp.c * @brief UserApp module * * * @version 1.0 * @date 2023/03/27 15:00:40 * @author Alex Xu * * Copyright (c) 2013-2099,Tkplusemi Technology Co.,Ltd. * All Rights Reserved * * History: * Revision Date Author Desc * 1.0.0 2023/03/27 Alex build this file ******************************************************************************/ /*_____ I N C L U D E S ____________________________________________________*/ #include "userapp.h" #include "gpio.h" #include "adc.h" #include "hall.h" #include "key.h" #include "sleep.h" #include "system.h" #include "bat.h" #include "sys_tim.h" #include "charger_module.h" #include "discharge_module.h" #include "led.h" #include "vox_module.h" /******************************************************************************\ Macro definitions \******************************************************************************/ /******************************************************************************\ Variables definitions \******************************************************************************/ //uint8_t Waring_Event_Flag = 0; //报警事件标志位 s_sys_state Systerm_State = {SLEEP_STATE,AWAKE_STATE,AWAKE_STATE}; /******************************************************************************\ Functions definitions \******************************************************************************/ /***************************************************************************** * Function : SysTerm_State_Machine * Description : System State Handle * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ #if SLEEP_ENABLE void SysTem_State_Machine(void) { if(Systerm_State.Current_State != Systerm_State.Next_State) { Systerm_State.Pre_State = Systerm_State.Current_State ; Systerm_State.Current_State = Systerm_State.Next_State ; switch(Systerm_State.Current_State) { case POWER_ON_STATE: /* 系统上电初始化相关处理逻辑 例如:LED显示UI、和耳机通信等功能; 在这里进行简单示例,两个LED显示闪烁2次。 */ #ifdef LED_DISPLAY LED_R_FLASH(1000,2); LED_G_FLASH(1000,2); #endif #ifdef _DEBUG_MAIN printf("Power On State!Hall(0x%x) (line:%d)\r\n", (uint16_t)CoverStatus,(uint16_t)__LINE__); #endif break; case AWAKE_STATE: /* 系统唤醒后需要处理的功能; 1、使能中断; */ #ifdef _DEBUG_MAIN printf("Awake State (line:%d)\r\n", (uint16_t)__LINE__); #endif break; case NORMAL_STATE: /*系统正常工作中需要处理的功能; 1、初始化进入Sleep的定时器; */ Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; #ifdef _DEBUG_MAIN printf("Normal State (line:%d)\r\n", (uint16_t)__LINE__); #endif break; case SLEEP_STATE: /* 进入Sleep模式前的一些准备工作; 1、使能唤醒中断; */ WakeUp_Init_Set(); //唤醒中断使能设置 #ifdef _DEBUG_MAIN printf("Sleep State (line:%d)\r\n", (uint16_t)__LINE__); #endif break; default: break; } } else { switch(Systerm_State.Current_State) { case POWER_ON_STATE: /*上电初始化需要处理的功能; 1、处理电池电量; 2、获取shipmode唤醒后的唤醒标志位; */ #if 0 if(bat_level < BAT_LEVEL_LOW) //20%电量,进行低电报警。 { // Waring_Event_Flag |= BIT_WARING_BATLOW_EVENT; } #endif Systerm_State.Next_State = AWAKE_STATE; break; case AWAKE_STATE: Systerm_State.Next_State = NORMAL_STATE; break; case NORMAL_STATE: /*1、唤醒后工作N ms后进入Sleep Mode,N需要大于100ms。 2、有VIN存在的情况下,系不会进入sleep mode。 */ // if( (CHIP_STA4 & 0x80) || Vol_LiPro_Flag || Vor_LiPro_Flag) //Power Good if(CHIP_STA4 & 0x80) { Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } else { if(F_sys_tim_1s) { F_sys_tim_1s = 0; if(Decnt_SleepDelay > 0) { #ifdef _DEBUG_MAIN printf("sleep decounter: %d,Adc1:%d,CHIP_STA1:0x%x,Adc4:%d\r\n", (uint16_t)Decnt_SleepDelay,(uint16_t)Adc1,(uint16_t)CHIP_STA1,(uint16_t)Adc4); #endif Decnt_SleepDelay--; /*倒数进Sleep Mode过程中出现了中断,则重新计时。*/ if(Enter_Sleep_Cnt_Restart_Flag) { Enter_Sleep_Cnt_Restart_Flag = 0; Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } if(Decnt_SleepDelay == 0) { #ifdef _DEBUG_MAIN printf("Enter Standby Mode!\r\n"); #endif Systerm_State.Next_State = SLEEP_STATE; //进入Sleep Mode /*清标志位*/ Protect_Type_Flg = 0; gIrq_Event_Type = 0; } } } } break; case SLEEP_STATE: /* 1、检测唤醒源,是否需要唤醒系统; 2、定时唤醒,更新电池电量; */ if(Check_Require_Sleep()) { Enter_Sleep(); } else { Systerm_State.Next_State = AWAKE_STATE; } break; default: break; } } } #endif /* ******************************************************************************* * void System_Drivers_Machine(void) * * Description : 系统驱动相关程序处理。 (最小5ms调用周期) * * Arguments : NONE * Returns : NONE * Notes : NONE * ******************************************************************************* */ void System_Drivers_Machine(void) { #if KEY_HALL_ENABLE Key_Handler(); //按键检测 Hall_Handler(); //开关盖检测 #endif #if DISCHARGE_ENABLE DisCharge_Handler(); //放电boost功能 #endif #if CHARGER_ENABLE Charger_Handler(); //充电功能 #endif } /***************************************************************************** * Function : UserAPP * Description : 5ms调用周期 * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ void UserAPP(void) { static uint8_t Step_Cnt; //uint16_t Vbat_Adc = 0; if(F_sys_tim_5ms) { F_sys_tim_5ms = 0; switch(Step_Cnt) //case0 到case1 结束,周期10ms。后续需要新增其它功能可增加case { case 0: System_Drivers_Machine(); //用于执行芯片驱动程序 Step_Cnt++; break; case 1: #if SLEEP_ENABLE SysTem_State_Machine(); //用于应用程序 #endif Step_Cnt = 0; break; default: Step_Cnt = 0; break; } } if(F_sys_tim_100ms) { F_sys_tim_100ms = 0; #ifdef LED_DISPLAY LED_Drv(); #endif #if VOX_ENABLE Vol_Det_Machine(); Vor_Det_Machine(); #endif } #if 0 if(F_sys_tim_1s) { F_sys_tim_1s = 0; #if ADC_ENABLE Vbat_Adc = Vbat_Value(); //获取Bat电压,用于ADC测试 #endif } #endif }