📄 updater_f02x.lst
字号:
205 4 {
206 5 Cell_No=Rec_Buf[3]; //取出当前是第几个数据块
207 5 if(Cell_No==0) //如果当前是第一条数据,进行处理
208 5 {
209 6 for(i=1;i<123;i++)
210 6 {
211 7 Erase_Flash(i);
212 7 }
213 6
214 6 //Erase_Flash(122);
215 6 Write_Flash(Rec_Buf+4,122);
216 6 Rec_Buf[5]=Read_Flash(1);
217 6 Rec_Buf[6]=Read_Flash(2);
218 6 Erase_Flash(0);
219 6 Write_Flash(Rec_Buf+4,0);
220 6 }
221 5 else if(Cell_No<=121) //收到的数据没有超出可写范围则写入
222 5 {
223 6 //Erase_Flash(Cell_No);
224 6 Write_Flash(Rec_Buf+4,Cell_No);
225 6 }
226 5 for(i=0;i<512;i++)
227 5 {
228 6 if(Rec_Buf[4+i]!=Read_Flash(Cell_No*512+i))Write_Error=1;
229 6 }
230 5 if(!Write_Error)
231 5 {
232 6 Send_Buf[0]=0x55;
233 6 Send_Buf[1]=0xAA;
234 6 Send_Buf[2]=0xD2;
235 6 SendData(Send_Buf,3); //返回可以接收下一条数据
236 6 }
237 5 else
238 5 {
239 6 Send_Buf[0]=0x55;
240 6 Send_Buf[1]=0xAA;
241 6 Send_Buf[2]=0xD4;
C51 COMPILER V7.50 UPDATER_F02X 06/05/2007 11:01:38 PAGE 5
242 6 SendData(Send_Buf,3); //返回升级失败
243 6
244 6 }
245 5 }
246 4 else
247 4 {
248 5 Send_Buf[0]=0x55;
249 5 Send_Buf[1]=0xAA;
250 5 Send_Buf[2]=0xD4;
251 5 SendData(Send_Buf,3); //返回升级失败
252 5 }
253 4 P_RecBuf=0;
254 4 break;
255 4 case 0xE2: //上位机给出升级成功指令,则开始运行正常程序
256 4 if(Update_Step!=3) {P_RecBuf=0;return;}
257 4 P_RecBuf=0;
258 4 JumpToRun();
259 4 break;
260 4 default :
261 4 P_RecBuf=0;
262 4 break;
263 4 }
264 3 }
265 2 else
266 2 {
267 3 P_RecBuf=0; //帧头无效则清除接收缓存
268 3 }
269 2
270 2 }
271 1 }
272 //-----------------------------------------------------------------------------
273 // erase_flash
274 //-----------------------------------------------------------------------------
275 //
276 // This routine erases the first 8 pages of FLASH (0x0000 to 0x0FFF).
277 //
278 void Erase_Flash(unsigned char Erase_Page)
279 {
280 1 char xdata* data pagePointer = 0;// a pointer to xdata located in data space
281 1 // points to the first FLASH page that
282 1 // will be erased
283 1
284 1 bit EA_state; // holds interrupt state
285 1
286 1 EA_state = EA; // save interrupt state
287 1
288 1 EA = 0; // disable interrupts
289 1 FLSCL |= 0x01; // enable FLASH write/erase
290 1 PSCTL = 0x03; // MOVX erases FLASH
291 1
292 1 // Erase the first 8 FLASH pages
293 1 pagePointer=Erase_Page*512;
294 1 *pagePointer = 0; // initiate the erase
295 1
296 1 PSCTL = 0x00; // MOVX writes target XRAM
297 1 FLSCL &= ~0x01; // disable FLASH write/erase
298 1
299 1 EA = EA_state; // restore interrupt state
300 1
301 1 f_valid = FALSE; // indicate that code is no longer valid
302 1 code_erased = TRUE; // indicate that FLASH has been erased
303 1 }
C51 COMPILER V7.50 UPDATER_F02X 06/05/2007 11:01:38 PAGE 6
304
305 void Write_Flash(unsigned char *Write_Buf,unsigned char Write_Page)
306 {
307 1 char xdata* data pwrite;
308 1 unsigned int i;
309 1
310 1 EA = 0; // disable interrupts (precautionary)
311 1 FLSCL |= 0x01; // enable FLASH write/erase
312 1 PSCTL = 0x01; // MOVX writes FLASH
313 1
314 1 pwrite = Write_Page*512; // initialize the write pointer
315 1
316 1 // write the record into flash
317 1 for( i = 0; i < 512; i++)
318 1 {
319 2 *pwrite=Write_Buf[i];
320 2 pwrite++;
321 2 }
322 1
323 1 PSCTL = 0x00; // MOVX writes target XRAM
324 1 FLSCL &= ~0x01; // disable FLASH write/erase
325 1 }
326
327 unsigned char Read_Flash(unsigned int Read_Address )
328 {
329 1 char code* data pread;
330 1 unsigned char ReadTemp;
331 1 pread = (char code*)Read_Address;
332 1 ReadTemp=*pread;
333 1 return(ReadTemp);
334 1 }
335
336 //-----------------------------------------------------------------------------
337 // Initialization Subroutines
338 //-----------------------------------------------------------------------------
339
340 //-----------------------------------------------------------------------------
341 // SYSCLK_Init
342 //-----------------------------------------------------------------------------
343 //
344 // This routine initializes the system clock to use an 22.1184MHz crystal
345 // as its clock source.
346 //
347 void SYSCLK_Init (void)
348 {
349 1 int i; // delay counter
350 1
351 1 OSCXCN = 0x67; // start external oscillator with
352 1 // 22.1184MHz crystal
353 1
354 1 for (i=0; i < 256; i++) ; // wait for osc to start
355 1
356 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
357 1
358 1 OSCICN = 0x88; // select external oscillator as SYSCLK
359 1 // source and enable missing clock
360 1 // detector
361 1 }
362
363 //-----------------------------------------------------------------------------
364 // PORT_Init
365 //-----------------------------------------------------------------------------
C51 COMPILER V7.50 UPDATER_F02X 06/05/2007 11:01:38 PAGE 7
366 //
367 // Configure the Crossbar and GPIO ports
368 //
369 void PORT_Init (void)
370 {
371 1 XBR0 = 0x17; // Enable UART0,SPI,I2C,CEX0,CEX1
372 1 XBR1 = 0x16; //使能两外部中断,TO输入口
373 1 P0MDOUT=0x15;
374 1 P1MDOUT=0x01;
375 1 P2MDOUT=0xC0;
376 1 P3MDOUT = 0xC0;
377 1 P74OUT = 0x00; //P4~P7设为开漏输出
378 1 EMI0CF = 0x2B; //XRAM的访问方式为带块选择分片方式。输入输出端口使用P4~P7,地址复用
-方式;
379 1 XBR2 = 0x44; // Enable crossbar and weak pull-ups ,UART1
380 1
381 1 }
382
383 //-----------------------------------------------------------------------------
384 // UART0_Init
385 //-----------------------------------------------------------------------------
386 //
387 // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
388 //
389 void UART0_Init (void)
390 {
391 1 SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
392 1 TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
393 1 TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
394 1 TR1 = 1; // start Timer1
395 1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base
396 1 PCON |= 0x80; // SMOD00 = 1
397 1 ES0=0;
398 1 TI0= 0;
399 1 RI0=0;
400 1 }
401
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 821 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1112 ----
PDATA SIZE = ---- ----
DATA SIZE = 6 14
IDATA SIZE = ---- ----
BIT SIZE = 3 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -