408 lines
19 KiB
Plaintext
408 lines
19 KiB
Plaintext
C51 COMPILER V9.01 MCUFLASH 02/22/2025 15:36:22 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/22/2025 15:36:22 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<MCUFLASH_SECTOR_SIZE; i++)
|
||
64 1 {
|
||
65 2 if(CBYTE[McuFlashAddr+i] != 0x00)
|
||
66 2 {
|
||
67 3 Result = 0;
|
||
68 3 break;
|
||
69 3 }
|
||
70 2 }
|
||
71 1
|
||
72 1 return Result;
|
||
73 1 }
|
||
74
|
||
75
|
||
76 /*************************************************************************************************
|
||
77 * 函数名: McuFlashDataCheck
|
||
78 * 参 数: McuFlashAddr:起始地址
|
||
79 * 返回值: 0:校验错误;1:校验正确
|
||
80 * 描 述: 校验被写的Sector数据是否和XRAM区一致
|
||
81 *************************************************************************************************/
|
||
82 BOOL McuFlashDataCheck(U16 McuFlashAddr, U16 XramAddr)
|
||
83 {
|
||
84 1 BOOL Result = 1;
|
||
85 1 U8 xdata *ptr = (U8 xdata *)XramAddr; //强制将变量的值作为地址赋值给指针变量
|
||
86 1 U16 i;
|
||
87 1
|
||
88 1 for(i=0; i<MCUFLASH_SECTOR_SIZE; i++)
|
||
89 1 {
|
||
90 2 if(CBYTE[McuFlashAddr+i] != *(ptr+i))
|
||
91 2 {
|
||
92 3 Result = 0;
|
||
93 3 break;
|
||
94 3 }
|
||
95 2 }
|
||
96 1
|
||
97 1 return Result;
|
||
98 1 }
|
||
99
|
||
100
|
||
101 /*************************************************************************************************
|
||
102 * 函数名: McuFlashWrSector
|
||
103 * 参 数: 无
|
||
104 * 返回值: 无
|
||
105 * 描 述: 写1个Sector的数据
|
||
106 *************************************************************************************************/
|
||
107 BOOL McuFlashWrSector(U16 McuFlashAddr, U16 XramAddr)
|
||
108 {
|
||
109 1 BOOL Result = 0;
|
||
110 1 U16 i;
|
||
111 1 U8 xdata *ptr = (U8 xdata *)XramAddr; //强制将变量的值作为地址赋值给指针变量
|
||
112 1
|
||
113 1 for(i=0; i<MCUFLASH_SECTOR_SIZE; i++)
|
||
114 1 {
|
||
C51 COMPILER V9.01 MCUFLASH 02/22/2025 15:36:22 PAGE 3
|
||
|
||
115 2 IB_OFFSET = McuFlashAddr+i;
|
||
116 2 XPAGE = (McuFlashAddr+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/22/2025 15:36:22 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/22/2025 15:36:22 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/22/2025 15:36:22 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<Length; i++)
|
||
318 1 {
|
||
319 2 *TargetAddr1 = CBYTE[SourceAddr+i];
|
||
320 2 TargetAddr1++;
|
||
321 2 }
|
||
322 1 McuFlashDis();
|
||
323 1 IrqEn();
|
||
324 1
|
||
325 1 return Result;
|
||
326 1 }
|
||
327
|
||
328
|
||
329 /*************************************************************************************************
|
||
330 * 函数名: McuFlashWrWaitCheck
|
||
331 * 参 数: 无
|
||
332 * 返回值: 无
|
||
333 * 描 述: 当需要写MCU Flash参数时,部分模块需要延时2S执行写操作(上位机修改参数),部分模块立即写
|
||
334 *************************************************************************************************/
|
||
335 void McuFlashWrWaitCheck(void)
|
||
336 {
|
||
337 1 if(bMcuFlashWrWaitFlg)
|
||
338 1 {
|
||
339 2 if(++bMcuFlashWrWaitCnt >= 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/22/2025 15:36:22 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)
|