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