ZDBMS/output/Flash.lst

243 lines
11 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 FLASH 12/22/2023 12:15:06 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE FLASH
OBJECT MODULE PLACED IN .\output\Flash.obj
COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE code_bootloader\Flash.c OPTIMIZE(8,SPEED) BROWSE INCDIR(.\header_bootloa
-der) DEBUG OBJECTEXTEND PRINT(.\output\Flash.lst) OBJECT(.\output\Flash.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 "MCURegister.h"
10 #include "C51_TYPE.H"
11 #include "Flash.h"
12 #include <intrins.h>
13 #include <ABSACC.H>
14
15 U8 ucMcuFlashWrValid;
16
17
18 /*************************************************************************************************
19 * 函数名: McuFlashEraseSector
20 * 参 数: McuFlashAddr起始地址McuType擦除CODE区或者EEPROM
21 * 返回值: 无
22 * 描 述: 擦除Sector
23 *************************************************************************************************/
24 void McuFlashEraseSector(U32 xdata McuFlashAddr, U8 xdata McuType)
25 {
26 1 FLASHCON = McuType;
27 1 XPAGE = McuFlashAddr>>8;
28 1
29 1 IB_CON1 = 0xE6;
30 1 if(!EA) //防止误写
31 1 {
32 2 IB_CON2 = 0x05;
33 2 if(FLASHCON == McuType) //防止误写
34 2 {
35 3 IB_CON3 = 0x0A;
36 3 if(ucMcuFlashWrValid == 0x55) //防止误写
37 3 {
38 4 IB_CON4 = 0x09;
39 4 if(XPAGE == (McuFlashAddr>>8)) //防止误写
40 4 {
41 5 IB_CON5 = 0x06;
42 5 _nop_();
43 5 _nop_();
44 5 _nop_();
45 5 _nop_();
46 5 }
47 4 }
48 3 }
49 2 }
50 1
51 1 FLASHCON = MCU_TYPE_CODE;
52 1 }
53
54
C51 COMPILER V9.01 FLASH 12/22/2023 12:15:06 PAGE 2
55 /*************************************************************************************************
56 * 函数名: McuFlashBlankCheck
57 * 参 数: McuFlashAddr起始地址
58 * 返回值: 0非全0Erase失败1全0Erase成功
59 * 描 述: 当Erase完1个Sector需检查是否全为0
60 *************************************************************************************************/
61 BOOL McuFlashBlankCheck(U32 xdata McuFlashAddr, U8 xdata McuType)
62 {
63 1 BOOL Result = 1;
64 1 U16 i;
65 1
66 1 FLASHCON = McuType;
67 1 for(i=0; i<MCU_CODE_SECTOR_SIZE; i++)
68 1 {
69 2 if(CBYTE[McuFlashAddr+i] != 0x00)
70 2 {
71 3 Result = 0;
72 3 break;
73 3 }
74 2 }
75 1 FLASHCON = MCU_TYPE_CODE;
76 1
77 1 return Result;
78 1 }
79
80
81 /*************************************************************************************************
82 * 函数名: McuFlashWrOneByte
83 * 参 数: McuFlashAddr起始地址WrData写入的注释
84 * 返回值: 无
85 * 描 述: 写1个字节
86 *************************************************************************************************/
87 void McuFlashWrOneByte(U32 xdata McuFlashAddr, U8 xdata WrData, U8 xdata McuType)
88 {
89 1 FLASHCON = McuType;
90 1 XPAGE = McuFlashAddr>>8;
91 1 IB_OFFSET = McuFlashAddr % 256;
92 1
93 1 IB_DATA = WrData;
94 1 IB_CON1 = 0x6E;
95 1 if(!EA) //防止误写
96 1 {
97 2 IB_CON2 = 0x05;
98 2 if(FLASHCON == McuType) //防止误写
99 2 {
100 3 IB_CON3 = 0x0A;
101 3 if(ucMcuFlashWrValid == 0x55) //防止误写
102 3 {
103 4 IB_CON4 = 0x09;
104 4 if(XPAGE == (McuFlashAddr>>8)) //防止误写
105 4 {
106 5 IB_CON5 = 0x06;
107 5 _nop_();
108 5 _nop_();
109 5 _nop_();
110 5 _nop_();
111 5 _nop_();
112 5 }
113 4 }
114 3 }
115 2 }
116 1
C51 COMPILER V9.01 FLASH 12/22/2023 12:15:06 PAGE 3
117 1 FLASHCON = MCU_TYPE_CODE;
118 1 }
119
120
121 /*************************************************************************************************
122 * 函数名: McuFlashRdOneByte
123 * 参 数: McuFlashAddr读取CODE区的地址
124 * 返回值: 返回当前Code字节
125 * 描 述: 读1个字节
126 *************************************************************************************************/
127 U8 McuFlashRdOneByte(U32 xdata McuFlashAddr, U8 xdata McuType)
128 {
129 1 U8 GetData = 0;
130 1
131 1 FLASHCON = McuType;
132 1 GetData = CBYTE[McuFlashAddr];
133 1 FLASHCON = MCU_TYPE_CODE;
134 1 return GetData;
135 1 }
136
137
138 /*************************************************************************************************
139 * 函数名: BootProgram
140 * 参 数: 无
141 * 返回值: 无
142 * 描 述: Boot区进行升级代码操作Erase->Program->Verify
143 每擦除1个Sector即刻写入数据校验数据
144 *************************************************************************************************/
145 U8 BootProgram(void)
146 {
147 1 U8 i, McuCode, McuFlashType;
148 1 U16 j;
149 1 U32 McuFlashAddr;
150 1
151 1 for(i=0; i<IAP_BK_CODE_SIZE/MCU_CODE_SECTOR_SIZE; i++) //擦除应用程序区以Sector为<72>
-<>
152 1 {
153 2 BootMcuWdtClear();
154 2 if(i < IAP_CODE_SIZE/MCU_CODE_SECTOR_SIZE) //当前更新CODE区29K
155 2 {
156 3 McuFlashType = MCU_TYPE_CODE; //IAP更新CODE区
157 3 McuFlashAddr = IAP_CODE_START_ADDR + (U16)i*MCU_CODE_SECTOR_SIZE; //从第5K开始
158 3 }
159 2 else
160 2 {
161 3 McuFlashType = MCU_TYPE_E2P; //IAP更新EEPROM区
162 3 McuFlashAddr = (U16)i*MCU_CODE_SECTOR_SIZE - IAP_CODE_SIZE;
163 3 }
164 2 ucMcuFlashWrValid = 0x55;
165 2 McuFlashEraseSector(McuFlashAddr, McuFlashType); //以字节为单位
166 2 if(McuFlashBlankCheck(McuFlashAddr, McuFlashType)) //擦除结束后,需要查空
167 2 {
168 3 for(j=0; j<MCU_CODE_SECTOR_SIZE; j++) //将数据搬入APP对应地址
169 3 {
170 4 McuCode = McuFlashRdOneByte(IAP_BK_CODE_START_ADDR+j+(U16)i*MCU_CODE_SECTOR_SIZE, MCU_TYPE_CODE); //ya
-ngweilei 此处固化为从flash取数据从APP备份区读取CODE(1字节)
171 4 McuFlashWrOneByte(McuFlashAddr+j, McuCode, McuFlashType); //将CODE写入APP执行区
172 4 if(McuCode != McuFlashRdOneByte(McuFlashAddr+j, McuFlashType)) //校验写入的代码
173 4 {
174 5 return (BOOT_PGR_WR_ERR);
175 5 }
176 4 }
C51 COMPILER V9.01 FLASH 12/22/2023 12:15:06 PAGE 4
177 3 }
178 2 else
179 2 {
180 3 return (BOOT_PGR_ERASE_ERR);
181 3 }
182 2 }
183 1
184 1 return (BOOT_PGR_OK);
185 1 }
186
187
188 /*************************************************************************************************
189 * 函数名: BootUpgradeCode
190 * 参 数: 无
191 * 返回值: 无
192 * 描 述: Boot区进行升级代码操作Erase->Program->Verify
193 *************************************************************************************************/
194 BOOL BootUpgradeCode(void)
195 {
196 1 BOOL Result = 1;
197 1
198 1 if(BootProgram() == BOOT_PGR_OK)
199 1 {
200 2 McuFlashEraseSector(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //写入成功,擦除远程升级标志位
201 2 Result = McuFlashBlankCheck(BOOT_FLG_START_ADDR, MCU_TYPE_CODE); //擦除结束后,需要查空
202 2 }
203 1 else
204 1 {
205 2 Result = 0;
206 2 }
207 1
208 1 return Result;
209 1 }
210
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 617 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 32
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)