📄 avr-bootloader.lis
字号:
01FE 80E0 ldi R24,<_startupString
0200 90E0 ldi R25,>_startupString
0202 F501 movw R30,R10
0204 E80F add R30,R24
0206 F91F adc R31,R25
0208 2690 elpm R2,Z
020A 2220 tst R2
020C 71F7 brne L43
020E X11:
020E .dbline 166
020E ; TCCR0 = 0x07; //start timer
020E 87E0 ldi R24,7
0210 83BF out 0x33,R24
0212 15C0 xjmp L47
0214 L46:
0214 .dbline 169
0214 ; //////3秒等待PC机发'd',否则退出Bootloader程序,从0x0000处执行应用程序
0214 ; while(1)
0214 ; {
0214 .dbline 170
0214 ; if(uart_getchar()=='d')break;
0214 71DF xcall _uart_getchar
0216 0436 cpi R16,100
0218 E0E0 ldi R30,0
021A 1E07 cpc R17,R30
021C 09F4 brne L49
021E X12:
021E .dbline 170
021E 20C0 xjmp L56
0220 L49:
0220 .dbline 171
0220 ; if(TIFR&0x02)
0220 26B6 in R2,0x36
0222 21FE sbrs R2,1
0224 0CC0 rjmp L51
0226 X13:
0226 .dbline 172
0226 ; {
0226 .dbline 173
0226 ; if(++timercount>200) quit(); //3秒
0226 8C2D mov R24,R12
0228 8F5F subi R24,255 ; addi 1
022A C82E mov R12,R24
022C 88EC ldi R24,200
022E 8C15 cp R24,R12
0230 08F4 brsh L53
0232 X14:
0232 .dbline 173
0232 A6DF xcall _quit
0234 L53:
0234 .dbline 176
0234 ; // if(++timercount>20) quit(); //1秒 林树亮 2007-6-25改
0234 ;
0234 ; TCNT0 = 0x29; //set count
0234 89E2 ldi R24,41
0236 82BF out 0x32,R24
0238 .dbline 177
0238 ; TIFR=TIFR|0x02;
0238 86B7 in R24,0x36
023A 8260 ori R24,2
023C 86BF out 0x36,R24
023E .dbline 178
023E ; }
023E L51:
023E .dbline 179
023E ; }
023E L47:
023E .dbline 168
023E EACF xjmp L46
0240 L55:
0240 .dbline 183
0240 ;
0240 ; ////每秒向PC机发送一个控制字符C,等待控制字
0240 ; while(uart_getchar()!=XMODEM_SOH)
0240 ; {
0240 .dbline 184
0240 ; if(TIFR&0x02)
0240 26B6 in R2,0x36
0242 21FE sbrs R2,1
0244 0DC0 rjmp L58
0246 X15:
0246 .dbline 185
0246 ; {
0246 .dbline 186
0246 ; if(++timercount>67)
0246 8C2D mov R24,R12
0248 8F5F subi R24,255 ; addi 1
024A E82E mov R14,R24
024C C82E mov R12,R24
024E 83E4 ldi R24,67
0250 8C15 cp R24,R12
0252 18F4 brsh L60
0254 X16:
0254 .dbline 187
0254 ; {
0254 .dbline 188
0254 ; uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);
0254 03E4 ldi R16,67
0256 4CDF xcall _uart_putchar
0258 .dbline 189
0258 ; timercount=0;
0258 CC24 clr R12
025A .dbline 190
025A ; }
025A L60:
025A .dbline 191
025A ; TIFR=TIFR|0x02;
025A 86B7 in R24,0x36
025C 8260 ori R24,2
025E 86BF out 0x36,R24
0260 .dbline 192
0260 ; }
0260 L58:
0260 .dbline 193
0260 ; }
0260 L56:
0260 .dbline 182
0260 4BDF xcall _uart_getchar
0262 7801 movw R14,R16
0264 0130 cpi R16,1
0266 E0E0 ldi R30,0
0268 1E07 cpc R17,R30
026A 51F7 brne L55
026C X17:
026C L62:
026C .dbline 196
026C ; //////开始接收数据块
026C ; do
026C ; {
026C .dbline 197
026C ; if((packNO==uart_waitchar())&&(packNO==(~uart_waitchar())))
026C 54DF xcall _uart_waitchar
026E C02E mov R12,R16
0270 6017 cp R22,R16
0272 09F0 breq X25
0274 5AC0 xjmp L65
0276 X25:
0276 X18:
0276 4FDF xcall _uart_waitchar
0278 C02E mov R12,R16
027A 2C2C mov R2,R12
027C 2094 com R2
027E 6215 cp R22,R2
0280 09F0 breq X26
0282 53C0 xjmp L65
0284 X26:
0284 X19:
0284 .dbline 198
0284 ; {
0284 .dbline 199
0284 ; for(i=0;i<128;i++)
0284 AA24 clr R10
0286 BB24 clr R11
0288 L67:
0288 .dbline 200
0288 ; {
0288 .dbline 201
0288 ; data[bufferPoint]=uart_waitchar();
0288 46DF xcall _uart_waitchar
028A C02E mov R12,R16
028C 80E0 ldi R24,<_data
028E 90E0 ldi R25,>_data
0290 FA01 movw R30,R20
0292 E80F add R30,R24
0294 F91F adc R31,R25
0296 C082 std z+0,R12
0298 .dbline 202
0298 ; bufferPoint++;
0298 4F5F subi R20,255 ; offset = 1
029A 5F4F sbci R21,255
029C .dbline 203
029C ; }
029C L68:
029C .dbline 199
029C C501 movw R24,R10
029E 0196 adiw R24,1
02A0 5C01 movw R10,R24
02A2 .dbline 199
02A2 8038 cpi R24,128
02A4 E0E0 ldi R30,0
02A6 9E07 cpc R25,R30
02A8 7CF3 brlt L67
02AA X20:
02AA .dbline 204
02AA ; crc=uart_waitchar()<<8; //修改处
02AA 35DF xcall _uart_waitchar
02AC A02E mov R10,R16
02AE 2A2C mov R2,R10
02B0 3324 clr R3
02B2 322C mov R3,R2
02B4 2224 clr R2
02B6 5101 movw R10,R2
02B8 .dbline 205
02B8 ; crc+=uart_waitchar(); //修改处
02B8 2EDF xcall _uart_waitchar
02BA C02E mov R12,R16
02BC 2C2C mov R2,R12
02BE 3324 clr R3
02C0 A20C add R10,R2
02C2 B31C adc R11,R3
02C4 .dbline 206
02C4 ; if(calcrc(&data[bufferPoint-128],128)==crc)
02C4 20E8 ldi R18,128
02C6 30E0 ldi R19,0
02C8 80E0 ldi R24,<_data-128
02CA 90E0 ldi R25,>_data-128
02CC 8A01 movw R16,R20
02CE 080F add R16,R24
02D0 191F adc R17,R25
02D2 2CDF xcall _calcrc
02D4 6801 movw R12,R16
02D6 0A15 cp R16,R10
02D8 1B05 cpc R17,R11
02DA 21F5 brne L71
02DC X21:
02DC .dbline 207
02DC ; {
02DC 1BC0 xjmp L75
02DE L74:
02DE .dbline 209
02DE ; while(bufferPoint>=SPM_PAGESIZE)
02DE ; {
02DE .dbline 210
02DE ; write_one_page();
02DE CEDE xcall _write_one_page
02E0 .dbline 211
02E0 ; address+=SPM_PAGESIZE;
02E0 80E0 ldi R24,0
02E2 91E0 ldi R25,1
02E4 A0E0 ldi R26,0
02E6 B0E0 ldi R27,0
02E8 40900200 lds R4,_address+2
02EC 50900300 lds R5,_address+2+1
02F0 20900000 lds R2,_address
02F4 30900100 lds R3,_address+1
02F8 280E add R2,R24
02FA 391E adc R3,R25
02FC 4A1E adc R4,R26
02FE 5B1E adc R5,R27
0300 30920100 sts _address+1,R3
0304 20920000 sts _address,R2
0308 50920300 sts _address+2+1,R5
030C 40920200 sts _address+2,R4
0310 .dbline 212
0310 ; bufferPoint=0;
0310 4427 clr R20
0312 5527 clr R21
0314 .dbline 213
0314 ; }
0314 L75:
0314 .dbline 208
0314 4030 cpi R20,0
0316 E1E0 ldi R30,1
0318 5E07 cpc R21,R30
031A 0CF7 brge L74
031C X22:
031C .dbline 214
031C ; uart_putchar(XMODEM_ACK);
031C 06E0 ldi R16,6
031E E8DE xcall _uart_putchar
0320 .dbline 215
0320 ; packNO++;
0320 6395 inc R22
0322 .dbline 216
0322 ; }
0322 05C0 xjmp L66
0324 L71:
0324 .dbline 218
0324 ; else
0324 ; {
0324 .dbline 219
0324 ; uart_putchar(XMODEM_NAK);
0324 05E1 ldi R16,21
0326 E4DE xcall _uart_putchar
0328 .dbline 220
0328 ; }
0328 .dbline 221
0328 ; }
0328 02C0 xjmp L66
032A L65:
032A .dbline 223
032A ; else
032A ; {
032A .dbline 224
032A ; uart_putchar(XMODEM_NAK);
032A 05E1 ldi R16,21
032C E1DE xcall _uart_putchar
032E .dbline 225
032E ; }
032E L66:
032E .dbline 226
032E ; }
032E L63:
032E .dbline 227
032E ; while(uart_waitchar()!=XMODEM_EOT);
032E F3DE xcall _uart_waitchar
0330 A02E mov R10,R16
0332 0430 cpi R16,4
0334 09F0 breq X27
0336 9ACF xjmp L62
0338 X27:
0338 X23:
0338 .dbline 228
0338 ; uart_putchar(XMODEM_ACK);
0338 06E0 ldi R16,6
033A DADE xcall _uart_putchar
033C .dbline 229
033C ; if(bufferPoint)
033C 4030 cpi R20,0
033E 4507 cpc R20,R21
0340 09F0 breq L77
0342 X24:
0342 .dbline 230
0342 ; write_one_page();
0342 9CDE xcall _write_one_page
0344 L77:
0344 .dbline 231
0344 ; quit();
0344 1DDF xcall _quit
0346 .dbline -2
0346 L42:
0346 .dbline 0 ; func end
0346 0895 ret
0348 .dbsym r timercount 12 c
0348 .dbsym r crc 10 i
0348 .dbsym r packNO 22 c
0348 .dbsym r i 10 I
0348 .dbsym r bufferPoint 20 I
0348 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
0000 _data::
0000 .blkb 256
0100 .dbsym e data _data A[256:256]c
0100 ;
0100 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -