C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 1 C51 COMPILER V9.01, COMPILATION OF MODULE MCUFLASH OBJECT MODULE PLACED IN .\output\McuFlash.obj COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\McuFlash.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Lo -ad.ORC) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\c -ode_classb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\McuFlash.lst) OBJECT(.\output\M -cuFlash.obj) line level source 1 /******************************************************************************** 2 Copyright (C), Sinowealth Electronic. Ltd. 3 Author: Sino 4 Version: V0.0 5 Date: 2020/04/26 6 History: 7 V2.0 2020/04/26 Preliminary 8 ********************************************************************************/ 9 #include "Main.h" 10 11 12 BOOL bMcuFlashWrWaitFlg; 13 BOOL bMcuFlashWrFlg; 14 BOOL bMcuFlashErr; 15 U8 xdata ucMcuFlashWrValid; 16 U8 xdata bMcuFlashWrWaitCnt; 17 18 /************************************************************************************************* 19 * 函数名: McuFlashWrOneByte 20 * 参 数: McuFlashAddr:起始地址;WrData:写入的注释 21 * 返回值: 无 22 * 描 述: 写1个字节 23 *************************************************************************************************/ 24 void McuFlashWrOneByte(U16 McuFlashAddr, U8 WrData) 25 { 26 1 IrqDis(); 27 1 McuFlashEn(); 28 1 29 1 XPAGE = McuFlashAddr>>8; 30 1 IB_OFFSET = McuFlashAddr % 256; 31 1 IB_DATA = WrData; 32 1 33 1 IB_CON1 = 0x6E; 34 1 IB_CON2 = 0x05; 35 1 IB_CON3 = 0x0A; 36 1 IB_CON4 = 0x09; 37 1 if(XPAGE == (McuFlashAddr>>8)) 38 1 { 39 2 IB_CON5 = 0x06; 40 2 _nop_(); 41 2 _nop_(); 42 2 _nop_(); 43 2 _nop_(); 44 2 _nop_(); 45 2 } 46 1 47 1 McuFlashDis(); 48 1 IrqEn(); 49 1 } 50 51 52 /************************************************************************************************* C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 2 53 * 函数名: McuFlashBlankCheck 54 * 参 数: McuFlashAddr:起始地址 55 * 返回值: 0:非全0,Erase失败;1:全0,Erase成功 56 * 描 述: 当Erase完1个Sector,需检查是否全为0 57 *************************************************************************************************/ 58 BOOL McuFlashBlankCheck(U16 McuFlashAddr) 59 { 60 1 BOOL Result = 1; 61 1 U16 i; 62 1 63 1 for(i=0; i>8; 117 2 IB_DATA = *(ptr+i); 118 2 IB_CON1 = 0x6E; 119 2 if(!EA) 120 2 { 121 3 IB_CON2 = 0x05; 122 3 if(FLASHCON) 123 3 { 124 4 IB_CON3 = 0x0A; 125 4 if(ucMcuFlashWrValid == 0x55) 126 4 { 127 5 IB_CON4 = 0x09; 128 5 if(XPAGE == ((McuFlashAddr+i)>>8)) 129 5 { 130 6 IB_CON5 = 0x06; 131 6 _nop_(); 132 6 _nop_(); 133 6 _nop_(); 134 6 _nop_(); 135 6 _nop_(); 136 6 Result = 1; 137 6 } 138 5 else 139 5 { 140 6 Result = 0; 141 6 break; 142 6 } 143 5 } 144 4 else 145 4 { 146 5 Result = 0; 147 5 break; 148 5 } 149 4 } 150 3 else 151 3 { 152 4 Result = 0; 153 4 break; 154 4 } 155 3 } 156 2 else 157 2 { 158 3 Result = 0; 159 3 break; 160 3 } 161 2 } 162 1 163 1 return Result; 164 1 } 165 166 167 /************************************************************************************************* 168 * 函数名: McuFlashWrite 169 * 参 数: McuFlashAddr:写入的地址,长度固定为1个Sector 170 * 返回值: 0:写入失败;1:写入成功 171 * 描 述: 写MCU Flash的1个Sector: 172 1.Erase Sector 173 2.检查当前Sector是否全为0 174 3.将XRAM数据写入 175 4.校验XRAM和MCU Flash区数据是否一致 176 *************************************************************************************************/ C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 4 177 BOOL McuFlashWrite(U16 McuFlashAddr, U16 XramAddr) 178 { 179 1 BOOL Result = 0; 180 1 181 1 McuWDTClear(); //清看门狗 182 1 IrqDis(); //关闭中断源 183 1 McuFlashEn(); 184 1 185 1 XPAGE = McuFlashAddr >> 8; 186 1 IB_CON1 = 0xE6; 187 1 if(!EA) 188 1 { 189 2 IB_CON2 = 0x05; 190 2 if(FLASHCON) 191 2 { 192 3 IB_CON3 = 0x0A; 193 3 if(ucMcuFlashWrValid == 0x55) 194 3 { 195 4 IB_CON4 = 0x09; 196 4 if(XPAGE == (McuFlashAddr >> 8)) 197 4 { 198 5 IB_CON5 = 0x06; 199 5 _nop_(); 200 5 _nop_(); 201 5 _nop_(); 202 5 _nop_(); 203 5 _nop_(); 204 5 205 5 if(McuFlashBlankCheck(McuFlashAddr)) //查空 206 5 { 207 6 if(McuFlashWrSector(McuFlashAddr, XramAddr)) //写入 208 6 { 209 7 if(McuFlashDataCheck(McuFlashAddr, XramAddr)) //校验 210 7 { 211 8 Result = 1; 212 8 } 213 7 } 214 6 } 215 5 } 216 4 } 217 3 } 218 2 } 219 1 220 1 IB_CON1 = 0; 221 1 IB_CON2 = 0; 222 1 IB_CON3 = 0; 223 1 IB_CON4 = 0; 224 1 IB_CON5 = 0; 225 1 226 1 McuFlashDis(); 227 1 XPAGE = 0x00; 228 1 IrqEn(); 229 1 230 1 return Result; 231 1 } 232 233 234 235 236 237 238 /************************************************************************************************* C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 5 239 * 函数名: McuFlashProcess 240 * 参 数: 无 241 * 返回值: 无 242 * 描 述: 写MCU Flash,同时更新备份1区和2区 243 *************************************************************************************************/ 244 void McuFlashProcess(void) 245 { 246 1 BOOL McuFlashBk1WrFailFlg = 0, McuFlashBk2WrFailFlg = 0; 247 1 U16 VoltageMin; 248 1 249 1 if(bMcuFlashWrFlg) 250 1 { 251 2 bMcuFlashWrFlg = 0; 252 2 253 2 ucMcuFlashWrValid = 0x55; //防误写检验标志 254 2 if(ucCellNum > 5) //6~10串应用,需要总电压超过10V 255 2 { 256 3 VoltageMin = 10000; 257 3 } 258 2 else //3~5串应用,需要总电压超过5V 259 2 { 260 3 VoltageMin = 5000; 261 3 } 262 2 263 2 if((Info.ulVoltage>=VoltageMin) && (E2uiCheckFlag==0x5AA5)) 264 2 { 265 3 if(!McuFlashWrite(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR)) //连续写两次,如果都错误则置位错误标志 266 3 { 267 4 if(!McuFlashWrite(MCUFLASH_BK1_ADDR, XRAM_MAP_ADDR)) 268 4 { 269 5 McuFlashBk1WrFailFlg = 1; 270 5 E2uiCheckFlag = 0xFFFF; 271 5 McuFlashWrOneByte(MCUFLASH_BK1_ADDR+510,0xFF); 272 5 McuFlashWrOneByte(MCUFLASH_BK1_ADDR+511,0xFF); 273 5 } 274 4 } 275 3 276 3 if(!McuFlashWrite(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR)) 277 3 { 278 4 if(!McuFlashWrite(MCUFLASH_BK2_ADDR, XRAM_MAP_ADDR)) 279 4 { 280 5 McuFlashBk2WrFailFlg = 1; 281 5 E2uiCheckFlag = 0xFFFF; 282 5 McuFlashWrOneByte(MCUFLASH_BK2_ADDR+510,0xFF); 283 5 McuFlashWrOneByte(MCUFLASH_BK2_ADDR+511,0xFF); 284 5 } 285 4 } 286 3 } 287 2 else 288 2 { 289 3 McuFlashBk1WrFailFlg = 1; 290 3 McuFlashBk2WrFailFlg = 1; 291 3 } 292 2 ucMcuFlashWrValid = 0x00; 293 2 294 2 if(McuFlashBk1WrFailFlg && McuFlashBk2WrFailFlg) //如果Flash两个区都操作错误,则置位Flash错误标志 295 2 { 296 3 bMcuFlashErr = 1; 297 3 } 298 2 } 299 1 } 300 C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 6 301 302 /************************************************************************************************* 303 * 函数名: McuFlashRead 304 * 参 数: SourceAddr:源地址;TargetAddr:目标地址;Length:数据长度 305 * 返回值: 0:数据正确;1:数据错误 306 * 描 述: 判断MCU Flash参数区的最后一个字节是否为0x5AA5,检查数据区是否被破坏 307 *************************************************************************************************/ 308 BOOL McuFlashRead(U16 SourceAddr, U8 xdata *TargetAddr, U16 Length) 309 { 310 1 U16 i; 311 1 BOOL Result = 1; 312 1 U8 xdata *data TargetAddr1 = TargetAddr; //*后面的data关键字的作用,是把指针TargetAddr1 -定义在data区中 313 1 314 1 IrqDis(); 315 1 McuFlashEn(); 316 1 McuWDTClear(); 317 1 for(i=0; i= MCU_FLASH_WATI_DELAY) 340 2 { 341 3 bMcuFlashWrWaitFlg = 0; 342 3 bMcuFlashWrWaitCnt = 0; 343 3 bMcuFlashWrFlg = 1; 344 3 } 345 2 } 346 1 } 347 348 349 /************************************************************************************************* 350 * 函数名: McuFlashCheckFlg 351 * 参 数: McuFlashAddr:MCU Flash区的地址 352 * 返回值: 0:数据正确;1:数据错误 353 * 描 述: 判断MCU Flash参数区的最后一个字节是否为0x5AA5,检查数据区是否被破坏 354 *************************************************************************************************/ 355 BOOL McuFlashCheckFlg(U16 McuFlashAddr) 356 { 357 1 BOOL Result = 0; 358 1 359 1 McuFlashEn(); 360 1 if(CWORD[McuFlashAddr/2] == 0x5AA5) 361 1 { C51 COMPILER V9.01 MCUFLASH 02/19/2025 10:42:27 PAGE 7 362 2 Result = 1; 363 2 } 364 1 McuFlashDis(); 365 1 366 1 return Result; 367 1 } 368 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 820 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = 2 18 PDATA SIZE = ---- ---- DATA SIZE = ---- 2 IDATA SIZE = ---- ---- BIT SIZE = 3 8 END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)