📄 atemga128iap.lis
字号:
01D0 ; }
01D0 ; //3/秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序
01D0 ; while(1)
01D0 ; {
01D0 .dbline 158
01D0 ; if(uart_getchar()== 'd') break;
01D0 78DF xcall _uart_getchar
01D2 0436 cpi R16,100
01D4 E0E0 ldi R30,0
01D6 1E07 cpc R17,R30
01D8 09F4 brne L49
01DA .dbline 158
01DA 20C0 xjmp L56
01DC L49:
01DC .dbline 159
01DC ; if (TIFR & 0x02) //timer0/ over flow
01DC 26B6 in R2,0x36
01DE 21FE sbrs R2,1
01E0 0BC0 rjmp L51
01E2 .dbline 160
01E2 ; {
01E2 .dbline 161
01E2 ; if (++timercount > 200) quit(); //200*15ms/ = 3s
01E2 8A81 ldd R24,y+2
01E4 8F5F subi R24,255 ; addi 1
01E6 282E mov R2,R24
01E8 2A82 std y+2,R2
01EA 88EC ldi R24,200
01EC 8215 cp R24,R2
01EE 08F4 brsh L53
01F0 .dbline 161
01F0 ADDF xcall _quit
01F2 L53:
01F2 .dbline 162
01F2 ; TIFR = TIFR|0x02;
01F2 86B7 in R24,0x36
01F4 8260 ori R24,2
01F6 86BF out 0x36,R24
01F8 .dbline 163
01F8 ; }
01F8 L51:
01F8 .dbline 164
01F8 L47:
01F8 .dbline 156
01F8 EBCF xjmp L46
01FA L55:
01FA .dbline 167
01FA ; }
01FA ; //每秒向PC机发送一个控制字符"C",等待控制字〈soh〉
01FA ; while(uart_getchar()!=XMODEM_SOH) //receive/ the start of Xmodem
01FA ; {
01FA .dbline 168
01FA ; if(TIFR & 0x02) //timer0/ over flow
01FA 26B6 in R2,0x36
01FC 21FE sbrs R2,1
01FE 0EC0 rjmp L58
0200 .dbline 169
0200 ; {
0200 .dbline 170
0200 ; if(++timercount > 67) //wait/ about 1 second
0200 8A81 ldd R24,y+2
0202 8F5F subi R24,255 ; addi 1
0204 282E mov R2,R24
0206 2A82 std y+2,R2
0208 83E4 ldi R24,67
020A 8215 cp R24,R2
020C 20F4 brsh L60
020E .dbline 171
020E ; {
020E .dbline 172
020E ; uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); //send/ a "C"
020E 03E4 ldi R16,67
0210 54DF xcall _uart_putchar
0212 .dbline 173
0212 ; timercount=0;
0212 0024 clr R0
0214 0A82 std y+2,R0
0216 .dbline 174
0216 ; }
0216 L60:
0216 .dbline 175
0216 ; TIFR=TIFR | 0x02;
0216 86B7 in R24,0x36
0218 8260 ori R24,2
021A 86BF out 0x36,R24
021C .dbline 176
021C ; }
021C L58:
021C .dbline 177
021C L56:
021C .dbline 166
021C 52DF xcall _uart_getchar
021E 0130 cpi R16,1
0220 E0E0 ldi R30,0
0222 1E07 cpc R17,R30
0224 51F7 brne L55
0226 L62:
0226 .dbline 180
0226 ; }
0226 ; //开始接收数据块
0226 ; do
0226 ; {
0226 .dbline 181
0226 ; if ((packNO == uart_waitchar()) && (packNO ==(~uart_waitchar())))
0226 5CDF xcall _uart_waitchar
0228 E016 cp R14,R16
022A 09F0 breq X2
022C 5AC0 xjmp L65
022E X2:
022E 58DF xcall _uart_waitchar
0230 202E mov R2,R16
0232 2094 com R2
0234 E214 cp R14,R2
0236 09F0 breq X3
0238 54C0 xjmp L65
023A X3:
023A .dbline 182
023A ; { //核对数据块编号正确
023A .dbline 183
023A ; for(i=0;i<128;i++) //接收128个字节数据
023A 0024 clr R0
023C 1124 clr R1
023E 1982 std y+1,R1
0240 0882 std y+0,R0
0242 L67:
0242 .dbline 184
0242 .dbline 185
0242 4EDF xcall _uart_waitchar
0244 80E0 ldi R24,<_data
0246 90E0 ldi R25,>_data
0248 F601 movw R30,R12
024A E80F add R30,R24
024C F91F adc R31,R25
024E 0083 std z+0,R16
0250 .dbline 186
0250 C601 movw R24,R12
0252 0196 adiw R24,1
0254 6C01 movw R12,R24
0256 .dbline 187
0256 L68:
0256 .dbline 183
0256 8881 ldd R24,y+0
0258 9981 ldd R25,y+1
025A 0196 adiw R24,1
025C 9983 std y+1,R25
025E 8883 std y+0,R24
0260 .dbline 183
0260 8038 cpi R24,128
0262 E0E0 ldi R30,0
0264 9E07 cpc R25,R30
0266 6CF3 brlt L67
0268 .dbline 188
0268 ; {
0268 ; data[bufferPoint]= uart_waitchar();
0268 ; bufferPoint++;
0268 ; }
0268 ; crc = (uart_waitchar()<<8);
0268 3BDF xcall _uart_waitchar
026A A02E mov R10,R16
026C BB24 clr R11
026E BA2C mov R11,R10
0270 AA24 clr R10
0272 .dbline 189
0272 ; crc += uart_waitchar(); //接收2个字节的CRC效验字
0272 36DF xcall _uart_waitchar
0274 202E mov R2,R16
0276 3324 clr R3
0278 A20C add R10,R2
027A B31C adc R11,R3
027C .dbline 190
027C ; if(calcrc(&data[bufferPoint-128],128)==crc) //CRC/校验验证
027C 20E8 ldi R18,128
027E 30E0 ldi R19,0
0280 80E0 ldi R24,<_data-128
0282 90E0 ldi R25,>_data-128
0284 8601 movw R16,R12
0286 080F add R16,R24
0288 191F adc R17,R25
028A 35DF xcall _calcrc
028C 0A15 cp R16,R10
028E 1B05 cpc R17,R11
0290 29F5 brne L71
0292 .dbline 191
0292 ; { //正确接收128个字节数据
0292 1BC0 xjmp L75
0294 L74:
0294 .dbline 193
0294 .dbline 194
0294 D7DE xcall _write_one_page
0296 .dbline 195
0296 40E0 ldi R20,0
0298 51E0 ldi R21,1
029A 60E0 ldi R22,0
029C 70E0 ldi R23,0
029E 40900200 lds R4,_address+2
02A2 50900300 lds R5,_address+2+1
02A6 20900000 lds R2,_address
02AA 30900100 lds R3,_address+1
02AE 240E add R2,R20
02B0 351E adc R3,R21
02B2 461E adc R4,R22
02B4 571E adc R5,R23
02B6 30920100 sts _address+1,R3
02BA 20920000 sts _address,R2
02BE 50920300 sts _address+2+1,R5
02C2 40920200 sts _address+2,R4
02C6 .dbline 196
02C6 CC24 clr R12
02C8 DD24 clr R13
02CA .dbline 197
02CA L75:
02CA .dbline 192
02CA ; while(bufferPoint >= SPM_PAGESIZE)
02CA C601 movw R24,R12
02CC 8030 cpi R24,0
02CE E1E0 ldi R30,1
02D0 9E07 cpc R25,R30
02D2 04F7 brge L74
02D4 .dbline 198
02D4 ; { //正确接受256个字节的数据
02D4 ; write_one_page(); //收到256字节写入一页Flash中
02D4 ; address += SPM_PAGESIZE; //Flash/页加1
02D4 ; bufferPoint = 0;
02D4 ; }
02D4 ; uart_putchar(XMODEM_ACK); //正确收到一个数据块
02D4 06E0 ldi R16,6
02D6 F1DE xcall _uart_putchar
02D8 .dbline 199
02D8 ; packNO++; //数据块编号加1
02D8 E394 inc R14
02DA .dbline 200
02DA ; }
02DA 05C0 xjmp L66
02DC L71:
02DC .dbline 202
02DC ; else
02DC ; {
02DC .dbline 203
02DC ; uart_putchar(XMODEM_NAK); //要求重发数据块
02DC 05E1 ldi R16,21
02DE EDDE xcall _uart_putchar
02E0 .dbline 204
02E0 ; }
02E0 .dbline 205
02E0 ; }
02E0 02C0 xjmp L66
02E2 L65:
02E2 .dbline 207
02E2 ; else
02E2 ; {
02E2 .dbline 208
02E2 ; uart_putchar(XMODEM_NAK); //要求重发数据块
02E2 05E1 ldi R16,21
02E4 EADE xcall _uart_putchar
02E6 .dbline 209
02E6 ; }
02E6 L66:
02E6 .dbline 210
02E6 L63:
02E6 .dbline 210
02E6 ; }while(uart_waitchar()!=XMODEM_EOT); //循环接收,直到全部发完
02E6 FCDE xcall _uart_waitchar
02E8 0430 cpi R16,4
02EA 09F0 breq X4
02EC 9CCF xjmp L62
02EE X4:
02EE .dbline 211
02EE ; uart_putchar(XMODEM_ACK); //通知PC机全部收到
02EE 06E0 ldi R16,6
02F0 E4DE xcall _uart_putchar
02F2 .dbline 213
02F2 ;
02F2 ; if(bufferPoint) write_one_page(); //把剩余的数据写入Flash中
02F2 CC20 tst R12
02F4 11F4 brne X1
02F6 DD20 tst R13
02F8 09F0 breq L77
02FA X1:
02FA .dbline 213
02FA A4DE xcall _write_one_page
02FC L77:
02FC .dbline 214
02FC ; quit(); //退出Bootloader程序,从0x0000处执行应用程序
02FC 27DF xcall _quit
02FE .dbline -2
02FE .dbline 215
02FE ; }
02FE L42:
02FE 2396 adiw R28,3
0300 .dbline 0 ; func end
0300 0895 ret
0302 .dbsym l timercount 2 c
0302 .dbsym r crc 10 i
0302 .dbsym r packNO 14 c
0302 .dbsym l i 0 I
0302 .dbsym r bufferPoint 12 I
0302 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
0000 _data::
0000 .blkb 256
0100 .dbsym e data _data A[256:256]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -