//////////////////////////////////////////////////////////////////////////////// /// @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. /// ///

© COPYRIGHT MINDMOTION

//////////////////////////////////////////////////////////////////////////////// // 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; } } /// @} /// @} /// @}