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

📄 main.lis

📁 ATEMEL AVR128 BOOT程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 0316           ;               msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
 0316 80E1              ldi R24,16
 0318 80930000          sts _msg_buffer,R24
 031C                   .dbline 175
 031C           ;               msg_buffer[1] = STATUS_CMD_OK;
 031C 2224              clr R2
 031E 20920100          sts _msg_buffer+1,R2
 0322                   .dbline 176
 0322           ;               PORTB &= ~(1 << PB6);
 0322 C698              cbi 0x18,6
 0324                   .dbline 177
 0324           ;               }
 0324 58C1              xjmp L61
 0326           L60:
 0326                   .dbline 179
 0326           ;       //退出编程模式
 0326           ;       else if (cmd==CMD_LEAVE_PROGMODE_ISP) {
 0326 8E2D              mov R24,R14
 0328 8131              cpi R24,17
 032A 71F4              brne L63
 032C                   .dbline 179
 032C                   .dbline 180
 032C           ;               num_bytes = 2;
 032C 82E0              ldi R24,2
 032E 90E0              ldi R25,0
 0330 9F83              std y+7,R25
 0332 8E83              std y+6,R24
 0334                   .dbline 181
 0334           ;               msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
 0334 81E1              ldi R24,17
 0336 80930000          sts _msg_buffer,R24
 033A                   .dbline 182
 033A           ;               msg_buffer[1] = STATUS_CMD_OK;  
 033A 2224              clr R2
 033C 20920100          sts _msg_buffer+1,R2
 0340                   .dbline 184
 0340           ;                       
 0340           ;               flag = 0;
 0340 20920000          sts _flag,R2
 0344                   .dbline 185
 0344           ;               PORTB |= (1 << PB6);
 0344 C69A              sbi 0x18,6
 0346                   .dbline 186
 0346           ;               }
 0346 47C1              xjmp L64
 0348           L63:
 0348                   .dbline 196
 0348           ;       /*写FLASH*/
 0348           ;               /*
 0348           ;               M128一页容量为256字节,而AVRISP一帧数据为128字节。
 0348           ;               为了仿止有奇数帧出现,所以必顺每一帧写入一次。
 0348           ;               每页数据将写入两次,但是下一帧数据不能覆盖上一帧数据。
 0348           ;               整个写入过程大概如下:
 0348           ;               1、写上半页:擦除一页,写入上半页数据。
 0348           ;               2、写全部页:擦除一页,写入整个页数据。
 0348           ;               */
 0348           ;       else if (cmd==CMD_PROGRAM_FLASH_ISP) {
 0348 8E2D              mov R24,R14
 034A 8331              cpi R24,19
 034C 09F0              breq X6
 034E 9EC0              xjmp L66
 0350           X6:
 0350                   .dbline 196
 0350                   .dbline 198
 0350           ;               /*缓存合并处理*/
 0350           ;               if ((address & 0xFF) == 0x00) {                                         /*判断是否为上半页*/
 0350 4FEF              ldi R20,255
 0352 50E0              ldi R21,0
 0354 60E0              ldi R22,0
 0356 70E0              ldi R23,0
 0358 40900200          lds R4,_address+2
 035C 50900300          lds R5,_address+2+1
 0360 20900000          lds R2,_address
 0364 30900100          lds R3,_address+1
 0368 2422              and R2,R20
 036A 3522              and R3,R21
 036C 4622              and R4,R22
 036E 5722              and R5,R23
 0370 40E0              ldi R20,0
 0372 50E0              ldi R21,0
 0374 60E0              ldi R22,0
 0376 70E0              ldi R23,0
 0378 2416              cp R2,R20
 037A 3506              cpc R3,R21
 037C 4606              cpc R4,R22
 037E 5706              cpc R5,R23
 0380 09F0              breq X7
 0382 30C0              xjmp L68
 0384           X7:
 0384                   .dbline 198
 0384                   .dbline 199
 0384           ;                       boot_page_ew(address,0x03);                                             /*擦除页*/
 0384 83E0              ldi R24,3
 0386 8883              std y+0,R24
 0388 20910200          lds R18,_address+2
 038C 30910300          lds R19,_address+2+1
 0390 00910000          lds R16,_address
 0394 10910100          lds R17,_address+1
 0398 0E940000          xcall _boot_page_ew
 039C                   .dbline 200
 039C           ;                       wait_page_rw_ok();                                                              /*等待擦除完成 */
 039C 0E940000          xcall _wait_page_rw_ok
 03A0                   .dbline 202
 03A0 CC24              clr R12
 03A2 DD24              clr R13
 03A4 19C0              xjmp L73
 03A6           L70:
 03A6                   .dbline 202
 03A6                   .dbline 203
 03A6 80E0              ldi R24,<_msg_buffer
 03A8 90E0              ldi R25,>_msg_buffer
 03AA F601              movw R30,R12
 03AC 3B96              adiw R30,11
 03AE E80F              add R30,R24
 03B0 F91F              adc R31,R25
 03B2 A080              ldd R10,z+0
 03B4 BB24              clr R11
 03B6                   .dbline 204
 03B6 BA2C              mov R11,R10
 03B8 AA24              clr R10
 03BA                   .dbline 205
 03BA F601              movw R30,R12
 03BC 3A96              adiw R30,10
 03BE E80F              add R30,R24
 03C0 F91F              adc R31,R25
 03C2 2080              ldd R2,z+0
 03C4 3324              clr R3
 03C6 A20C              add R10,R2
 03C8 B31C              adc R11,R3
 03CA                   .dbline 206
 03CA 9501              movw R18,R10
 03CC 8601              movw R16,R12
 03CE 0E940000          xcall _boot_page_fill
 03D2                   .dbline 207
 03D2           L71:
 03D2                   .dbline 202
 03D2 C601              movw R24,R12
 03D4 0296              adiw R24,2
 03D6 6C01              movw R12,R24
 03D8           L73:
 03D8                   .dbline 202
 03D8           ;                       /*加载上半页数据*/
 03D8           ;                       for (i = 0; i < SPM_PAGESIZE; i += 2) {                 /*加载上半页数据*/
 03D8 C601              movw R24,R12
 03DA 8038              cpi R24,128
 03DC E0E0              ldi R30,0
 03DE 9E07              cpc R25,R30
 03E0 10F3              brlo L70
 03E2                   .dbline 208
 03E2           ;                               temp16=msg_buffer[i+11];
 03E2           ;                               temp16<<=8;
 03E2           ;                               temp16+=msg_buffer[i+10];
 03E2           ;                               boot_page_fill(i,temp16);
 03E2           ;                               }
 03E2           ;                       }
 03E2 23C0              xjmp L69
 03E4           L68:
 03E4                   .dbline 209
 03E4           ;               else {
 03E4                   .dbline 212
 03E4 CC24              clr R12
 03E6 DD24              clr R13
 03E8 1BC0              xjmp L77
 03EA           L74:
 03EA                   .dbline 212
 03EA                   .dbline 213
 03EA 80E0              ldi R24,<_msg_buffer
 03EC 90E0              ldi R25,>_msg_buffer
 03EE F601              movw R30,R12
 03F0 3B96              adiw R30,11
 03F2 E80F              add R30,R24
 03F4 F91F              adc R31,R25
 03F6 A080              ldd R10,z+0
 03F8 BB24              clr R11
 03FA                   .dbline 214
 03FA BA2C              mov R11,R10
 03FC AA24              clr R10
 03FE                   .dbline 215
 03FE F601              movw R30,R12
 0400 3A96              adiw R30,10
 0402 E80F              add R30,R24
 0404 F91F              adc R31,R25
 0406 2080              ldd R2,z+0
 0408 3324              clr R3
 040A A20C              add R10,R2
 040C B31C              adc R11,R3
 040E                   .dbline 216
 040E 9501              movw R18,R10
 0410 8601              movw R16,R12
 0412 0058              subi R16,128  ; offset = 128
 0414 1F4F              sbci R17,255
 0416 0E940000          xcall _boot_page_fill
 041A                   .dbline 217
 041A           L75:
 041A                   .dbline 212
 041A C601              movw R24,R12
 041C 0296              adiw R24,2
 041E 6C01              movw R12,R24
 0420           L77:
 0420                   .dbline 212
 0420           ;                       /*写下半页时不擦除页*/
 0420           ;                       /*加载上半页数据*/
 0420           ;                       for (i = 0; i < SPM_PAGESIZE; i += 2) {                 /*填充在后半页,完成合并*/
 0420 C601              movw R24,R12
 0422 8038              cpi R24,128
 0424 E0E0              ldi R30,0
 0426 9E07              cpc R25,R30
 0428 00F3              brlo L74
 042A                   .dbline 218
 042A           ;                               temp16=msg_buffer[i+11];
 042A           ;                               temp16<<=8;
 042A           ;                               temp16+=msg_buffer[i+10];
 042A           ;                               boot_page_fill(i + 128, temp16);
 042A           ;                               }
 042A           ;                       }
 042A           L69:
 042A                   .dbline 219
 042A           ;               boot_page_ew(address,0x05);                                                     /*将缓冲页数据写入一个Flash页 */
 042A 85E0              ldi R24,5
 042C 8883              std y+0,R24
 042E 20910200          lds R18,_address+2
 0432 30910300          lds R19,_address+2+1
 0436 00910000          lds R16,_address
 043A 10910100          lds R17,_address+1
 043E 0E940000          xcall _boot_page_ew
 0442                   .dbline 220
 0442           ;               wait_page_rw_ok();                                                                      /*等待写入完成 */
 0442 0E940000          xcall _wait_page_rw_ok
 0446                   .dbline 221
 0446           ;               address+=(SPM_PAGESIZE);
 0446 40E8              ldi R20,128
 0448 50E0              ldi R21,0
 044A 60E0              ldi R22,0
 044C 70E0              ldi R23,0
 044E 40900200          lds R4,_address+2
 0452 50900300          lds R5,_address+2+1
 0456 20900000          lds R2,_address
 045A 30900100          lds R3,_address+1
 045E 240E              add R2,R20
 0460 351E              adc R3,R21
 0462 461E              adc R4,R22
 0464 571E              adc R5,R23
 0466 30920100          sts _address+1,R3
 046A 20920000          sts _address,R2
 046E 50920300          sts _address+2+1,R5
 0472 40920200          sts _address+2,R4
 0476                   .dbline 222
 0476           ;               num_bytes = 2;
 0476 82E0              ldi R24,2
 0478 90E0              ldi R25,0
 047A 9F83              std y+7,R25
 047C 8E83              std y+6,R24
 047E                   .dbline 223
 047E           ;               msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
 047E 83E1              ldi R24,19
 0480 80930000          sts _msg_buffer,R24
 0484                   .dbline 224
 0484           ;               msg_buffer[1] = STATUS_CMD_OK;
 0484 2224              clr R2
 0486 20920100          sts _msg_buffer+1,R2
 048A                   .dbline 225
 048A           ;               }
 048A A5C0              xjmp L67
 048C           L66:
 048C                   .dbline 227
 048C           ;       //读FLASH
 048C           ;       else if (cmd==CMD_READ_FLASH_ISP) {
 048C 8E2D              mov R24,R14
 048E 8431              cpi R24,20
 0490 09F0              breq X8
 0492 4AC0              xjmp L79
 0494           X8:
 0494                   .dbline 227
 0494                   .dbline 228
 0494 CC24              clr R12
 0496 DD24              clr R13
 0498 1DC0              xjmp L84
 049A           L81:
 049A                   .dbline 228
 049A                   .dbline 229
 049A 2227              clr R18
 049C 1601              movw R2,R12
 049E 4424              clr R4
 04A0 5524              clr R5
 04A2 80900200          lds R8,_address+2
 04A6 90900300          lds R9,_address+2+1
 04AA 60900000          lds R6,_address
 04AE 70900100          lds R7,_address+1
 04B2 620C              add R6,R2
 04B4 731C              adc R7,R3
 04B6 841C              adc R8,R4
 04B8 951C              adc R9,R5
 04BA 8301              movw R16,R6
 04BC 0E940000          xcall _read_program_memory
 04C0 80E0              ldi R24,<_msg_buffer
 04C2 90E0              ldi R25,>_msg_buffer
 04C4 F601              movw R30,R12
 04C6 3296              adiw R30,2
 04C8 E80F              add R30,R24
 04CA F91F              adc R31,R25
 04CC 0083              std z+0,R16
 04CE                   .dbline 230
 04CE           L82:
 04CE                   .dbline 228
 04CE C601              movw R24,R12
 04D0 0196              adiw R24,1
 04D2 6C01              movw R12,R24
 04D4           L84:
 04D4                   .dbline 228
 04D4           ;               for(i=0;i<READ_BLOCK_SIZE;i++) {
 04D4 C601              movw R24,R12
 04D6 8030              cpi R24,0
 04D8 E1E0              ldi R30,1
 04DA 9E07              cpc R25,R30
 04DC F0F2              brlo L81
 04DE                   .dbline 231
 04DE           ;                       msg_buffer[i+2] = read_program_memory (address+i,0x00);
 04DE           ;                       }
 04DE           ;               address+=READ_BLOCK_SIZE;
 04DE 40E0              ldi R20,0
 04E0 51E0              ldi R21,1
 04E2 60E0              ldi R22,0
 04E4 70E0              ldi R23,0
 04E6 40900200          lds R4,_address+2
 04EA 50900300          lds R5,_address+2+1
 04EE 20900000          lds R2,_address
 04F2 30900100          lds R3,_address+1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -