/******************************************************************************
版权所有: 深圳市**科技有限公司
文件名: 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