TJ-WW03-H03/APP_smoke_N_V1.3/HARDWARE/LED/led.c

815 lines
14 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 led.c
/// @author AE TEAM
/// @brief THIS FILE PROVIDES ALL THE SYSTEM FUNCTIONS.
////////////////////////////////////////////////////////////////////////////////
/// @attention
///
/// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
/// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
/// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
/// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
/// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
/// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
///
/// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
////////////////////////////////////////////////////////////////////////////////
// Define to prevent recursive inclusion
#define _LED_C_
// Files includes
#include "led.h"
#include "key.h"
#include "public.h"
//#include "uart.h"
#include "sim_eeprom.h"
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MM32_Example_Layer
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup LED
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup LED_Exported_Constants
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @brief initialize LED GPIO pin
/// @note if use jtag/swd interface GPIO PIN as LED, need to be careful,
/// can not debug or program.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = Bat_T_Pin; // 初始化电池温度检测
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = LED1_Pin | LED2_Pin | LED3_Pin | Beep_Pin | TemP_Pin | LDO_EN_Pin | CHANGE_Pin ; // LED灯初始化
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//禁用SWD功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_2); //AF to not pararell
GPIO_InitStruct.GPIO_Pin = TEST_Pin; // LED灯初始化
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
LED1_OFF();
LED2_OFF();
LED3_OFF();
TEST_OFF();
}
//void LED
void V_led(void)
{
/***g_work.m_conditon.m_conditon.V_conditon:
0: 白灯
1蓝灯
2红灯
3红灯闪
电量达到100%时 ,白灯长亮.
电量为70%-99%之间时,白灯常亮
电量为30%-69%之间时,蓝灯常亮
电量为1-29%之间时,红灯闪烁
***/
GPIO_InitTypeDef GPIO_InitStruct;
switch(g_work.m_conditon.m_conditon.V_conditon )
{
case 0 : // 4.0 以上满电
g_work.v_condtion = 2;
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
BLUE_OFF;
GREEN_OFF;
}
}
else
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
break;
case 1 : //
g_work.v_condtion = 1;
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
BLUE_ON;
}
else
{
BLUE_OFF;;
}
}
else
{
BLUE_ON;
}
RED_OFF;
GREEN_OFF;
break;
case 2 :
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
}
else
{
RED_ON;
}
BLUE_OFF;
GREEN_OFF;
break;
case 3:
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
}
else
{
if(g_work.m_time._Sleep_time / 205%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 205%2 == 1 )
{
RED_ON;
}
}
BLUE_OFF;
GREEN_OFF;
break;
}
}
/*******
充电时电压电量判断函数V_proess()
g_work.v_condtion
电池容量1% 3.50v
电池容量25% 3.70v
电池容量55% 3.90v
电池容量75% 4.13v
电池容量100% 4.35v
0电池电压小于3.5-3.74v 红灯闪烁
1电池电压大于3.75V-4.09V 蓝灯闪烁
2电池电压大于4.10-4.34V 白灯闪烁
3电池电压大于4.35V 充电芯片输出低电平 白灯闪烁
4电池电压大于4.35V 充电芯片输出高电平电平 白灯常亮
*************/
void V_proess()
{
// printf("\ng_work.V_real_Value:%d\n",g_work.V_real_Value);
GPIO_InitTypeDef GPIO_InitStruct;
// g_work.V_real_Value = g_work.v_value * 100 /510.0f * 710.0f+ 44;
// g_work.v_value = g_work.v_value + 18; // 相差 25
// printf("\ng_work.v_condtion:%d\n",g_work.v_condtion);
//printf("\ng_work.V_real_Value:%d\n",g_work.V_real_Value);
switch (g_work.v_condtion)
{
case 0:
if( g_work.V_real_Value >= 374 ) // 电压小于 3.55V 3.45 V 246 277
{
g_work.v_condtion = 1;
}
else
{
if ( g_work.V_real_Value < 370 )
{
if( g_work.m_conditon.m_conditon.V_conditon != 2 )
{
g_work.m_conditon.m_conditon.V_conditon = 2;
Write_condtion();
}
}
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_OFF;
}
else
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
}
}
break;
case 1:
if ( g_work.V_real_Value >= 409) // 电压小于3.900 288 4.09 :294
{
g_work.v_condtion = 2;
}
else
{
if( V_5_V == 1 )
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
BLUE_OFF;
}
else
{
BLUE_ON;
}
RED_OFF;
GREEN_OFF;
if( g_work.m_conditon.m_conditon.V_conditon != 1 )
{
g_work.m_conditon.m_conditon.V_conditon = 1;
Write_condtion();
}
}
}
break;
case 2:
if( g_work.V_real_Value >= 434 )
{
g_work.v_condtion = 3;
}
else
{
if( V_5_V == 1 )
{
if(STANDBY == 1)
{
// RED_ON;
// BLUE_ON;
// GREEN_ON;
if ( g_work.m_time._Standby_time > 4500 )
{
g_work.v_condtion = 4;
}
}
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
}
}
break;
case 3:
if( V_5_V == 1 )
{
if(STANDBY == 1)
{
// RED_ON;
// BLUE_ON;
// GREEN_ON;
if ( g_work.m_time._Standby_time > 4500 )
{
g_work.v_condtion = 4;
}
}
// else
// {
if( g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
// }
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
}
break;
case 4 :
if( V_5_V == 1 )
{
if( g_work.m_conditon.m_conditon.V_conditon != 0 )
{
g_work.m_conditon.m_conditon.V_conditon = 0;
Write_condtion();
}
if( g_work.m_time._full_stop_led_time < 30000 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
if( g_work.m_work_flag.chargeflag == NOCHARGE )
{
g_work.v_condtion = 3;
}
}
break;
default:
break;
}
//Write_condtion();
}
/********************
烟具报警灯处理函数err_led()
g_work.err_fault
NO_WARING: 无报警 灯不控制
LOW_T_ERR: // 低温报警 红蓝交替1次
PRO_T_ERR: // 保温报警 红蓝交替2次
HIG_T_ERR: // 高温报警 红蓝交替3次
OPEN_ERR: // 开路报警 红灯闪 3
SHORT_ERR: // 短路报警 红灯闪 2
BATT_HIG_ERR: // 电池高温报警 红蓝交替4次
NO_HOT_ERR: // 不加热报警 4 红灯闪
********************/
unsigned char err_led()
{
if( g_work.power == 1 && g_work.m_work_flag.led_err_flag == 0)
{
switch( g_work.err_fault )
{
case NO_WARING:
return 0;
break;
case LOW_T_ERR: // 低温报警 红蓝交替1次
if(g_work.m_time._Sleep_time / 400%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 400%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 400%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 400%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case PRO_T_ERR: // 保温报警 红蓝交替2次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case HIG_T_ERR: // 高温报警 红蓝交替3次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case OPEN_ERR: // 开路报警 红灯闪 3
if(g_work.m_time._Sleep_time / 300%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 300%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
case SHORT_ERR: // 短路报警 红灯闪 2
if(g_work.m_time._Sleep_time / 400%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 400%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
case BATT_HIG_ERR: // 高温报警 红蓝交替4次
if(g_work.m_time._Sleep_time / 200%4 == 0 )
{
RED_OFF;
BLUE_OFF;
}
else if( g_work.m_time._Sleep_time / 200%4 == 1 )
{
RED_ON;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 2 )
{
RED_OFF;
BLUE_OFF;
}
else if ( g_work.m_time._Sleep_time / 200%4 == 3 )
{
BLUE_ON;
RED_OFF;
}
GREEN_OFF;
return 1;
break;
case NO_HOT_ERR: // 不加热报警 4 红灯闪
if(g_work.m_time._Sleep_time / 200%2 == 0 )
{
RED_OFF;
}
else if( g_work.m_time._Sleep_time / 200%2 == 1 )
{
RED_ON;
}
GREEN_OFF;
BLUE_OFF;
return 1;
break;
}
}
}
/***************************
在各个状态下led灯处理函数led_flash()
***************************/
void led_flash(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
WWDG_SetCounter(0x7e);
if( err_led() == 1 )
{
return;
}
// if( g_work.err_fault == 1)
// {
// if( g_work.power == 1 )
// {
// if(g_work.m_time._Sleep_time / 200%2 == 0 )
// {
//
// RED_OFF;
// }
// else if( g_work.m_time._Sleep_time / 200%2 == 1 )
// {
// RED_ON;
// }
// }
//
//
// GREEN_OFF;
// BLUE_OFF;
// return;
// }
// else if( g_work.err_fault == 2)
// {
// if( g_work.power == 1 )
// {
// if(g_work.m_time._Sleep_time / 300%4 == 0 )
// {
//
// RED_ON;
// BLUE_OFF;
// }
// else if( g_work.m_time._Sleep_time / 300%4 == 1 )
// {
// RED_OFF;
// BLUE_OFF;
// }
// else if ( g_work.m_time._Sleep_time / 300%4 == 2 )
// {
// BLUE_ON;
// RED_OFF;
// }
// else if ( g_work.m_time._Sleep_time / 300%4 == 3 )
// {
// BLUE_OFF;
// RED_OFF;
// }
// }
//
//
// GREEN_OFF;
//
// return;
// }
if( g_work.power == 1 )
switch(g_work.work_conditon)
{
case STANDY:
if( V_5_V == 0 ) // 不充电
{
g_work._get_v_from_down = 1; //不记录电池电压
if( g_work.m_time._full_stop_led_time < 30000 && g_work.m_time._Sleep_time < 2000) // 满电亮灯 不让 再次显示
{
if( g_work.m_conditon.m_conditon.lock == 0 )
{
V_led(); // 上电显示
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
}
}
else
{
if( g_work.m_time._Charge_start_time < 30000 )// 充电前30 S 只是显示当前电量
{
V_led();
}
else // 30S 之后开始 充电判断显示
{
g_work._get_v_from_down = 1; //开始读取电压
V_proess(); // 充电的时候显示
}
}
break;
case ORDER_HOT: // 在预加热阶段 白灯闪烁
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
break;
default:
if( g_work.work_conditon == FINISH ) // 结束阶段 白灯闪烁
{
if(g_work.m_time._Sleep_time / 500%2 == 0 )
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
else
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
}
else if ( g_work.work_conditon == TEST ) // 测试阶段 灯灭
{
RED_OFF;
GREEN_OFF;
BLUE_OFF;
}
else // 其它阶段 白灯常亮
{
RED_ON;
BLUE_ON;
GREEN_ON;
}
break;
}
}
/// @}
/// @}
/// @}