引导程序之api文件:api_power_control.c

/******************************************************************************
版权所有:  深圳市**科技有限公司 
文件名:    task_data_process.c
作者:      wangdy
创建日期:  2020/07/8
描述:      蓝牙模块协议解析及处理 
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
            ????    ????/??/??  ??????  参考样式       
******************************************************************************/

/************************************头文件************************************/

#include "yc_gpio.h"
#include "api_power_control.h"
#include "bsp_power_control.h"
#include "bsp_charge_control.h"
#include "api_led_watchdog.h"
#include <string.h>
#include "yc_7816.h"
#include "driver_adc.h"
#include "var_global.h"

/*************************************变量*************************************/

_POWER_KEY_STATE         Power_Key_State = {0};        //按键状态信息 

_CHARGE_CONTROL_STATE   Charge_Control_Flag =     //充电状态信息 
{
    .ChargeControl_Flag = true,
    .Charging_Flag = false,
    .ChargeFinish_Flag = false,
};

BATTERY_TEMP_STATE        Battery_Temp_State = BATTERY_TEMP_NORMAL;        //电池温度检测 

uint16_t                Power_Bat_Value = 0;          //电池电量  

/*************************************函数*************************************/

/*******************************************************************************
* 名称:        API_Power_Control_Init       
* 描述:        电源控制初始化 
* 输入参数:    无  
* 输出参数:    无   
* 其它:        无   
*******************************************************************************/
void API_Power_Control_Init(void)
{
    //特殊引脚功能使能 
    vcard_control(1);        //初始化智能卡  可当智能卡应用  
    enable_gpio_32();        //使能GPIO32 
    
    Power_Control_Init();        //电源控制   初始化
    Charge_Control_Init();        //充电控制   初始化 
    
    API_Bat_Charge_OnOff(true);        //使能电池充电  
    
    Power_Key_State.HighCheckCount = 0;
    Power_Key_State.CheckFinished = false;
    Power_Key_State.ProgramExecute = false;
    Power_Key_State.WorkMode = GOTO_NONE;
    Power_Key_State.PowerOffKeyRelease = false;
    Power_Key_State.PowerOffCheckStart = false;
    Power_Key_State.PowerOffCheckCount = 0;
    Power_Key_State.Power_On_Key_Release_Prepare_Flag = false;
}


/*******************************************************************************
* 名称:        API_Bat_Charge_OnOff    
* 描述:        电池充电功能开/关  
* 输入参数:    无  
* 输出参数:    无   
* 其它:        无   
*******************************************************************************/
void API_Bat_Charge_OnOff(bool state)
{
    
    if(state)
    {
        Charge_Control_Flag.ChargeControl_Flag = true;
        Matchine_Bat_Charge_On();
    }
    else 
    {
        Charge_Control_Flag.ChargeControl_Flag = false;
        Matchine_Bat_Charge_Off();
    }
    
}

/*******************************************************************************
* 名称:        Tape_UseUp_Check      
* 描述:        电池温度检测   
* 输入参数:    无  
* 输出参数:    无   
* 其它:        adc接收完成中断  调用 
*******************************************************************************/
void Battery_Voltage_Check(){
    
#if 0
    static uint32_t  sum_values = 0;   //求和  
    static uint32_t  sum_count = 0;   //计数   
#endif
    static uint16_t Battery_High_Temp_Counter = 0;         //电池高温次数计数
    static uint16_t Battery_Low_Temp_Counter=0;          //电池低温次数计数
    
#if BATTERY_TEMPER_CHECK_ENABLE_FLAG
    
    if(false == ChargingState_Get())    //不插USB时,要执行引导程序要不按下按键要么插上USB充电
    {
        Battery_Temp_State = BATTERY_TEMP_NORMAL;
        return ;
    }
    
    uint16_t  adc_value = ADC_Get_Value(ADC_BATTERY_NTC_TEMP);    //电池电量检测  
//    MyPrintf("adc_value_NTC=%d\n",adc_value);
    //当前是正常状态 
    if(Battery_Temp_State == BATTERY_TEMP_NORMAL)
    {
        //小于0度       
        //if(adc_value >= 1200)
        if(adc_value >= 500)
        {
//            MyPrintf("BATTERY_TEMP_OVER_LOW--\r\n"); 
            Battery_Low_Temp_Counter++;
            
        }
        //大于45度  
        else if(adc_value <= 120)     //150
        {
//            MyPrintf("BATTERY_TEMP_OVER_HIGH--000\r\n"); 
            Battery_High_Temp_Counter++;
        }
        else{
            Battery_Low_Temp_Counter = 0;
            Battery_High_Temp_Counter = 0;
            Battery_Temp_State = BATTERY_TEMP_NORMAL;
        }
    }
    //如果当前是高温状态 
    else if(Battery_Temp_State == BATTERY_TEMP_OVER_HIGH){
         if(adc_value >= 150){
             Battery_High_Temp_Counter = 0;
             Battery_Temp_State = BATTERY_TEMP_NORMAL;
         }
    }
    //如果是低温状态 
    else if(Battery_Temp_State == BATTERY_TEMP_OVER_LOW){
        if(adc_value <= 400){
            Battery_Low_Temp_Counter = 0;
            Battery_Temp_State = BATTERY_TEMP_NORMAL;
        }
    }
    if(200<=Battery_Low_Temp_Counter){
        Battery_Temp_State = BATTERY_TEMP_OVER_LOW;
    }
    if(200<=Battery_High_Temp_Counter){
        Battery_Temp_State = BATTERY_TEMP_OVER_HIGH;
    }
    #if 0
        sum_values += adc_value;
        sum_count++;
    
        if(sum_count >= 10){
            MyPrintf("off_v:%d_sta_%d\n",sum_values/sum_count,Battery_Temp_State);
            
            sum_count = 0;
            sum_values = 0;
        }
    #endif 
#else 
    Battery_Temp_State = BATTERY_TEMP_NORMAL;
#endif 
  //  MyPrintf("battery_temper:%d,state:%d\n",adc_value,Battery_Temp_State);
}

/*******************************************************************************
* 名称:        PowerControl_Process       
* 描述:        开关机检测 (判断是否进入DFU) 
* 输入参数:    
* 输出参数:    无   
* 其它:        
*******************************************************************************/
void PowerControl_Process(){
    
    Power_Voltage_Check();        //计算电池电压平均值  

#if BATTERY_TEMPER_CHECK_ENABLE_FLAG
    Battery_Voltage_Check();
#endif 
    
    //先判断是否插入USB  
    
    if(ChargingState_Get()){
//        MyPrintf("222222222222222\r\n");
        if(GlobalVar.API_Led_Control_Init_Finish != true)
                   API_Led_Control_Init();                            //灯控初始化
        //看是否在充电过程中 
        if(Charge_Control_Flag.ChargeControl_Flag){        //充电中 判断是否充满了  
            
            if((Battery_Temp_State == BATTERY_TEMP_OVER_LOW) || (Battery_Temp_State == BATTERY_TEMP_OVER_HIGH)){        //电池温度异常  则停止充电     
    //        MyPrintf("11111111\r\n");    
                Charge_Control_Flag.Charging_Flag = false;
                Charge_Control_Flag.ChargeFinish_Flag = false;
                API_Bat_Charge_OnOff(false);    //停止充电 
                MyPrintf("333333333333\r\n");
            }
            else {
    //            MyPrintf("READ_CHARGE_FINISH_STATE=%d\r\n",READ_CHARGE_FINISH_STATE);
                //电池满指示引脚,低电平有效
                if(RESET == READ_CHARGE_FINISH_STATE)  //低电平  表示还未充满  
                {
//                    MyPrintf("Charging_Flag1111111111111\r\n");
                    Charge_Control_Flag.ChargeFinish_Flag = false;
                    Charge_Control_Flag.Charging_Flag = true;
                    API_Bat_Charge_OnOff(true);        //启动充电 
                }
                else   //高电平 表示充满  则停止充电 
                {
                    MyPrintf("ChargeFinish_Flagcccc\r\n");
                    Charge_Control_Flag.ChargeFinish_Flag = true;
                    Charge_Control_Flag.Charging_Flag = false;
                    API_Bat_Charge_OnOff(false);    //停止充电 
                }        
            }
        }else{     //USB已经连接且不在充电中
            //如果在插入USB的前提下  电池温度正常  并且 实际电压小于 8V 
//            MyPrintf("33333333..\r\n");
//            if(Battery_Temp_State == BATTERY_TEMP_NORMAL) {
//        MyPrintf("Power_Bat_Value =%d\r\n",Power_Bat_Value);
                if(RESET == READ_CHARGE_FINISH_STATE)  //低电平  表示还未充满  
                {
  MyPrintf("44444444\r\n");
                    Charge_Control_Flag.ChargeFinish_Flag = false;
                    Charge_Control_Flag.Charging_Flag = true;
                    API_Bat_Charge_OnOff(true);        //启动充电 
                }
                else   //高电平 表示充满  则停止充电 
                {
    MyPrintf("5555555\r\n");                
                    Charge_Control_Flag.ChargeFinish_Flag = true;
                    Charge_Control_Flag.Charging_Flag = false;
                    API_Bat_Charge_OnOff(false);    //停止充电 
                }        
        }
    }else{   //未插USB 则停止充电 
        Charge_Control_Flag.Charging_Flag = false;
        Charge_Control_Flag.ChargeFinish_Flag = false;
        API_Bat_Charge_OnOff(false);    //停止充电 
    }

    
    //MyPrintf("voltage:%d,state:%d\n",Power_Bat_Value,Charge_Control_Flag.ChargeControl_Flag);    
}


/*******************************************************************************
* 名称:        Power_Voltage_Check  
* 描述:        各种电源电压检测  
* 输入参数:    无 
* 输出参数:    无   
* 其它:        
*******************************************************************************/
void Power_Voltage_Check(void)
{
    static uint32_t Sum_Power_Bat_Value = 0;
    static uint32_t CurrCnt = 0;
    uint32_t  temp_value = 0;                
    
    //求和  并且计数 + 1
    CurrCnt++;
    Sum_Power_Bat_Value += ADC_Get_Value(ADC_BAT_POWER);
    
    
    //求平均值     
    if(CurrCnt >= ADC_AVERAGE_COUNT)
    {
        //以下几个电压值,均为分压电阻分压 (499+75)/75 电压,则公式为: adc*574/75
        //如果保留3位小数点,则公式为: adc*574/75*1000
        
        //电池电压 
        temp_value = Sum_Power_Bat_Value/ADC_AVERAGE_COUNT;
        temp_value = temp_value*574/75;
        Power_Bat_Value = temp_value; //电压值,保留3位小数点 
        CurrCnt = 0;
        Sum_Power_Bat_Value = 0;
    }
}


/*******************************************************************************
* 名称:        IRQ_Power_Control_Check       
* 描述:        开关机检测 (判断是否进入DFU) 
* 输入参数:    
* 输出参数:    无   
* 其它:        长按2S钟开机  
            连续按3次进入dfu模式  
*******************************************************************************/
void IRQ_Power_Control_Check(void)
{  
    
    //状态判断  
    if(false == Power_Key_State.CheckFinished){
//        MyPrintf("POWER_KEY_PRESS_STATE= %d \n",POWER_KEY_PRESS_STATE);
        //高电平表示按键按下去了  则开始做计时处理  超过2S开机 
        if(SET == POWER_KEY_PRESS_STATE)
        {    
//            MyPrintf("111111111\n");
            //长按超过一定时间   则开机跳转至APP 
            Power_Key_State.LowCheckCount=0;            
            Power_Key_State.HighCheckCount++;                        
            if(Power_Key_State.HighCheckCount >= TIMEOUT_POWER_ON)     //按下超过2S
            {
//                MyPrintf("2222222\n");
        //        if(GlobalVar.API_Led_Control_Init_Finish != true)
                   API_Led_Control_Init();                            //灯控初始化
                Power_Key_State.HighCheckCount = 0;
                Power_Key_State.Key_Pressed_Flag = false;
                
                Matchine_3V3_Power_On();                    //打开3V3电源 
                
                Power_Key_State.WorkMode = GOTO_APP;
                Power_Key_State.CheckFinished = true;        //进入正常工作模式     
                Power_Key_State.ProgramExecute = true;
                
                MyPrintf("READY POWER ON\n");    

                return;
            }
            //超过消抖动时间 
            else if(Power_Key_State.HighCheckCount >= TIMEOUT_KEY_DITHER){
                Power_Key_State.Key_Pressed_Flag = true;    //按键按下去了  用于后面计次用 
            }
        }
        else
        {            
            Power_Key_State.HighCheckCount = 0;
            Power_Key_State.LowCheckCount++;                //按键计数信息 
//            MyPrintf("READY_release\n");
            if(Power_Key_State.LowCheckCount >= TIMEOUT_KEY_DITHER){
                //消抖动  
                Power_Key_State.LowCheckCount = 0;
                
                //按键按下去了  然后松手 才算按下去1次 
                if(Power_Key_State.Key_Pressed_Flag){
                    Power_Key_State.Key_Pressed_Flag = false;    //标记置为无效 
                    
                    //按下  并松开3次  才进入IAP模式 
                    Power_Key_State.Key_Pressed_Times++;
                    if(Power_Key_State.Key_Pressed_Times >= 3){
                             //检测USB插上才进入升级模式
                            if(ChargingState_Get()){
                    //        if(GlobalVar.API_Led_Control_Init_Finish != true)
                                API_Led_Control_Init();                            //灯控初始化
                            Power_Key_State.Key_Pressed_Times = 0;                        
                            Matchine_3V3_Power_On();                    //打开3V3电源                         
                            MyPrintf("READY IAP\n");                    
                            Power_Key_State.WorkMode = GOTO_DFU;
                            Power_Key_State.CheckFinished = true;        //进入dfu模式 
                            Power_Key_State.ProgramExecute = true;                        
                            Led_State = LED_INDFU;                        //LED以dfu方式闪 
                        }
                    }
                }
            }
            return;
        } 
    }
    //关机条件判断(允许关机)
//    if(Power_Key_State.PowerOffCheckStart){
//        //检测IO状态  高电平表示按键按下  低电平未按下 
//        if(SET == POWER_KEY_PRESS_STATE)
//        {
//            if(Power_Key_State.PowerOffKeyRelease)
//            {
//                //长按2S关机 
//                Power_Key_State.LowCheckCount=0;    
//                Power_Key_State.HighCheckCount++;
//                if(Power_Key_State.HighCheckCount >= TIMEOUT_KEY_DITHER){
//                    Power_Key_State.HighCheckCount = 0;
//                    Power_Key_State.Power_On_Key_Release_Prepare_Flag = true;
//                    
//                    Power_Key_State.PowerOffKeyRelease = false;        //松开标记置为无效  
//                    
//                    //如果检测到松开按键后  再按一下 就关机了 
//                    Matchine_3V3_Power_Off();                        //3V3电源默认关掉 
//                    
//                    Led_State = LED_IDLE;                        //LED以dfu方式闪 
//                    
//                    MyPrintf("POERT OFF\n");    
//                    
//                }
//            }
//        }
//        else        //先检测有无松开  松开后   再按按键才关机 (防止长按导致开机关机反复) 
//        {
//            Power_Key_State.PowerOffKeyRelease = true;        //松按键 

//            if(Power_Key_State.Power_On_Key_Release_Prepare_Flag)
//            {
//                Power_Key_State.Power_On_Key_Release_Prepare_Flag = false;
//            }                
//        }
//    }        
}
 

以下为:api_power_control.h

/******************************************************************************
版权所有:  深圳**科技有限公司  
文件名:    api_power_control.h
作者:      wangdy  
创建日期:  2020/7/9
描述:      电源控制  
其它:      
修改历史:  //修改历史记录列表,每条修改记录应包含修改日期、修改者及修改内容简述
            序号    修改时间    修改人  修改内容
            ????    ????/??/??  ??????  参考样式       
******************************************************************************/

/*********************************防止多次编译*********************************/

#ifndef _API_POWER_CONTROL
#define _API_POWER_CONTROL

/************************************头文件************************************/
#include <stdint.h>
#include <stdbool.h>

/************************************宏定义************************************/

#define      ADC_AVERAGE_COUNT        100     

//正常开机 
#define     TIMEOUT_POWER_ON                    2000        //按键保持按该段时间  则正常开机  

//IAP超时没进入  则掉3V3电源 
#define     TIMEOUT_IAP                            10000        //超过这么长时间 还没进入IAP 则关机 

//消抖动  
#define        TIMES_GOTO_DFU                        3            //短按3次  则进入iap模式  
#define     TIMEOUT_KEY_DITHER                    20            //20ms消抖动 

//电池温度检测 
#define     BATTERY_TEMPER_CHECK_ENABLE_FLAG    1              //允许

//电池温度检测 
typedef enum{
    BATTERY_TEMP_NORMAL = 0,        //电池温度正常 
    BATTERY_TEMP_OVER_HIGH = 1,    //电池温度过高 
    BATTERY_TEMP_OVER_LOW = 2,    //电池温度过低 
}BATTERY_TEMP_STATE;


/************************************结构体************************************/

//工作模式 
typedef enum
{
    GOTO_NONE,
    GOTO_APP = 1,                        //进入APP
    GOTO_DFU,                            //进入DFU
}_WORK_MODE;

//充电状态信息 
typedef struct
{
    bool    ChargeControl_Flag;                //充电控制  
    bool    Charging_Flag;                    //正在充电状态 
    bool    ChargeFinish_Flag;                //充电完成状态  
}_CHARGE_CONTROL_STATE;

//开关信息 
typedef struct
{
    volatile bool        CheckFinished;            //按键检查完成  
    volatile bool        ProgramExecute;            //程序执行标记 
    volatile bool        PowerOffCheckStart;        //关机启动状态  
    volatile bool        PowerOffKeyRelease;        //按键松开标记 
    volatile bool        Power_On_Key_Release_Prepare_Flag;  //按键准备松开标记 
    volatile uint32_t    PowerOffCheckCount;        //关机计数 
    volatile uint32_t    HighCheckCount;            //高电平计数
    volatile uint32_t    LowCheckCount;            //低电平计数
    volatile uint32_t   Key_Pressed_Times;        //按键计数(用于进入iap模式)
    volatile bool        Key_Pressed_Flag;        //按键按下的标记信息 
    volatile uint32_t   IapReadyStartCount;        //准备进去iap的计数信息 
    volatile _WORK_MODE WorkMode;                //要进入的工作模式  
}_POWER_KEY_STATE;

/**********************************可导出变量**********************************/

extern _POWER_KEY_STATE         Power_Key_State;        //按键状态信息 
extern _CHARGE_CONTROL_STATE    Charge_Control_Flag;    //充电状态信息 
extern BATTERY_TEMP_STATE        Battery_Temp_State;        //电池温度检测 
extern  uint16_t                Power_Bat_Value;          //电池电量  

/***********************************函数实现***********************************/
void API_Power_Control_Init(void);                        //电源初始化信息 

void API_Bat_Charge_OnOff(bool state);                    //使能充电功能 

static void Power_Voltage_Check(void);                            //电池电量  

void PowerControl_Process();                            //充电流程 
void IRQ_Power_Control_Check(void);                        //开关机信息检测 

#endif

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值