Files
jiacun-20s-200A/BSP/flash.c
T
2026-08-25 17:30:40 +08:00

1223 lines
20 KiB
C

/**
******************************************************************************
* @file flash.c
* @author Jerry Cai
* @version
* @date
* @brief
******************************************************************************
* @attention
*
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "global.h"
#include "string.h"
//将数组绝对定位到MCU内部FLASH地址
//考虑兼容32K FLASH,
uint8_t const dataFlashA[2048] __attribute__((at(FLASH_DATA_A_BASE))) =
{
/***** AFE设置参数 26Byte *****/
0x01, //5~16串存于此,其他串数(4/17~20串)存于paraMem.ee_sconf4
0x1E, //过放只关放电MOS,防止过放无法充电
0x6F, //
0x20, //过压保护电压 0x320*5=4000mV
0x63, //
0x0C, //过压保护释放 0x30C*5=3900mV
0x64, //欠压保护电压 0x64*20=2000mV
0x69, //欠压保护释放 0x69*20=2100mV
0xAF, //平衡开启电压 0xAF*20=3500mV
0x78, //预充开启电压 0x78*20=2400mV
0x4B, //低压禁止充电 0x4B*20=1500mV
0xFA, //异常高压保护 0xFA*20=5000mV
0x18, //放电过流1保护 30mV 4S
0x1b, //放电过流2保护 40mV 2S
0x10, //短路保护 40mV 0uS
0x1A, //充电过流保护 30mV 1S
0x50, //
0x64, //充电过温保护 100
0x46, //充电过温释放 70
0xEC, //充电低温保护 -20
0xF6, //充电低温释放 -10
0x64, //放电过温保护 100
0x46, //放电过温释放 70
0xEC, //放电低温保护 -20
0xF6, //放电低温释放 -10
0xF4, //校验值(每次修改注意更新)
/***** MCU保护参数 26Byte *****/
//20230221
0x3C, //充电高温保护 60
0x37, //充电高温释放 55
0x00, //充电低温保护 0
0x05, //充电低温释放 5
0x41, //放电高温保护 65
0x3C, //放电高温释放 60
0xEC, //放电低温保护 -20
0xF1, //放电低温释放 -15
0xCD, //充电过流保护 205A
0xCD, //放电过流保护 205A
0x01, //充电过流时间 1S
0x01, //放电过流时间 1S
0x1E, //过流恢复时间 30S
0xB0, //校验值(每次修改注意更新)
//20230614
0xC8, //限流启动电流 200A
0x05, //限流延时时间 5S
0x3C, //限流释放时间 0x003c=60S
0x00, //
//20230705
0x16, //逆变器充电电压限制 0x0316*0.1=79.0V
0x03, //
0x9A, //逆变器放电电压限制 0x019A*0.1=41.0V = 总体欠压告警41.0V
0x01, //
0x78, //逆变器充电电流限制 0x0578*0.1=140A = 充电过流告警150-10
0x05, //
0xDC, //逆变器放电电流限制 0x05DC*0.1=150A = 放电过流告警160-10
0x05, //
/***** Para过程参数 128Byte *****/
//20240419
0x32, //主动均衡开启压差 50mV
0x1E, //主动均衡释放压差 30mV
0x58, //主动均衡释放延时 0x0258=600S
0x02, //
//20240821
0x5A, //累积容量转换比 90%
0x46, //最低健康系数 70%
0xC8, //100%对应的最大循环次数 0x00C8=200次
0x00, //
0x70, //最大循环次数 6000次
0x17, //
//20241024
0x3C, //浪涌短路消失且预充完成后,对下一次短路的等待时间 60s
0x05, //浪涌短路的最大持续出现次数 5次
//20260402
0x01, //开机预充延时 1s
0x02, //开放电MOS前预充延时 2s
0x0A, //预充时的真短路判断电压 10V
0x04, //浪涌短路时的真短路判断电压 4V
//20250313
0xE0, //启用请求标志的标志 bit7充电允许 bit6放电允许 bit5强充
0x00, //
0x64, //禁充开启SOC 100%
0x63, //禁充释放SOC 99%
0x0A, //禁放开启SOC 10%
0x14, //禁放释放SOC 20%
0x0A, //强充开启SOC 10%
0x14, //强充释放SOC 20%
//20250402
0x0F, //满充方式使能 单芯过压√ 总体过压√ 逆变器限压+2A小电流√ 满充电压+截止电流√
0x32, //截止电流 0x32=5.0A
0x20, //满充电压 0x0320=80.0V
0x03, //
0x00, //rsvd0[0]
0x00, //rsvd0[1]
0x00, //rsvd0[2]
0x00, //rsvd0[3]
//20240513
0xA0, //休眠时间(bit0~14) 0x05A0=1440min=24h
0x05, //休眠启用(bit15) 0
//20240924
0x00, //地址手动控制不启用(bit0) 0
0x00, //
//20241023
0x00, //充放启用控制
0x00, //bit0关放电MOS 0 bit1关充电MOS 0 bit2关预充 0
0xD0, //满充容量校准时间(bit0~14) 0x02D0=720min=12h
0x82, //充电校准满充容量不启用(bit15) 1
//20250402
0x01, //休眠2时间(bit0~14) 0x0001=1min
0x00, //休眠2启用(bit15) 0
0x60, //休眠2电压(bit0~15) 0x960=2400mV
0x09, //
//20250410
0xF0, //定时校准soc时间(bit0-14) 0x00F0=240min=4h
0x80, //开路电压定时校准soc禁用(bit15) 1
0x0A, //±10%范围外
0x0A, //±10℃范围内
//20260309
0x00, //bit0~4 温度只测不保护禁用
0x00, //
0x00, //rsvd1[0]
0x00, //rsvd1[1]
0x00, //rsvd1[2]
0x00, //rsvd1[3]
0x00, //rsvd1[4]
0x00, //rsvd1[5]
0x00, //rsvd1[6]
0x00, //rsvd1[7]
0x00, //rsvd1[8]
0x00, //rsvd1[9]
0x00, //rsvd1[10]
0x00, //rsvd1[11]
0x00, //rsvd1[12]
0x00, //rsvd1[13]
//20250404
0x20, //总体过压保护电压 0x0320*0.1=80.0V
0x03, //
0x0C, //总体过压保护释放电压 0x030C*0.1=78.0V
0x03, //
0x90, //总体欠压保护电压 0x0190*0.1=40.0V
0x01, //
0xA4, //总体欠压保护释放电压 0x01A4*0.1=42.0V
0x01, //
0x01, //总体过压保护延时 1s
0x01, //总体欠压保护延时 1s
0x1C, //放电过流2 540A
0x02, //
0x04, //放电过流2延时 4*10ms
0x00, //
0x46, //环境充电高温 70
0x41, //环境充电高温释放 65
0xEC, //环境充电低温 -20
0xF1, //环境充电低温释放 -15
0x46, //环境放电高温 70
0x41, //环境放电高温释放 65
0xEC, //环境放电低温 -20
0xF1, //环境放电低温释放 -15
0x60, //单体过压释放SOC
0x60, //总体过压释放SOC
0x10, //并机总数 16台
0x00, //rsvd2[0]
0x00, //rsvd2[1]
0x00, //rsvd2[2]
0x00, //rsvd2[3]
//20260722
0x14, //SH36735XX系列SCONF4寄存器串数配置(20串)
//20260716
0x12, //短路计算倍数 18
0x01, //1=SH36735xx系列 0=SH367309
//20250408
0x6E, //单体过压告警 0x0F6E=3950mV
0x0F, //
0x02, //单体欠压告警 0x0802=2050mV
0x08, //
0x16, //总体过压告警 0x0316=79.0V
0x03, //
0x9A, //总体欠压告警 0x019A=41.0V
0x01, //
0x96, //充电过流告警 0x96=150A
0xA0, //放电过流1告警 0xA0=160A
0x37, //电芯充电高温告警 55
0x05, //电芯充电低温告警 5
0x3C, //电芯放电高温告警 60
0xF1, //电芯放电低温告警 -15
0x41, //环境充电高温告警 65
0xF1, //环境充电低温告警 -15
0x41, //环境放电高温告警 65
0xF1, //环境放电低温告警 -15
0x5F, //MOS充电高温告警 95
0xF1, //MOS充电低温告警 -15
0x5F, //MOS放电高温告警 95
0xF1, //MOS放电低温告警 -15
0x00, //rsvd3[0]
0x00, //rsvd3[1]
0x00, //rsvd3[2]
0x00, //rsvd3[3]
0x00, //rsvd3[4]
0x00, //rsvd3[5]
0x00, //rsvd3[6]
0x00, //rsvd3[7]
0x00, //rsvd3[8]
0x00, //rsvd3[9]
0x49, //OCV放电曲线 2889
0x0B, //
0x86, //3206
0x0C, //
0x91, //3217
0x0C, //
0xB1, //3249
0x0C, //
0xC7, //3271
0x0C, //
0xDA, //3290
0x0C, //
0xDB, //3291
0x0C, //
0xDE, //3294
0x0C, //
0x02, //3330
0x0D, //
0x03, //3331
0x0D, //
0x03, //3331
0x0D, //
0x04, //3332
0x0D, //
0x05, //3333
0x0D, //
0x07, //3335
0x0D, //
0x47, //3399
0x0D, //
0x00, //rsvd4[0]
0x00, //rsvd4[1]
0xF1, //OCV充电曲线 3057
0x0B, //
0x95, //3221
0x0C, //
0x9D, //3229
0x0C, //
0xBE, //3262
0x0C, //
0xD7, //3287
0x0C, //
0xE7, //3303
0x0C, //
0xE8, //3304
0x0C, //
0xEA, //3306
0x0C, //
0x0B, //3339
0x0D, //
0x0C, //3340
0x0D, //
0x0C, //3340
0x0D, //
0x0B, //3339
0x0D, //
0x0D, //3341
0x0D, //
0x0C, //3340
0x0D, //
0x47, //3399
0x0D, //
0x00, //rsvd5[0]
0x00, //rsvd5[1]
#if LTE_Conn
/***** 4G平台设备参数 共42+2+42+42+23+1+8=160Byte *****/
//域名 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//端口 2Byte
0x00, //
0x00, //
//用户名 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//密码 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//ClientID 23Byte 和SN号同步,所以不填
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //CRC校验码(153个0x00的校验码是0)
//(预留目前不用)
0x00, //
0x00, //
0x00, //
0x00, //
0x00, //
0x00, //
#endif
};
uint8_t const dataFlashB[2048] __attribute__((at(FLASH_DATA_B_BASE))) =
{
/***** AFE设置参数 26Byte *****/
0x01, //5~16串存于此,其他串数(4/17~20串)存于paraMem.ee_sconf4
0x1E, //过放只关放电MOS,防止过放无法充电
0x6F, //
0x20, //过压保护电压 0x320*5=4000mV
0x63, //
0x0C, //过压保护释放 0x30C*5=3900mV
0x64, //欠压保护电压 0x64*20=2000mV
0x69, //欠压保护释放 0x69*20=2100mV
0xAF, //平衡开启电压 0xAF*20=3500mV
0x78, //预充开启电压 0x78*20=2400mV
0x4B, //低压禁止充电 0x4B*20=1500mV
0xFA, //异常高压保护 0xFA*20=5000mV
0x18, //放电过流1保护 30mV 4S
0x1b, //放电过流2保护 40mV 2S
0x10, //短路保护 40mV 0uS
0x1A, //充电过流保护 30mV 1S
0x50, //
0x64, //充电过温保护 100
0x46, //充电过温释放 70
0xEC, //充电低温保护 -20
0xF6, //充电低温释放 -10
0x64, //放电过温保护 100
0x46, //放电过温释放 70
0xEC, //放电低温保护 -20
0xF6, //放电低温释放 -10
0xF4, //校验值(每次修改注意更新)
/***** MCU保护参数 26Byte *****/
//20230221
0x3C, //充电高温保护 60
0x37, //充电高温释放 55
0x00, //充电低温保护 0
0x05, //充电低温释放 5
0x41, //放电高温保护 65
0x3C, //放电高温释放 60
0xEC, //放电低温保护 -20
0xF1, //放电低温释放 -15
0xCD, //充电过流保护 205A
0xCD, //放电过流保护 205A
0x01, //充电过流时间 1S
0x01, //放电过流时间 1S
0x1E, //过流恢复时间 30S
0xB0, //校验值(每次修改注意更新)
//20230614
0xC8, //限流启动电流 200A
0x05, //限流延时时间 5S
0x3C, //限流释放时间 0x003c=60S
0x00, //
//20230705
0x16, //逆变器充电电压限制 0x0316*0.1=79.0V
0x03, //
0x9A, //逆变器放电电压限制 0x019A*0.1=41.0V = 总体欠压告警41.0V
0x01, //
0x78, //逆变器充电电流限制 0x0578*0.1=140A = 充电过流告警150-10
0x05, //
0xDC, //逆变器放电电流限制 0x05DC*0.1=150A = 放电过流告警160-10
0x05, //
/***** Para过程参数 128Byte *****/
//20240419
0x32, //主动均衡开启压差 50mV
0x1E, //主动均衡释放压差 30mV
0x58, //主动均衡释放延时 0x0258=600S
0x02, //
//20240821
0x5A, //累积容量转换比 90%
0x46, //最低健康系数 70%
0xC8, //100%对应的最大循环次数 0x00C8=200次
0x00, //
0x70, //最大循环次数 6000次
0x17, //
//20241024
0x3C, //浪涌短路消失且预充完成后,对下一次短路的等待时间 60s
0x05, //浪涌短路的最大持续出现次数 5次
//20260402
0x01, //开机预充延时 1s
0x02, //开放电MOS前预充延时 2s
0x0A, //预充时的真短路判断电压 10V
0x04, //浪涌短路时的真短路判断电压 4V
//20250313
0xE0, //启用请求标志的标志 bit7充电允许 bit6放电允许 bit5强充
0x00, //
0x64, //禁充开启SOC 100%
0x63, //禁充释放SOC 99%
0x0A, //禁放开启SOC 10%
0x14, //禁放释放SOC 20%
0x0A, //强充开启SOC 10%
0x14, //强充释放SOC 20%
//20250402
0x0F, //满充方式使能 单芯过压√ 总体过压√ 逆变器限压+2A小电流√ 满充电压+截止电流√
0x32, //截止电流 0x32=5.0A
0x20, //满充电压 0x0320=80.0V
0x03, //
0x00, //rsvd0[0]
0x00, //rsvd0[1]
0x00, //rsvd0[2]
0x00, //rsvd0[3]
//20240513
0xA0, //休眠时间(bit0~14) 0x05A0=1440min=24h
0x05, //休眠启用(bit15) 0
//20240924
0x00, //地址手动控制不启用(bit0) 0
0x00, //
//20241023
0x00, //充放启用控制
0x00, //bit0关放电MOS 0 bit1关充电MOS 0 bit2关预充 0
0xD0, //满充容量校准时间(bit0~14) 0x02D0=720min=12h
0x82, //充电校准满充容量不启用(bit15) 1
//20250402
0x01, //休眠2时间(bit0~14) 0x0001=1min
0x00, //休眠2启用(bit15) 0
0x60, //休眠2电压(bit0~15) 0x960=2400mV
0x09, //
//20250410
0xF0, //定时校准soc时间(bit0-14) 0x00F0=240min=4h
0x80, //开路电压定时校准soc禁用(bit15) 1
0x0A, //±10%范围外
0x0A, //±10℃范围内
//20260309
0x00, //bit0~4 温度只测不保护禁用
0x00, //
0x00, //rsvd1[0]
0x00, //rsvd1[1]
0x00, //rsvd1[2]
0x00, //rsvd1[3]
0x00, //rsvd1[4]
0x00, //rsvd1[5]
0x00, //rsvd1[6]
0x00, //rsvd1[7]
0x00, //rsvd1[8]
0x00, //rsvd1[9]
0x00, //rsvd1[10]
0x00, //rsvd1[11]
0x00, //rsvd1[12]
0x00, //rsvd1[13]
//20250404
0x20, //总体过压保护电压 0x0320*0.1=80.0V
0x03, //
0x0C, //总体过压保护释放电压 0x030C*0.1=78.0V
0x03, //
0x90, //总体欠压保护电压 0x0190*0.1=40.0V
0x01, //
0xA4, //总体欠压保护释放电压 0x01A4*0.1=42.0V
0x01, //
0x01, //总体过压保护延时 1s
0x01, //总体欠压保护延时 1s
0x1C, //放电过流2 540A
0x02, //
0x04, //放电过流2延时 4*10ms
0x00, //
0x46, //环境充电高温 70
0x41, //环境充电高温释放 65
0xEC, //环境充电低温 -20
0xF1, //环境充电低温释放 -15
0x46, //环境放电高温 70
0x41, //环境放电高温释放 65
0xEC, //环境放电低温 -20
0xF1, //环境放电低温释放 -15
0x60, //单体过压释放SOC
0x60, //总体过压释放SOC
0x10, //并机总数 16台
0x00, //rsvd2[0]
0x00, //rsvd2[1]
0x00, //rsvd2[2]
0x00, //rsvd2[3]
//20260722
0x14, //SH36735XX系列SCONF4寄存器串数配置(20串)
//20260716
0x12, //短路计算倍数 18
0x01, //1=SH36735xx系列 0=SH367309
//20250408
0x6E, //单体过压告警 0x0F6E=3950mV
0x0F, //
0x02, //单体欠压告警 0x0802=2050mV
0x08, //
0x16, //总体过压告警 0x0316=79.0V
0x03, //
0x9A, //总体欠压告警 0x019A=41.0V
0x01, //
0x96, //充电过流告警 0x96=150A
0xA0, //放电过流1告警 0xA0=160A
0x37, //电芯充电高温告警 55
0x05, //电芯充电低温告警 5
0x3C, //电芯放电高温告警 60
0xF1, //电芯放电低温告警 -15
0x41, //环境充电高温告警 65
0xF1, //环境充电低温告警 -15
0x41, //环境放电高温告警 65
0xF1, //环境放电低温告警 -15
0x5F, //MOS充电高温告警 95
0xF1, //MOS充电低温告警 -15
0x5F, //MOS放电高温告警 95
0xF1, //MOS放电低温告警 -15
0x00, //rsvd3[0]
0x00, //rsvd3[1]
0x00, //rsvd3[2]
0x00, //rsvd3[3]
0x00, //rsvd3[4]
0x00, //rsvd3[5]
0x00, //rsvd3[6]
0x00, //rsvd3[7]
0x00, //rsvd3[8]
0x00, //rsvd3[9]
0x49, //OCV放电曲线 2889
0x0B, //
0x86, //3206
0x0C, //
0x91, //3217
0x0C, //
0xB1, //3249
0x0C, //
0xC7, //3271
0x0C, //
0xDA, //3290
0x0C, //
0xDB, //3291
0x0C, //
0xDE, //3294
0x0C, //
0x02, //3330
0x0D, //
0x03, //3331
0x0D, //
0x03, //3331
0x0D, //
0x04, //3332
0x0D, //
0x05, //3333
0x0D, //
0x07, //3335
0x0D, //
0x47, //3399
0x0D, //
0x00, //rsvd4[0]
0x00, //rsvd4[1]
0xF1, //OCV充电曲线 3057
0x0B, //
0x95, //3221
0x0C, //
0x9D, //3229
0x0C, //
0xBE, //3262
0x0C, //
0xD7, //3287
0x0C, //
0xE7, //3303
0x0C, //
0xE8, //3304
0x0C, //
0xEA, //3306
0x0C, //
0x0B, //3339
0x0D, //
0x0C, //3340
0x0D, //
0x0C, //3340
0x0D, //
0x0B, //3339
0x0D, //
0x0D, //3341
0x0D, //
0x0C, //3340
0x0D, //
0x47, //3399
0x0D, //
0x00, //rsvd5[0]
0x00, //rsvd5[1]
#if LTE_Conn
/***** 4G平台设备参数 共42+2+42+42+23+1+8=160Byte *****/
//域名 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//端口 2Byte
0x00, //
0x00, //
//用户名 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//密码 42Byte
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //25
0x00, //26
0x00, //27
0x00, //28
0x00, //29
0x00, //30
0x00, //31
0x00, //32
0x00, //33
0x00, //34
0x00, //35
0x00, //36
0x00, //37
0x00, //38
0x00, //39
0x00, //40
0x00, //41
//ClientID 23Byte 和SN号同步,所以不填
0x00, //0
0x00, //1
0x00, //2
0x00, //3
0x00, //4
0x00, //5
0x00, //6
0x00, //7
0x00, //8
0x00, //9
0x00, //10
0x00, //11
0x00, //12
0x00, //13
0x00, //14
0x00, //15
0x00, //16
0x00, //17
0x00, //18
0x00, //19
0x00, //20
0x00, //21
0x00, //22
0x00, //23
0x00, //24
0x00, //CRC校验码(153个0x00的校验码是0)
//(预留目前不用)
0x00, //
0x00, //
0x00, //
0x00, //
0x00, //
0x00, //
#endif
};
//FLASH指定地址连续写入num HALFWORD数据
void FLASH_WrData(uint32_t addr, uint16_t *data, uint16_t num)
{
uint16_t sign;
uint16_t i;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP |FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
sign = FLASH_ErasePage(addr);
if(sign == FLASH_COMPLETE)
{
for(i=0; i<num; i++)
{
FLASH_ProgramHalfWord(addr+i*2, data[i]);
}
}
FLASH_Lock();
}
//按字节读取num长度数据
void FLASH_RdDataByte(uint32_t addr, uint8_t *data, uint16_t num)
{
uint16_t i;
for(i=0; i<num; i++)
{
data[i] = *(uint8_t *)(addr+i);
}
}
//读bmsMem和paraMem和4G凭证更新到FLASH对应位置
uint8_t MEMORY_UpdateFlash(uint32_t addr)
{
uint8_t temp[AFE_MCU_LEN+PARAMEM_LEN+HOSTMEM_LEN];
memcpy(temp, &bmsMem.ee_sconf1, AFE_MCU_LEN);
memcpy(&temp[AFE_MCU_LEN], &paraMem.act_bal_startV, PARAMEM_LEN);
FLASH_WrData(addr, (uint16_t *)temp, AFE_MCU_LEN/2+PARAMEM_LEN/2); //按半字写入FLASH
FLASH_RdDataByte(addr, temp, AFE_MCU_LEN+PARAMEM_LEN); //读并校验
if(temp[25] == CRC8_Cal(&temp[0],25) && temp[39] == CRC8_Cal(&temp[26], 13))
{
#if LTE_Conn
memcpy(&temp[AFE_MCU_LEN+PARAMEM_LEN], &VersionMem.host[0], HOSTMEM_LEN);
FLASH_WrData(addr, (uint16_t *)temp, AFE_MCU_LEN/2+PARAMEM_LEN/2+HOSTMEM_LEN/2); //按半字写入FLASH
FLASH_RdDataByte(addr, temp, AFE_MCU_LEN+PARAMEM_LEN+HOSTMEM_LEN); //读并校验
if(temp[AFE_MCU_LEN+PARAMEM_LEN+153] != CRC8_Cal(&temp[AFE_MCU_LEN+PARAMEM_LEN], 153))
{
return 1;
}
else
#endif
{
return 0;
}
}
else
{
return 1;
}
}
//读FLASH更新到bmsMem和paraMem对应位置
uint8_t FLASH_ReadCheck(uint32_t addr)
{
uint8_t temp[AFE_MCU_LEN+PARAMEM_LEN+HOSTMEM_LEN];
FLASH_RdDataByte(addr, temp, AFE_MCU_LEN+PARAMEM_LEN+HOSTMEM_LEN); //读并校验
if(temp[25] == CRC8_Cal(&temp[0],25) && temp[39] == CRC8_Cal(&temp[26], 13))
{
memcpy(&bmsMem.ee_sconf1, temp, AFE_MCU_LEN);
memcpy(&paraMem.act_bal_startV, &temp[AFE_MCU_LEN], PARAMEM_LEN);
#if LTE_Conn
FLASH_RdDataByte(addr, temp, AFE_MCU_LEN+PARAMEM_LEN+HOSTMEM_LEN); //读并校验
if(temp[AFE_MCU_LEN+PARAMEM_LEN+153] == CRC8_Cal(&temp[AFE_MCU_LEN+PARAMEM_LEN], 153))
{
memcpy(&VersionMem.host[0], &temp[AFE_MCU_LEN+PARAMEM_LEN], HOSTMEM_LEN);
}
#endif
{
return 0;
}
}
else
{
return 1;
}
}
//update flash to bmsMem
//校验Flash A/B的内容是否合规,A不合规就再校验B,都不合规则报错返回1
uint8_t FLASH_UpdateMemory(void)
{
if(FLASH_ReadCheck(FLASH_DATA_A_BASE) == 0) //read flash a success
{
return 0;
}
else //read flash a failed
{
if(FLASH_ReadCheck(FLASH_DATA_B_BASE) == 0) //read flash b success
{
return 0;
}
else
{
return 1;
}
}
}
//FLASH更新bmsMem,再更新AFE EEPROM
void uf_FLASH_Init(void)
{
if(FLASH_UpdateMemory() == 0)
{
staPack.bits.flashUpdate = 0;
if(MEMORY_UpdateAFE() == 0) //更新AFE EEPROM内容
{
staPack.bits.eepromUpdate = 0;
}
else
{
staPack.bits.eepromUpdate = 1;
}
}
else
{
staPack.bits.flashUpdate = 1;
}
bmsMem.packStatus = staPack.byte;
}
/**
* @brief 按WORD读取len长度数据
* @param addr: 读数据开始地址
* @param *data: 读数据存放地址
* @param len: 读数据长度
* @retval 无
*
*/
void FLASH_RdWord(uint32_t addr, uint32_t *data, uint16_t len)
{
uint16_t i;
for(i=0; i<len; i++)
{
data[i] = *(uint32_t *)(addr+i*4);
}
}