📄 main.lis
字号:
017E .dbline 205
017E ; }
017E ; void delay(void)
017E ; {
017E .dbline 207
017E 0027 clr R16
0180 1127 clr R17
0182 02C0 rjmp L45
0184 L42:
0184 .dbline 207
0184 L43:
0184 .dbline 207
0184 0F5F subi R16,255 ; offset = 1
0186 1F4F sbci R17,255
0188 L45:
0188 .dbline 207
0188 ; unsigned int i;
0188 ; for (i=0;i<65530;i++);
0188 0A3F cpi R16,250
018A EFEF ldi R30,255
018C 1E07 cpc R17,R30
018E D0F3 brlo L42
0190 .dbline -2
0190 L41:
0190 .dbline 0 ; func end
0190 0895 ret
0192 .dbsym r i 16 i
0192 .dbend
0192 .dbfunc e ExecCode _ExecCode fV
.even
0192 _ExecCode::
0192 .dbline -1
0192 .dbline 212
0192 ; }
0192 ;
0192 ; /*****************************************************************************/
0192 ; void ExecCode(void)
0192 ; {
0192 .dbline 213
0192 ; GICR=0X01; //中断向量表移位允许
0192 81E0 ldi R24,1
0194 8BBF out 0x3b,R24
0196 .dbline 214
0196 ; GICR=0X00; //中断向量指向应用程序区
0196 2224 clr R2
0198 2BBE out 0x3b,R2
019A .dbline 215
019A ; asm("jmp 0x0000");
019A 0C940000 jmp 0x0000
019E .dbline -2
019E L46:
019E .dbline 0 ; func end
019E 0895 ret
01A0 .dbend
01A0 .dbfunc e main _main fV
01A0 ; iTry -> R20
01A0 ; TempInt -> R10,R11
01A0 ; BootFlag -> R22
.even
01A0 _main::
01A0 .dbline -1
01A0 .dbline 219
01A0 ; }
01A0 ;
01A0 ; void main(void)
01A0 ; {
01A0 .dbline 230
01A0 ; unsigned char BootFlag;
01A0 ; unsigned int TempInt;
01A0 ; char iTry;
01A0 ;
01A0 ; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
01A0 ; OSCCAL=read_flash(OscAddress);
01A0 ; #endif
01A0 ;
01A0 ; #ifdef W0
01A0 ; //pei 拷贝W0的PortInit
01A0 ; PORTB = 0x0F;//rfslp,fs123=1
01A0 8FE0 ldi R24,15
01A2 88BB out 0x18,R24
01A4 .dbline 231
01A4 ; DDRB = 0xFF;//bit1=output
01A4 8FEF ldi R24,255
01A6 87BB out 0x17,R24
01A8 .dbline 232
01A8 ; PORTC = 0x21;//0x20;//rfrst=1,not reset!
01A8 81E2 ldi R24,33
01AA 85BB out 0x15,R24
01AC .dbline 233
01AC ; DDRC = 0x7F;
01AC 8FE7 ldi R24,127
01AE 84BB out 0x14,R24
01B0 .dbline 234
01B0 ; PORTD = 0x0C;
01B0 8CE0 ldi R24,12
01B2 82BB out 0x12,R24
01B4 .dbline 235
01B4 ; DDRD = 0xF0;
01B4 80EF ldi R24,240
01B6 81BB out 0x11,R24
01B8 .dbline 239
01B8 ; #else
01B8 ; #endif
01B8 ;
01B8 ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
01B8 86E8 ldi R24,134
01BA 80BD out 0x20,R24
01BC .dbline 240
01BC ; UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
01BC 88E1 ldi R24,24
01BE 8AB9 out 0xa,R24
01C0 .dbline 241
01C0 ; UBRR = BAU;
01C0 83E2 ldi R24,35
01C2 89B9 out 0x9,R24
01C4 .dbline 243
01C4 ;
01C4 ; iTry=20;
01C4 44E1 ldi R20,20
01C6 L48:
01C6 .dbline 246
01C6 ; STARTBOOT://pei未下载程序时重复等待
01C6 ; #ifdef W0
01C6 ; PORTC=PORTC^0x03;//指示灯闪烁
01C6 83E0 ldi R24,3
01C8 25B2 in R2,0x15
01CA 2826 eor R2,R24
01CC 25BA out 0x15,R2
01CE .dbline 249
01CE ; #endif
01CE ;
01CE ; SendChar('>'); //通知PC机,BOOT下载准备就绪
01CE 0EE3 ldi R16,62
01D0 D2DF rcall _SendChar
01D2 .dbline 250
01D2 ; delay(); //延时等待PC机响应
01D2 D5DF rcall _delay
01D4 .dbline 251
01D4 ; BootFlag=UDR;
01D4 6CB1 in R22,0xc
01D6 .dbline 252
01D6 ; if (BootFlag == '<')
01D6 6C33 cpi R22,60
01D8 F9F4 brne L49
01DA .dbline 253
01DA ; {
01DA .dbline 254
01DA ; SendChar(ChipType); //芯片版本信息
01DA 00E3 ldi R16,48
01DC CCDF rcall _SendChar
01DE .dbline 255
01DE ; SendChar(BootSize);
01DE 03E6 ldi R16,99
01E0 CADF rcall _SendChar
01E2 .dbline 256
01E2 ; SendChar(BootVer);
01E2 07E6 ldi R16,103
01E4 C8DF rcall _SendChar
01E6 17C0 rjmp L52
01E8 L51:
01E8 .dbline 258
01E8 ; while (1)
01E8 ; {
01E8 .dbline 259
01E8 ; switch (RecChar())
01E8 C2DF rcall _RecChar
01EA C02E mov R12,R16
01EC DD24 clr R13
01EE C601 movw R24,R12
01F0 8534 cpi R24,69
01F2 E0E0 ldi R30,0
01F4 9E07 cpc R25,R30
01F6 61F0 breq L58
01F8 8534 cpi R24,69
01FA E0E0 ldi R30,0
01FC 9E07 cpc R25,R30
01FE 5CF0 brlt L55
0200 L59:
0200 C601 movw R24,R12
0202 8735 cpi R24,87
0204 E0E0 ldi R30,0
0206 9E07 cpc R25,R30
0208 09F0 breq L57
020A 05C0 rjmp L55
020C X1:
020C .dbline 260
020C ; {
020C L57:
020C .dbline 261
020C ; case 'W': FlashLoad();
020C F9DE rcall _FlashLoad
020E .dbline 262
020E ; break;
020E 03C0 rjmp L55
0210 L58:
0210 .dbline 263
0210 ; case 'E': {
0210 .dbline 264
0210 ; SendChar('E'); //通知PC机,进入运用程序区
0210 05E4 ldi R16,69
0212 B1DF rcall _SendChar
0214 .dbline 265
0214 ; ExecCode();
0214 BEDF rcall _ExecCode
0216 .dbline 266
0216 ; } break;
0216 .dbline 266
0216 .dbline 267
0216 ; default : break;
0216 L55:
0216 .dbline 269
0216 L52:
0216 .dbline 257
0216 E8CF rjmp L51
0218 X2:
0218 .dbline 270
0218 ; }
0218 ; }
0218 ; }
0218 L49:
0218 .dbline 271
0218 ; SendChar('E');
0218 05E4 ldi R16,69
021A ADDF rcall _SendChar
021C .dbline 273
021C ;
021C ; TempInt = read_program_memory(0,0);//pei
021C 2227 clr R18
021E 0027 clr R16
0220 1127 clr R17
0222 00D0 rcall _read_program_memory
0224 5801 movw R10,R16
0226 .dbline 274
0226 ; if (TempInt==0xFFFF) goto STARTBOOT;
0226 0F3F cpi R16,255
0228 EFEF ldi R30,255
022A 1E07 cpc R17,R30
022C 09F4 brne L60
022E .dbline 274
022E CBCF rjmp L48
0230 L60:
0230 .dbline 275
0230 ; else{ iTry--;
0230 .dbline 275
0230 4A95 dec R20
0232 .dbline 276
0232 2224 clr R2
0234 2416 cp R2,R20
0236 08F4 brsh L62
0238 .dbline 276
0238 C6CF rjmp L48
023A L62:
023A .dbline 276
023A ; if (iTry>0) goto STARTBOOT;}
023A .dbline 278
023A ;
023A ; ExecCode();//执行用户区程序
023A ABDF rcall _ExecCode
023C .dbline -2
023C L47:
023C .dbline 0 ; func end
023C 0895 ret
023E .dbsym r iTry 20 c
023E .dbsym r TempInt 10 i
023E .dbsym r BootFlag 22 c
023E .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\IccAvr\Pei\BootLoad_Pei\main.c
0000 _PageAddress::
0000 .blkb 2
0002 .dbsym e PageAddress _PageAddress i
0002 _PageBuffer::
0002 .blkb 64
0042 .dbsym e PageBuffer _PageBuffer A[64:64]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -