📄 main.lis
字号:
017A 02C0 rjmp L45
017C L42:
017C .dbline 207
017C L43:
017C .dbline 207
017C 0F5F subi R16,255 ; offset = 1
017E 1F4F sbci R17,255
0180 L45:
0180 .dbline 207
0180 8AEF ldi R24,250
0182 9FEF ldi R25,255
0184 A0E0 ldi R26,0
0186 B0E0 ldi R27,0
0188 1801 movw R2,R16
018A 4424 clr R4
018C 5524 clr R5
018E 2816 cp R2,R24
0190 3906 cpc R3,R25
0192 4A06 cpc R4,R26
0194 5B06 cpc R5,R27
0196 94F3 brlt L42
0198 X12:
0198 .dbline -2
0198 L41:
0198 .dbline 0 ; func end
0198 0895 ret
019A .dbsym r i 16 i
019A .dbend
019A .dbfunc e ExecCode _ExecCode fV
.even
019A _ExecCode::
019A .dbline -1
019A .dbline 212
019A ; }
019A ;
019A ; /*****************************************************************************/
019A ; void ExecCode(void)
019A ; {
019A .dbline 213
019A ; GICR=0X01; //中断向量表移位允许
019A 81E0 ldi R24,1
019C 8BBF out 0x3b,R24
019E .dbline 214
019E ; GICR=0X00; //中断向量指向应用程序区
019E 2224 clr R2
01A0 2BBE out 0x3b,R2
01A2 .dbline 215
01A2 ; asm("jmp 0x0000");
01A2 0C940000 jmp 0x0000
01A6 .dbline -2
01A6 L46:
01A6 .dbline 0 ; func end
01A6 0895 ret
01A8 .dbend
01A8 .dbfunc e main _main fV
01A8 ; iTry -> R20
01A8 ; TempInt -> R22,R23
01A8 ; BootFlag -> R22
.even
01A8 _main::
01A8 .dbline -1
01A8 .dbline 218
01A8 ; }
01A8 ; void main(void)
01A8 ; {
01A8 .dbline 222
01A8 ; unsigned char BootFlag;
01A8 ; unsigned int TempInt;
01A8 ; char iTry;
01A8 ; CLI();
01A8 F894 cli
01AA .dbline 229
01AA ; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
01AA ; OSCCAL=read_flash(OscAddress);
01AA ; #endif
01AA ;
01AA ; #ifdef W0
01AA ; //pei 拷贝W0的PortInit
01AA ; PORTB = 0x0F;//rfslp,fs123=1
01AA 8FE0 ldi R24,15
01AC 88BB out 0x18,R24
01AE .dbline 230
01AE ; DDRB = 0xFF;//bit1=output
01AE 8FEF ldi R24,255
01B0 87BB out 0x17,R24
01B2 .dbline 231
01B2 ; PORTC = 0x21;//0x20;//rfrst=1,not reset!
01B2 81E2 ldi R24,33
01B4 85BB out 0x15,R24
01B6 .dbline 232
01B6 ; DDRC = 0x7F;
01B6 8FE7 ldi R24,127
01B8 84BB out 0x14,R24
01BA .dbline 233
01BA ; PORTD = 0x0C;
01BA 8CE0 ldi R24,12
01BC 82BB out 0x12,R24
01BE .dbline 234
01BE ; DDRD = 0xF0;
01BE 80EF ldi R24,240
01C0 81BB out 0x11,R24
01C2 .dbline 238
01C2 ; #else
01C2 ; #endif
01C2 ;
01C2 ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
01C2 86E8 ldi R24,134
01C4 80BD out 0x20,R24
01C6 .dbline 239
01C6 ; UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
01C6 88E1 ldi R24,24
01C8 8AB9 out 0xa,R24
01CA .dbline 240
01CA ; UBRR = BAU;
01CA 83E3 ldi R24,51
01CC 89B9 out 0x9,R24
01CE .dbline 242
01CE ;
01CE ; iTry=20;
01CE 44E1 ldi R20,20
01D0 L48:
01D0 .dbline 245
01D0 ; STARTBOOT://pei未下载程序时重复等待
01D0 ; #ifdef W0
01D0 ; PORTC=PORTC^0x03;//指示灯闪烁
01D0 83E0 ldi R24,3
01D2 25B2 in R2,0x15
01D4 2826 eor R2,R24
01D6 25BA out 0x15,R2
01D8 .dbline 247
01D8 ; #endif
01D8 ; delay(); //延时等待PC机响应
01D8 CEDF rcall _delay
01DA .dbline 248
01DA ; SendChar('>'); //通知PC机,BOOT下载准备就绪
01DA 0EE3 ldi R16,62
01DC C8DF rcall _SendChar
01DE .dbline 249
01DE ; delay(); //延时等待PC机响应
01DE CBDF rcall _delay
01E0 .dbline 250
01E0 ; BootFlag=UDR;
01E0 6CB1 in R22,0xc
01E2 .dbline 252
01E2 ;
01E2 ; if (BootFlag == '<')
01E2 6C33 cpi R22,60
01E4 E9F4 brne L49
01E6 X13:
01E6 .dbline 253
01E6 ; {
01E6 .dbline 254
01E6 ; SendChar(ChipType); //芯片版本信息
01E6 00E3 ldi R16,48
01E8 C2DF rcall _SendChar
01EA .dbline 255
01EA ; SendChar(BootSize);
01EA 03E6 ldi R16,99
01EC C0DF rcall _SendChar
01EE .dbline 256
01EE ; SendChar(BootVer);
01EE 07E6 ldi R16,103
01F0 BEDF rcall _SendChar
01F2 15C0 rjmp L52
01F4 L51:
01F4 .dbline 258
01F4 ; while (1)
01F4 ; {
01F4 .dbline 259
01F4 ; switch (RecChar())
01F4 B8DF rcall _RecChar
01F6 602F mov R22,R16
01F8 7727 clr R23
01FA 6534 cpi R22,69
01FC E0E0 ldi R30,0
01FE 7E07 cpc R23,R30
0200 59F0 breq L58
0202 X14:
0202 6534 cpi R22,69
0204 E0E0 ldi R30,0
0206 7E07 cpc R23,R30
0208 54F0 brlt L55
020A X15:
020A L59:
020A 6735 cpi R22,87
020C E0E0 ldi R30,0
020E 7E07 cpc R23,R30
0210 09F0 breq L57
0212 X16:
0212 05C0 rjmp L55
0214 L57:
0214 .dbline 261
0214 ; {
0214 ; case 'W': FlashLoad();
0214 F5DE rcall _FlashLoad
0216 .dbline 262
0216 ; break;
0216 03C0 rjmp L55
0218 L58:
0218 .dbline 263
0218 ; case 'E': {
0218 .dbline 264
0218 ; SendChar('E'); //通知PC机,进入运用程序区
0218 05E4 ldi R16,69
021A A9DF rcall _SendChar
021C .dbline 265
021C ; ExecCode();
021C BEDF rcall _ExecCode
021E .dbline 266
021E ; } break;
021E .dbline 266
021E .dbline 267
021E ; default : break;
021E L55:
021E .dbline 269
021E ; }
021E ; }
021E L52:
021E .dbline 257
021E EACF rjmp L51
0220 L49:
0220 .dbline 271
0220 ; }
0220 ; SendChar('E');
0220 05E4 ldi R16,69
0222 A5DF rcall _SendChar
0224 .dbline 273
0224 ;
0224 ; TempInt = read_program_memory(0,0);//pei
0224 2227 clr R18
0226 0027 clr R16
0228 1127 clr R17
022A 00D0 rcall _read_program_memory
022C B801 movw R22,R16
022E .dbline 274
022E ; if (TempInt==0xFFFF) goto STARTBOOT;
022E 0F3F cpi R16,255
0230 EFEF ldi R30,255
0232 1E07 cpc R17,R30
0234 09F4 brne L60
0236 X17:
0236 .dbline 274
0236 CCCF rjmp L48
0238 L60:
0238 .dbline 275
0238 ; else{ iTry--;
0238 .dbline 275
0238 4A95 dec R20
023A .dbline 276
023A ; if (iTry>0) goto STARTBOOT;}
023A 80E0 ldi R24,0
023C 8417 cp R24,R20
023E 08F4 brsh L62
0240 X18:
0240 .dbline 276
0240 C7CF rjmp L48
0242 L62:
0242 .dbline 276
0242 .dbline 277
0242 ; SEI();
0242 7894 sei
0244 .dbline 278
0244 ; ExecCode();//执行用户区程序
0244 AADF rcall _ExecCode
0246 .dbline -2
0246 L47:
0246 .dbline 0 ; func end
0246 0895 ret
0248 .dbsym r iTry 20 c
0248 .dbsym r TempInt 22 i
0248 .dbsym r BootFlag 22 c
0248 .dbend
.area bss(ram, con, rel)
0000 .dbfile F:\AVR常用函数\BootLooderMage8\BootLoad_8M\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
0042 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -