/* ****************************************************************************** * * @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" #include "gpio_comm.h" /******************************************************************************\ Macro definitions \******************************************************************************/ #define LED_ON_CNT 30 //LED显示2s后熄灭 #define LED_ON_KEY_CNT 38 #define LED_ON_LOW_CNT 32 #define LED_OFF_CNT 5 #define LED_KEY_BLINK_CNT 5 #define LED_BLINK_CNT 5 #define LED_PRO_TIM 40 #define LED_PRO_CNT 2 /******************************************************************************\ Variables definitions \******************************************************************************/ bit LED_On_Flag = 0; bit Wkup_Earphone_Flag = 0; /******************************************************************************\ Functions definitions \******************************************************************************/ #ifdef LED_DISPLAY /***************************************************************************** * Function : void LED_Disp_Off(void) * Description : NONE * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ void LED_Disp_Off(void) { #ifdef BREATHING_LIGHT BL_LED.Breathing_Light_On = 0; #endif LEDR_OFF(); LEDB_OFF(); #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = 1; #endif } /***************************************************************************** * Function : void LED_Display_App(void) * Description : 100ms调用周期 * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ void LED_Display_App(void) { static uint8_t LED_On_Timer; //led亮时间计时 static bit LED_On_Flag1; static bit LED_On_Chg_Flag; static bit LED_On_ChgDone_Flag; static uint8_t LED_On_Cnt; /*NTC保护,4灯一直快闪(2Hz)*/ if( NTC_Pro_Flag || Vox_Output_Short_Flag ) { if( !LED_On_Flag1 ) { LED_On_Flag1 = 1; LED_Disp_Off(); } else { if( LED_On_Timer <= LED_PRO_TIM ) { LED_On_Timer++; if( (LED_On_Timer % LED_PRO_CNT == 0) ) { LEDR_TOG(); } } else { LEDR_OFF(); } } #if SLEEP_ENABLE Enter_Sleep_Cnt_Restart_Flag = 1; #endif return; } /* 保护消失后,需要开启5V升压一段时间。 */ if( LED_On_Flag1 ) { LED_On_Flag1 = 0; LED_Disp_Off(); LED_On_Chg_Flag = 0; LED_On_ChgDone_Flag = 0; LED_On_Flag = 1; Wkup_Earphone_Flag = 1; } if ( CHIP_STA4 & 0x80 ) //充电中 { if ( Charger_Done ) // 充电完成,LED2常亮 { if( !LED_On_ChgDone_Flag ) { LED_On_ChgDone_Flag = 1; LED_Disp_Off(); } LEDB_ON(); } else //充电中,LED1呼吸 { if( !LED_On_Chg_Flag ) { LED_On_Chg_Flag = 1; LED_On_ChgDone_Flag = 0; LED_Disp_Off(); } else { #ifdef BREATHING_LIGHT BL_LED.Breathing_Light_On = 1; #endif } } Key_Press_irq = 0; Key_Press_ll_irq_led = 0; CoverEvent_Flg_led = 0; LED_On_Flag = 0; } else { if( LED_On_Chg_Flag ) { LED_On_Chg_Flag = 0; LED_On_ChgDone_Flag = 0; LED_On_Flag = 1; Wkup_Earphone_Flag = 1; } if( LED_On_Flag ) { LED_On_Timer = 0; LED_On_Flag = 0; LED_Disp_Off(); } if( F_batlevel_protect ) { Key_Press_irq = 0; Key_Press_ll_irq_led = 0; CoverEvent_Flg_led = 0; Earphone_Chg_Flag = 0; LED_On_Flag = 1; //清LED显示 } else { if( (Earphone_Chg_Flag || Key_Press_irq || Key_Press_ll_irq_led || CoverEvent_Flg_led) ) //耳机出入盒、按键触发,显示灯效 { if( Key_Press_ll_irq_led ) { LED_On_Cnt = LED_ON_KEY_CNT + LED_OFF_CNT; } else { LED_On_Cnt = LED_ON_CNT + LED_OFF_CNT; } if( LED_On_Timer < LED_OFF_CNT ) { LED_On_Timer++; } else if( LED_On_Timer < LED_On_Cnt ) { LED_On_Timer++; if( Key_Press_ll_irq_led ) { if( (LED_On_Timer % LED_KEY_BLINK_CNT == 0) ) { LEDB_TOG(); } } else if( F_batlevel_low ) { if( (LED_On_Timer % LED_BLINK_CNT == 0) ) { LEDR_TOG(); } } else { LEDB_ON(); } } else { Key_Press_irq = 0; Key_Press_ll_irq_led = 0; CoverEvent_Flg_led = 0; Earphone_Chg_Flag = 0; LED_On_Flag = 1; //清LED显示 } } } } } #endif /***************************************************************************** * Function : UserAPP * Description : 5ms调用周期 * Input : None * Output : None * Return : None * Note : None *****************************************************************************/ void UserAPP(void) { /*LED灯显功能驱动函数*/ if(F_sys_tim_1ms) { F_sys_tim_1ms = 0; #if VOX_TX_PATTERN Gpio_Comm(); #endif } if(F_sys_tim_100ms) { F_sys_tim_100ms = 0; #ifdef HALL_ENABLE Hall_Handler(); //开关盖检测 #endif #if DISCHARGE_ENABLE DisCharge_Handler(); //放电boost功能 #endif #if CHARGER_ENABLE Charger_Handler(); //充电功能 #endif #ifdef KEY_ENABLE Key_Handler(); //按键检测 #endif #if ADC_ENABLE Vbat_Adc = Vbat_Value(); //获取Bat电压 #ifdef NTC_ENABLE NTC_Pro_Flag = PMU_NTC_Control(); #endif Vref_Adc = ADC_Chn_Data(ADC_VREF); //获取参考电压 #endif #if VOX_ENABLE Vox_Det_Machine(); //开关盖盒子功能逻辑。 #endif #if BAT_VALUE check_bat_level(); //电量计 #endif #if LED_DISPLAY LED_Display_App(); //4颗LED灯显示UI #endif } if( F_sys_tim_1s ) { F_sys_tim_1s = 0; #if SLEEP_ENABLE /*1、唤醒后倒数Ns后进入Sleep Mode。 2、有VIN存在、Boost放电、有中断触发的情况下,系不会进入sleep mode。 */ if( Decnt_SleepDelay > 0 ) { Decnt_SleepDelay--; /*倒数进Sleep Mode过程中出现了KEY\HALL\Loadon\IOFF中断,则重新计时。*/ if( Enter_Sleep_Cnt_Restart_Flag ) { Enter_Sleep_Cnt_Restart_Flag = 0; Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } #ifdef _DEBUG_MAIN printf("sleep decnt:%d,STA0:0x%x,STA1:0x%x,STA2:0x%x,STA4:0x%x\r\n", (uint16_t)Decnt_SleepDelay,(uint16_t)CHIP_STA0,(uint16_t)CHIP_STA1,(uint16_t)CHIP_STA2,(uint16_t)CHIP_STA4); #endif return; } { if( Check_Require_Sleep() ) { /* Boost UVLO保护,需要关闭ADT唤醒,否则会出现进不了休眠的问题。 */ if( CHIP_STA0 & 0x80 ) { /* Enter Sleep */ SFRADDR = WKUP_EN3; //vox loadon wake up enable SFRDATA &= ~0x3C; } else { /* Enter Sleep */ SFRADDR = WKUP_EN3; //vox loadon wake up enable SFRDATA |= 0x3C; } /* InSleep Handler */ //Disable All IRQ #ifdef TIMER1_ENABLE ET1 = 0; //timer1 IRQ Disable #endif #if UART0_ENABLE ES0 = 0; //UART0 IRQ Disable #endif EX2 = 0; ET0 = 0; //timer0 IRQ Disable VOX_CTL0 &= ~0x30; //VOX 5v Off #if DISCHARGE_ENABLE BST_EN = 0; //Boost Disable #endif SFRADDR = ADC_CTL0; SFRDATA &= ~0x80; //ADC Disable. SFRADDR = PMU_CTL0; //芯片硬件需求,固定 SFRDATA &= ~0x30; PCON |= 0x02; //Enter StandbyMode, Only int0 or int1 can wake up system SFRADDR = PMU_CTL0; //芯片硬件需求,固定 SFRDATA |= 0x30; /* OutSleep Handler */ //Enable IRQ #if UART0_ENABLE ES0 = 1; //UART0 IRQ #endif EX2 = 1; ET0 = 1; //timer0 IRQ #ifdef TIMER1_ENABLE ET1 = 1; //timer1 IRQ #endif Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } else { Decnt_SleepDelay = ENTER_STANDBYMODE_CNT; } } #endif } }