/** ****************************************************************************** * @file tim.c * @author Jerry * @version V2.1 * @date 19-April-2022 * @brief tim program body. ****************************************************************************** * @attention * * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "global.h" #include "string.h" #include "rtc.h" #include "soe.h" _soe_obj soe; uint8_t rdd[64]; /******************************************************************************* Function: Description: 发生SOE事件时,将事件写入EEPROM Input: Output: Others: *******************************************************************************/ void SOE_BkData(uint8_t type) { uint8_t wrBuf[64]; uint8_t extBuf[6]; uint8_t adrh,adrl; uint16_t ee_vol,ee_fcc,ee_rcc; int16_t ee_cur; uint8_t afe_mode; uint16_t ext_addr; uint8_t i; uint16_t ee_cellVol[20]; //用于转换存储单芯电压 ee_vol = (uint16_t)(bmsMem.packVoltage/10); //电压保存 单位0.01V ee_cur = (int16_t) (bmsMem.packCurrent/100); //电流保存 单位0.1A ee_fcc = (uint16_t)(fcc/3600/100); //满充容量 单位0.1Ah //5.16增加满充容量自适应逻辑后修改 ee_rcc = (uint16_t)(bmsMem.rcc/3600/100); //剩余容量 单位0.1Ah /*记录序号,便于上位机排序和查看*/ wrBuf[0] = (soe.index >> 24) & 0xff ; wrBuf[1] = (soe.index >> 16) & 0xff ; wrBuf[2] = (soe.index >> 8) & 0xff ; wrBuf[3] = (soe.index >> 0) & 0xff ; /*记录时间*/ wrBuf[4] = calendar.w_year ; wrBuf[5] = calendar.w_month ; wrBuf[6] = calendar.w_date ; wrBuf[7] = calendar.hour ; wrBuf[8] = calendar.min ; wrBuf[9] = calendar.sec ; /*记录BMS参数*/ wrBuf[10] = bmsMem.bStatus1 & 0xff; wrBuf[11] = bmsMem.bStatus2 & 0xff; wrBuf[12] = bmsMem.bStatus3 & 0xff; wrBuf[13] = bmsMem.temperaStatus & 0xff; wrBuf[14] = bmsMem.balanceStatus & 0xff; //wrBuf[15] = bmsMem.packStatus & 0xff; wrBuf[15] = ((bmsMem.bStatus1>>4) & 0xf0) | ((bmsMem.temperaStatus>>8) & 0x0f); //占用原packStatus位置,保存新增保护 wrBuf[16] = (ee_vol >> 8) & 0xff; wrBuf[17] = (ee_vol >> 0) & 0xff; wrBuf[18] = (ee_cur >> 8) & 0xff; wrBuf[19] = (ee_cur >> 0) & 0xff; wrBuf[20] = (ee_fcc >> 8) & 0xff; wrBuf[21] = (ee_fcc >> 0) & 0xff; wrBuf[22] = (ee_rcc >> 8) & 0xff; wrBuf[23] = (ee_rcc >> 0) & 0xff; wrBuf[24] = (bmsMem.cycleCount >> 8) & 0xff; wrBuf[25] = (bmsMem.cycleCount >> 0) & 0xff; wrBuf[26] = bmsMem.soh & 0xff; //afe_T1~T3 wrBuf[27] = (bmsMem.afe_T1>>8) & 0x0f; wrBuf[28] = (bmsMem.afe_T1>>0) & 0xff; wrBuf[29] = (bmsMem.afe_T2>>4) & 0xff; wrBuf[30] = ((bmsMem.afe_T2<<4) & 0xf0) | ((bmsMem.afe_T3>>8) & 0x0f); wrBuf[31] = (bmsMem.afe_T3>>0) & 0xff; //mcu_T1~T4 wrBuf[32] = (bmsMem.mcu_T1>>4) & 0xff; wrBuf[33] = ((bmsMem.mcu_T1<<4) & 0xf0) | ((bmsMem.mcu_T2>>8) & 0x0f); wrBuf[34] = (bmsMem.mcu_T2>>0) & 0xff; wrBuf[35] = (bmsMem.mcu_T3>>4) & 0xff; wrBuf[36] = ((bmsMem.mcu_T3<<4) & 0xf0) | ((bmsMem.mcu_T4>>8) & 0x0f); wrBuf[37] = (bmsMem.mcu_T4>>0) & 0xff; afe_mode = (paraMem.sc_mode >> 8) & 0xFF; for(i=0;i<20;i++) { if(i < 16) { if(bmsMem.vCell[i] > 5119) { ee_cellVol[i] = 0; } else if(bmsMem.vCell[i] > 4095) { ee_cellVol[i] = 4095; } else { ee_cellVol[i] = bmsMem.vCell[i]; } } else { if(afe_mode == 1) { if(bmsMem.vCell2[i-16] > 5119) { ee_cellVol[i] = 0; } else if(bmsMem.vCell2[i-16] > 4095) { ee_cellVol[i] = 4095; } else { ee_cellVol[i] = bmsMem.vCell2[i-16]; } } else { ee_cellVol[i] = 0; } } } wrBuf[38] = (ee_cellVol[0]>>4) & 0xff; wrBuf[39] = ((ee_cellVol[0]<<4) & 0xf0) | ((ee_cellVol[1]>>8) & 0x0f); wrBuf[40] = (ee_cellVol[1]>>0) & 0xff; wrBuf[41] = (ee_cellVol[2]>>4) & 0xff; wrBuf[42] = ((ee_cellVol[2]<<4) & 0xf0) | ((ee_cellVol[3]>>8) & 0x0f); wrBuf[43] = (ee_cellVol[3]>>0) & 0xff; wrBuf[44] = (ee_cellVol[4]>>4) & 0xff; wrBuf[45] = ((ee_cellVol[4]<<4) & 0xf0) | ((ee_cellVol[5]>>8) & 0x0f); wrBuf[46] = (ee_cellVol[5]>>0) & 0xff; wrBuf[47] = (ee_cellVol[6]>>4) & 0xff; wrBuf[48] = ((ee_cellVol[6]<<4) & 0xf0) | ((ee_cellVol[7]>>8) & 0x0f); wrBuf[49] = (ee_cellVol[7]>>0) & 0xff; wrBuf[50] = (ee_cellVol[8]>>4) & 0xff; wrBuf[51] = ((ee_cellVol[8]<<4) & 0xf0) | ((ee_cellVol[9]>>8) & 0x0f); wrBuf[52] = (ee_cellVol[9]>>0) & 0xff; wrBuf[53] = (ee_cellVol[10]>>4) & 0xff; wrBuf[54] = ((ee_cellVol[10]<<4) & 0xf0) | ((ee_cellVol[11]>>8) & 0x0f); wrBuf[55] = (ee_cellVol[11]>>0) & 0xff; wrBuf[56] = (ee_cellVol[12]>>4) & 0xff; wrBuf[57] = ((ee_cellVol[12]<<4) & 0xf0) | ((ee_cellVol[13]>>8) & 0x0f); wrBuf[58] = (ee_cellVol[13]>>0) & 0xff; wrBuf[59] = (ee_cellVol[14]>>4) & 0xff; wrBuf[60] = ((ee_cellVol[14]<<4) & 0xf0) | ((ee_cellVol[15]>>8) & 0x0f); wrBuf[61] = (ee_cellVol[15]>>0) & 0xff; wrBuf[62] = type; if(afe_mode == 1) //SH36735XX, 20 cells { wrBuf[63] = 0xA6; //new format flag //pack cell17~20 into extBuf[0~5] extBuf[0] = (ee_cellVol[16]>>4) & 0xff; extBuf[1] = ((ee_cellVol[16]<<4) & 0xf0) | ((ee_cellVol[17]>>8) & 0x0f); extBuf[2] = (ee_cellVol[17]>>0) & 0xff; extBuf[3] = (ee_cellVol[18]>>4) & 0xff; extBuf[4] = ((ee_cellVol[18]<<4) & 0xf0) | ((ee_cellVol[19]>>8) & 0x0f); extBuf[5] = (ee_cellVol[19]>>0) & 0xff; } else { wrBuf[63] = 0xA5; //old format flag } /*写入前检查是否合法*/ //当前地址=0或0XFFFF或不为64倍数,初始化地址和记录序号 if((soe.pc < 0x1000) || (soe.pc > 0x2940) || (soe.pc == 0xffff) || (soe.pc%64 !=0)) { soe.pc = RECORD_START_ADDR; soe.index = 0; soe.num = 0; } /*记录写入EEPROM*/ adrh = (soe.pc>>8) & 0xff; adrl = soe.pc & 0xff; EEPROM_WrMulByte(EE_SOE,wrBuf); delay_ms(10); EEPROM_RdMulByte(EE_SOE,rdd); //write extend cell17~20 for SH36735XX if(afe_mode == 1) { ext_addr = 0x2900 + (soe.pc - 0x1000) * 6 / 64; adrh = (ext_addr>>8) & 0xff; adrl = ext_addr & 0xff; EEPROM_WrMulByte(EE_SOE_EXT,extBuf); delay_ms(10); EEPROM_RdMulByte(EE_SOE_EXT,rdd); } /*清除记录写入标记*/ soe.bkType = 0; /*暂定400条记录*/ soe.index+=1; soe.pc +=0x40; soe.num +=1; // if(soe.pc == 0x7400) //0x1000-0x7400共400条 // if(soe.pc == 0x1C80) //0x1000-0x1C80共50条 if(soe.pc == 0x2900) //0x1000-0x2900共100条 { soe.pc = RECORD_START_ADDR; } if(soe.num >= 100) { soe.num = 100; } wrBuf[0] = (soe.index >> 24) & 0xff ; wrBuf[1] = (soe.index >> 16) & 0xff ; wrBuf[2] = (soe.index >> 8) & 0xff ; wrBuf[3] = (soe.index >> 0) & 0xff ; wrBuf[4] = (soe.pc >>8)&0XFF ; wrBuf[5] = soe.pc & 0xff ; wrBuf[6] = (soe.num >>8)&0XFF ; wrBuf[7] = soe.num & 0xff ; EEPROM_WrMulByte(EE_SOE_INF,wrBuf); delay_ms(10); EEPROM_RdMulByte(EE_SOE_INF,rdd); scr_RdRecord_Flg = 1; //SCR_DispProcotol(); }