ZDBMS/output/McuFlash.lst

408 lines
19 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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非全0Erase失败1全0Erase成功
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/19/2025 10:42:27 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/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<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 * 参 数: McuFlashAddrMCU 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)