📄 main.lis
字号:
01C4 ; }
01C4 ; /*****************************************************************************/
01C4 ; void SendChar(unsigned char c)
01C4 ; {
01C4 L52:
01C4 .dbline 196
01C4 L53:
01C4 .dbline 196
01C4 ; while (!(UCSRA&(1<<UDRE)));
01C4 5D9B sbis 0xb,5
01C6 FECF rjmp L52
01C8 .dbline 197
01C8 ; UDR=c;
01C8 0CB9 out 0xc,R16
01CA .dbline -2
01CA L51:
01CA .dbline 0 ; func end
01CA 0895 ret
01CC .dbsym r c 16 c
01CC .dbend
01CC .dbfunc e delay _delay fV
01CC ; i -> R16,R17
.even
01CC _delay::
01CC .dbline -1
01CC .dbline 200
01CC ; }
01CC ; void delay(void)
01CC ; {
01CC .dbline 202
01CC 0027 clr R16
01CE 1127 clr R17
01D0 02C0 xjmp L59
01D2 L56:
01D2 .dbline 202
01D2 L57:
01D2 .dbline 202
01D2 0F5F subi R16,255 ; offset = 1
01D4 1F4F sbci R17,255
01D6 L59:
01D6 .dbline 202
01D6 ; unsigned int i;
01D6 ; for (i=0;i<65530;i++);
01D6 0A3F cpi R16,250
01D8 EFEF ldi R30,255
01DA 1E07 cpc R17,R30
01DC D0F3 brlo L56
01DE .dbline -2
01DE L55:
01DE .dbline 0 ; func end
01DE 0895 ret
01E0 .dbsym r i 16 i
01E0 .dbend
01E0 .dbfunc e ExecCode _ExecCode fV
.even
01E0 _ExecCode::
01E0 .dbline -1
01E0 .dbline 207
01E0 ; }
01E0 ;
01E0 ; /*****************************************************************************/
01E0 ; void ExecCode(void)
01E0 ; {
01E0 .dbline 211
01E0 ; #ifdef RAMPZ_FLAG
01E0 ; RAMPZ = 0;
01E0 ; #endif
01E0 ; INTVECREG=0x01; //中断向量表移位允许
01E0 81E0 ldi R24,1
01E2 8BBF out 0x3b,R24
01E4 .dbline 212
01E4 ; INTVECREG=0x00; //中断向量指向应用程序区
01E4 2224 clr R2
01E6 2BBE out 0x3b,R2
01E8 .dbline 213
01E8 ; asm("jmp 0x0000");
01E8 0C940000 jmp 0x0000
01EC .dbline -2
01EC L60:
01EC .dbline 0 ; func end
01EC 0895 ret
01EE .dbend
01EE .dbfunc e main _main fV
01EE ; BootFlag -> R20
.even
01EE _main::
01EE .dbline -1
01EE .dbline 217
01EE ; }
01EE ;
01EE ; void main(void)
01EE ; {
01EE .dbline 221
01EE ; unsigned char BootFlag;
01EE ;
01EE ; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
01EE ; OSCCAL=read_flash(OscAddress);
01EE 0FEF ldi R16,8191
01F0 1FE1 ldi R17,31
01F2 0E940000 xcall _read_flash
01F6 01BF out 0x31,R16
01F8 .dbline 224
01F8 ; #endif
01F8 ;
01F8 ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
01F8 86E8 ldi R24,134
01FA 80BD out 0x20,R24
01FC .dbline 225
01FC ; UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
01FC 88E1 ldi R24,24
01FE 8AB9 out 0xa,R24
0200 .dbline 226
0200 ; UBRR = BAU;
0200 87E1 ldi R24,23
0202 89B9 out 0x9,R24
0204 .dbline 229
0204 ;
0204 ;
0204 ; SendChar('>'); //通知PC机,BOOT下载准备就绪
0204 0EE3 ldi R16,62
0206 DEDF xcall _SendChar
0208 .dbline 230
0208 ; delay(); //延时等待PC机响应
0208 E1DF xcall _delay
020A .dbline 231
020A ; delay();
020A E0DF xcall _delay
020C .dbline 232
020C ; delay();
020C DFDF xcall _delay
020E .dbline 233
020E ; delay();
020E DEDF xcall _delay
0210 .dbline 234
0210 ; delay();
0210 DDDF xcall _delay
0212 .dbline 235
0212 ; delay();
0212 DCDF xcall _delay
0214 .dbline 236
0214 ; delay();
0214 DBDF xcall _delay
0216 .dbline 237
0216 ; delay();
0216 DADF xcall _delay
0218 .dbline 239
0218 ;
0218 ; BootFlag=UDR;
0218 4CB1 in R20,0xc
021A .dbline 240
021A ; if (BootFlag == '<')
021A 4C33 cpi R20,60
021C 31F5 brne L62
021E .dbline 241
021E ; {
021E .dbline 242
021E ; SendChar(ChipType);
021E 01E3 ldi R16,49
0220 D1DF xcall _SendChar
0222 L64:
0222 .dbline 243
0222 L65:
0222 .dbline 243
0222 ; while (RecChar()!='N');
0222 CCDF xcall _RecChar
0224 0E34 cpi R16,78
0226 E9F7 brne L64
0228 .dbline 244
0228 ; SendChar(BootSize);
0228 04E6 ldi R16,100
022A CCDF xcall _SendChar
022C L67:
022C .dbline 245
022C L68:
022C .dbline 245
022C ; while (RecChar()!='N');
022C C7DF xcall _RecChar
022E 0E34 cpi R16,78
0230 E9F7 brne L67
0232 .dbline 246
0232 ; SendChar(BootVer);
0232 06E6 ldi R16,102
0234 C7DF xcall _SendChar
0236 18C0 xjmp L71
0238 L70:
0238 .dbline 248
0238 ; while (1)
0238 ; {
0238 .dbline 249
0238 ; switch (RecChar())
0238 C1DF xcall _RecChar
023A 402F mov R20,R16
023C 5527 clr R21
023E 4534 cpi R20,69
0240 E0E0 ldi R30,0
0242 5E07 cpc R21,R30
0244 59F0 breq L77
0246 4534 cpi R20,69
0248 E0E0 ldi R30,0
024A 5E07 cpc R21,R30
024C 6CF0 brlt L74
024E L81:
024E 4735 cpi R20,87
0250 E0E0 ldi R30,0
0252 5E07 cpc R21,R30
0254 09F0 breq L76
0256 08C0 xjmp L74
0258 X3:
0258 .dbline 250
0258 ; {
0258 L76:
0258 .dbline 251
0258 ; case 'W': FlashLoad(); break;
0258 D3DE xcall _FlashLoad
025A .dbline 251
025A 06C0 xjmp L74
025C L77:
025C .dbline 252
025C ; case 'E': {
025C .dbline 253
025C ; SendChar('E'); //通知PC机,进入运用程序区
025C 05E4 ldi R16,69
025E B2DF xcall _SendChar
0260 L78:
0260 .dbline 254
0260 L79:
0260 .dbline 254
0260 ; while (RecChar()!='N');
0260 ADDF xcall _RecChar
0262 0E34 cpi R16,78
0264 E9F7 brne L78
0266 .dbline 255
0266 ; ExecCode();
0266 BCDF xcall _ExecCode
0268 .dbline 256
0268 ; } break;
0268 .dbline 256
0268 .dbline 257
0268 ; default : break;
0268 L74:
0268 .dbline 259
0268 L71:
0268 .dbline 247
0268 E7CF xjmp L70
026A X4:
026A .dbline 260
026A ; }
026A ; }
026A ; }
026A L62:
026A .dbline 261
026A ; SendChar('E'); //通知PC机,进入运用程序区
026A 05E4 ldi R16,69
026C ABDF xcall _SendChar
026E .dbline 263
026E ; //while (RecChar()!='N');
026E ; delay();
026E AEDF xcall _delay
0270 .dbline 264
0270 ; delay();
0270 ADDF xcall _delay
0272 .dbline 265
0272 ; delay();
0272 ACDF xcall _delay
0274 .dbline 266
0274 ; delay();
0274 ABDF xcall _delay
0276 .dbline 267
0276 ; ExecCode();
0276 B4DF xcall _ExecCode
0278 .dbline -2
0278 L61:
0278 .dbline 0 ; func end
0278 0895 ret
027A .dbsym r BootFlag 20 c
027A .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\桌面\AVR_BO~1.2\bootloader\main.c
0000 _PageAddress::
0000 .blkb 2
0002 .dbsym e PageAddress _PageAddress i
0002 _RealPageAddress::
0002 .blkb 2
0004 .dbsym e RealPageAddress _RealPageAddress i
0004 _PageBuffer::
0004 .blkb 128
0084 .dbsym e PageBuffer _PageBuffer A[128:128]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -