243 lines
11 KiB
Plaintext
243 lines
11 KiB
Plaintext
C51 COMPILER V9.01 FLASH 02/11/2025 11:30:12 PAGE 1
|
||
|
||
|
||
C51 COMPILER V9.01, COMPILATION OF MODULE FLASH
|
||
OBJECT MODULE PLACED IN .\output\Flash.obj
|
||
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_bootloader\Flash.c BROWSE INCDIR(.\header_bootloader) DEBUG OBJEC
|
||
-TEXTEND 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 02/11/2025 11:30:12 PAGE 2
|
||
|
||
55 /*************************************************************************************************
|
||
56 * 函数名: McuFlashBlankCheck
|
||
57 * 参 数: McuFlashAddr:起始地址
|
||
58 * 返回值: 0:非全0,Erase失败;1:全0,Erase成功
|
||
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 02/11/2025 11:30:12 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 02/11/2025 11:30:12 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)
|