SY883x_For_WEIHUA_W13/UsrSrc/userapp/userapp.c

563 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
******************************************************************************
*
* @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
\******************************************************************************/
#if LED_188
#define LED_ON_CNT 10 //充满显示10s后熄灭
#define LED_BLINK_CNT 1
#define LED_NUM_UNIT_CNT 1
#define LED_COVER_CNT 4 //开关盖显示4s后熄灭
#define BATLEV_UPDATE_UINT_TIM_CHG0 20 //无输出充电时间
#define BATLEV_UPDATE_UINT_TIM_CHG1 30 //40mA输出充电时间。
#define BATLEV_UPDATE_UINT_TIM_CHG2 35 //80mA输出充电时间。
#define BATLEV_UPDATE_UINT_TIM_DISCHG0 80 //慢放电时间
#define BATLEV_UPDATE_UINT_TIM_DISCHG1 10 //放电快追时间
#define BATLEV_UPDATE_UINT_TIM_DISCHG2 50 //电量小于10%时的放电时间
#endif
#define VOX_RST_CNT 3 //Vox软复位debounce时间
/******************************************************************************\
Variables definitions
\******************************************************************************/
uint8_t bat_level_update = 188;
uint8_t LED_On_Timer = 0; //led亮时间计时
uint8_t Vox_Rst_Debounce = 0;
bit CHG_LED_Disp_Flag = 0;
#if LED_188
uint8_t bat_level_Disp_Num = 0;
bit LED_188_Disp_Flg = 0;
uint8_t Disp_Vor_Lev = 0;
uint8_t Disp_Vol_Lev = 0;
#endif
/******************************************************************************\
Functions definitions
\******************************************************************************/
#if LED_188
/*****************************************************************************
* Function : void LED_Display_App(void)
* Description : 5000ms调用周期
* Input : None
* Output : None
* Return : None
* Note : None
*****************************************************************************/
/*
灯效
数码管:
充电:显示百分百比电量,个位数闪烁
放电:左右耳对应的图标跑马,从下往上,盒子电量常亮(边充边放时,耳机图标和百分比要同时变化)。
开盖显示充电盒百分比电量4S后灭掉。
关盖有耳机充电则参考“放电灯效”没耳机则显示百分百比电量4S后灭掉。
*/
bit Init_LED_Disp_Flag = 0;
uint8_t BatLev_Update_Uint_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG1;
uint8_t BatLev_Update_Uint_CHG_Tim = 0;
//uint8_t BatLev_Update_Uint_DisCHG_Tim = 0;
void LED_188Display_App(void)
{
uint8_t i = 0;
static uint8_t BatLev_Update_Uint_Cnt;
if (bat_level_update != bat_level) //电量发生变化,不能立刻变化,需要缓慢变化
{
bat_level_Disp_Num = 10 * bat_level;
bat_level_update = bat_level;
}
else
{
BatLev_Update_Uint_Cnt++;
if( BatLev_Update_Uint_Cnt > BatLev_Update_Uint_Tim )
{
BatLev_Update_Uint_Cnt = 0;
if ( CHIP_STA4 & 0x80 ) //充电中
{
if( g_188_Num < (bat_level_Disp_Num + 9) )
{
g_188_Num += 1;
}
BatLev_Update_Uint_Tim = BatLev_Update_Uint_CHG_Tim; //充电30s更新一次电量个位数
}
else
{
if( ( Vor_Vout_Enable == ON ) || ( Vol_Vout_Enable == ON ) ) //有耳机充电,电量才减
{
if ( bat_level_Disp_Num <= 10 )
{
if( g_188_Num > 10 )
{
BatLev_Update_Uint_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG1;
}
else
{
BatLev_Update_Uint_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG2; /* 2、当显示的电量小于10%则60s变化一次。*/
}
}
else
{
if( g_188_Num > bat_level_Disp_Num )
{
/* 1、当188数码管显示的电量比实际电量大则数字快速变化。 */
if( ( g_188_Num - bat_level_Disp_Num ) > 5 )
{
BatLev_Update_Uint_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG1;
}
else
{
BatLev_Update_Uint_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG0; /*3、当显示电量和实际电量差不多时则60s更新一次电量个位数 */
}
}
}
if( g_188_Num > 0 )
{
g_188_Num -= 1;
}
/*电量计数到0但未出现低电告警则电量显示1%.*/
if( (g_188_Num == 0) && !F_batlevel_protect )
{
g_188_Num = 1;
}
}
}
if( g_188_Num > 100 )
{
g_188_Num = 100;
}
}
/*非充电条件下出现电池低电报警则电量显示0%*/
if( F_batlevel_protect && !( CHIP_STA4 & 0x80 ) )
{
g_188_Num = 0;
}
}
#ifdef NTC_ENABLE
/*NTC保护*/
if( NTC_Pro_Flag )
{
if( !LED_188_Disp_Flg )
{
#if DISPLAY_6PIN_188
Set_NumLED_Down();
#endif
#if DISPLAY_5PIN_188
Set_AllLed_Down();
#endif
LED_188_Disp_Flg = 1;
}
else
{
Display_Show_Num(g_188_Num);
LED_188_Disp_Flg = 0;
}
return;
}
#endif
if( Init_LED_Disp_Flag )
{
if ( CHIP_STA4 & 0x80 ) //充电中
{
if ( Charger_Done ) // 充电完成LED绿灯常亮
{
if( LED_On_Timer < LED_ON_CNT )
{
LED_On_Timer++;
g_188_Num = 100;
Display_Show_Num(g_188_Num);
}
else
{
Set_AllLed_Down();
}
}
else
{
/*188数码管个位数闪烁显示。*/
if( !LED_188_Disp_Flg )
{
#if DISPLAY_6PIN_188
for(i=13;i<20;i++)
{
Display_Ram_Tab[i] = 0;
}
#endif
#if DISPLAY_5PIN_188
for(i=9;i<16;i++)
{
Display_Ram_Tab[i] = 0;
}
#endif
LED_188_Disp_Flg = 1;
}
else
{
if(g_188_Num >= 99) //未出现chg_done则电量卡在99各位数闪。
{
g_188_Num = 99;
}
Display_Show_Num(g_188_Num);
LED_188_Disp_Flg = 0;
}
}
CHG_LED_Disp_Flag = 1;
}
else
{
if ( Vol_GetInto_Box_Flag || Vor_GetInto_Box_Flag || CHG_LED_Disp_Flag ) //耳机入盒,显示灯效
{
if( ( Vor_Vout_Enable == OFF ) && ( Vol_Vout_Enable == OFF ) ) //盒子里没耳机则显示百分百比电量4S后灭掉
{
if( LED_On_Timer < LED_COVER_CNT )
{
LED_On_Timer++;
Display_Show_Num(g_188_Num);
}
else
{
LED_On_Timer = 0;
Vol_GetInto_Box_Flag = 0;
Vor_GetInto_Box_Flag = 0;
CHG_LED_Disp_Flag = 0;
}
}
else //盒子里有耳机,则显示电量
{
Display_Show_Num(g_188_Num);
}
}
else
{
Set_AllLed_Down();
}
}
#if DISPLAY_6PIN_188
/*放电:左右耳对应的图标跑马,从下往上,盒子电量常亮*/
if( Vor_Vout_Enable == ON && !Vor_GetOut_Box_Flag )
{
Display_Show_Vor(Disp_Vor_Lev);
Disp_Vor_Lev++;
if(Disp_Vor_Lev > 4)
{
Disp_Vor_Lev = 1;
}
/*1只耳机放电设置充放电时间*/
// BatLev_Update_Uint_DisCHG_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG1;
BatLev_Update_Uint_CHG_Tim = BATLEV_UPDATE_UINT_TIM_CHG1;
}
else
{
Display_Show_Vor(0);
}
if( Vol_Vout_Enable == ON && !Vol_GetOut_Box_Flag )
{
Display_Show_Vol(Disp_Vol_Lev);
Disp_Vol_Lev++;
if(Disp_Vol_Lev > 4)
{
Disp_Vol_Lev = 1;
}
/*1只耳机放电设置充放电时间*/
// BatLev_Update_Uint_DisCHG_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG1;
BatLev_Update_Uint_CHG_Tim = BATLEV_UPDATE_UINT_TIM_CHG1;
}
else
{
Display_Show_Vol(0);
}
if( ( Vol_Vout_Enable == ON && !Vol_GetOut_Box_Flag ) && ( Vor_Vout_Enable == ON && !Vor_GetOut_Box_Flag ) )
{
if( Disp_Vor_Lev != Disp_Vol_Lev )
{
Disp_Vol_Lev = 1;
Disp_Vor_Lev = 1;
}
/*2只耳机同时放电设置充放电时间*/
// BatLev_Update_Uint_DisCHG_Tim = BATLEV_UPDATE_UINT_TIM_DISCHG0;
BatLev_Update_Uint_CHG_Tim = BATLEV_UPDATE_UINT_TIM_CHG2;
}
#endif
}
}
#endif
/*****************************************************************************
* Function : UserAPP
* Description : 5ms调用周期
* Input : None
* Output : None
* Return : None
* Note : None
*****************************************************************************/
void UserAPP(void)
{
if(F_sys_tim_10ms)
{
F_sys_tim_10ms = 0;
#if VOX_ENABLE
/* 用于关Boost时耦合信号到VOX出现loadon信号复位在关boost后使用软件复位VOX30ms可解决。*/
if( (Vor_Vout_Enable == OFF) && (Vol_Vout_Enable == OFF) ) //无放电关Boost。
{
if( Vor_Vout_Close_Flag || Vol_Vout_Close_Flag )
{
#if DISCHARGE_ENABLE
BST_EN = 0; //Boost Disable
#endif
#ifdef _DEBUG_VOX
printf("Close Boost.\r\n");
#endif
if(Vox_Rst_Debounce < VOX_RST_CNT)
{
Vox_Rst_Debounce++;
SFRADDR = VOX_CON0;
SFRDATA |= 0x80; //使能VOX软件复位
VOX_CTL0 |= 0x0C; //VOX上拉使能复位
}
else
{
Vor_Vout_Close_Flag = 0;
Vol_Vout_Close_Flag = 0;
Vox_Rst_Debounce = 0;
SFRADDR = VOX_CON0;
SFRDATA &= ~0x80; //使能VOX硬件复位
VOX_CTL0 &= ~0x0C;
}
}
#if DISPLAY_6PIN_188
BatLev_Update_Uint_CHG_Tim = BATLEV_UPDATE_UINT_TIM_CHG0;
#endif
}
#endif
#ifdef LED_DISPLAY
LED_Drv();
#endif
}
if(F_sys_tim_100ms)
{
F_sys_tim_100ms = 0;
#if HALL_ENABLE
Hall_Handler(); //开关盖检测
#endif
#if DISCHARGE_ENABLE
DisCharge_Handler(); //放电boost功能
#endif
#if KEY_ENABLE
Key_Handler(); //按键检测
#endif
#if CHARGER_ENABLE
Charger_Handler(); //充电功能
#endif
#if ADC_ENABLE
Vbat_Adc = Vbat_Value(); //获取Bat电压
#endif
#if BAT_VALUE
check_bat_level();
#endif
#if VOX_ENABLE
Vol_Det_Machine();
Vor_Det_Machine();
#endif
}
if( F_sys_tim_1s )
{
F_sys_tim_1s = 0;
#if LED_188
LED_188Display_App(); //LED 灯效
#endif
#if SLEEP_ENABLE
/*1、唤醒后工作Ns后进入Sleep Mode,N需要大于100ms。
2、有VIN存在的情况下系不会进入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() )
{
/* Enter Sleep */
SFRADDR = WKUP_EN3; //vox loadon wake up enable
SFRDATA |= 0x3C;
#ifdef _DEBUG_MAIN
printf("Get Into Sleep.\r\n");
#endif
/* InSleep Handler */ //Disable All IRQ
#if TIMER1_ENABLE
ET1 = 0; //timer1 IRQ Disable
#endif
#if UART0_ENABLE
ES0 = 0; //UART0 IRQ Disable
#endif
EX2 = 0;
ET0 = 0; //timer0 IRQ Disable
SFRADDR = ADC_CTL0;
SFRDATA &= ~0x80; //ADC Disable.
#if LED_188
SFRADDR = P0_OE;
SFRDATA &= 0xC0;
#endif
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
#if TIMER1_ENABLE
ET1 = 1; //timer1 IRQ
#endif
Decnt_SleepDelay = ENTER_STANDBYMODE_CNT;
}
else
{
Decnt_SleepDelay = ENTER_STANDBYMODE_CNT;
}
#endif
}
}