⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atemga128iap.lis

📁 atmega128在线升级程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 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 + -