BMS STM32 V4.0.0.0

This commit is contained in:
2026-08-25 17:30:40 +08:00
commit 3ae7bcb054
313 changed files with 115734 additions and 0 deletions
+253
View File
@@ -0,0 +1,253 @@
/**
******************************************************************************
* @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();
}