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

📄 stk500i.lst

📁 AVR单片机,STK500下载线制作全套资料,包括程序,电路图
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0362) 		num_bytes = 2;
    02F2 E082      LDI	R24,2
    02F3 E090      LDI	R25,0
    02F4 879B      STD	Y+11,R25
    02F5 878A      STD	Y+10,R24
(0363) 		msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
    02F6 E181      LDI	R24,0x11
    02F7 93800074  STS	msg_buffer,R24
(0364) 		msg_buffer[1] = STATUS_CMD_OK;		
    02F9 2422      CLR	R2
    02FA 92200075  STS	msg_buffer+1,R2
(0365) 	}
    02FC C55D      RJMP	0x085A
(0366) 	//////////////////////////////////////
(0367) 	//CMD_CHIP_ERASE_ISP
(0368) 	//////////////////////////////////////
(0369) 	else if(cmd==CMD_CHIP_ERASE_ISP)
    02FD 858C      LDD	R24,Y+12
    02FE 3182      CPI	R24,0x12
    02FF F539      BNE	0x0327
(0370) 	{
(0371) 		spi_transfer_8(msg_buffer[3]);
    0300 91000077  LDS	R16,msg_buffer+3
    0302 D5EE      RCALL	_spi_transfer_8
(0372) 		spi_transfer_8(msg_buffer[4]);
    0303 91000078  LDS	R16,0x78
    0305 D5EB      RCALL	_spi_transfer_8
(0373) 		spi_transfer_8(msg_buffer[5]);
    0306 91000079  LDS	R16,0x79
    0308 D5E8      RCALL	_spi_transfer_8
(0374) 		spi_transfer_8(msg_buffer[6]);
    0309 9100007A  LDS	R16,0x7A
    030B D5E5      RCALL	_spi_transfer_8
(0375) 		
(0376) 		//Newer AVR's seems to have a busy bit
(0377) 		//cant test this because I don't have any of these new chips
(0378) 		if(msg_buffer[2]==0)
    030C 90200076  LDS	R2,msg_buffer+2
    030E 2022      TST	R2
    030F F429      BNE	0x0315
(0379) 		{
(0380) 			wait_ms(msg_buffer[1]);
    0310 91000075  LDS	R16,msg_buffer+1
    0312 2711      CLR	R17
    0313 DD48      RCALL	_wait_ms
(0381) 		}
    0314 C007      RJMP	0x031C
(0382) 		else //if(msg_buffer[2]==1)
(0383) 		{
(0384) 			while(spi_transfer_32(0xF0000000)&1);
    0315 E000      LDI	R16,0
    0316 E010      LDI	R17,0
    0317 E020      LDI	R18,0
    0318 EF30      LDI	R19,0xF0
    0319 D5E8      RCALL	_spi_transfer_32
    031A FD00      SBRC	R16,0
    031B CFF9      RJMP	0x0315
(0385) 		}		
(0386) 				
(0387) 		num_bytes = 2;
    031C E082      LDI	R24,2
    031D E090      LDI	R25,0
    031E 879B      STD	Y+11,R25
    031F 878A      STD	Y+10,R24
(0388) 		msg_buffer[0] = CMD_CHIP_ERASE_ISP;
    0320 E182      LDI	R24,0x12
    0321 93800074  STS	msg_buffer,R24
(0389) 		msg_buffer[1] = STATUS_CMD_OK;		
    0323 2422      CLR	R2
    0324 92200075  STS	msg_buffer+1,R2
(0390) 	}
    0326 C533      RJMP	0x085A
(0391) 	//////////////////////////////////////
(0392) 	//CMD_PROGRAM_FLASH_ISP
(0393) 	//////////////////////////////////////
(0394) 	else if(cmd==CMD_PROGRAM_FLASH_ISP)
    0327 858C      LDD	R24,Y+12
    0328 3183      CPI	R24,0x13
    0329 F009      BEQ	0x032B
    032A C1BC      RJMP	0x04E7
(0395) 	{
(0396) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    032B 90A00075  LDS	R10,msg_buffer+1
    032D 24BB      CLR	R11
    032E 2CBA      MOV	R11,R10
    032F 24AA      CLR	R10
(0397) 		block_size |= msg_buffer[2];
    0330 90200076  LDS	R2,msg_buffer+2
    0332 2433      CLR	R3
    0333 28A2      OR	R10,R2
    0334 28B3      OR	R11,R3
(0398) 		mode = msg_buffer[3];
    0335 90E00077  LDS	R14,msg_buffer+3
(0399) 		
(0400) 		//Word Mode
(0401) 		if((mode&1) == 0)
    0337 FCE0      SBRC	R14,0
    0338 C0A2      RJMP	0x03DB
(0402) 		{		
(0403) 			for(i=0;i<block_size;i++)
    0339 24CC      CLR	R12
    033A 24DD      CLR	R13
    033B C09A      RJMP	0x03D6
(0404) 			{	
(0405) 				//If we have an uneven byte programm the
(0406) 				//high byte			
(0407) 				if(i&1)
    033C FEC0      SBRS	R12,0
    033D C005      RJMP	0x0343
(0408) 				{
(0409) 					spi_transfer_8(msg_buffer[5]|(1<<3));
    033E 91000079  LDS	R16,0x79
    0340 6008      ORI	R16,0x8
    0341 D5AF      RCALL	_spi_transfer_8
(0410) 				}
    0342 C003      RJMP	0x0346
(0411) 				else
(0412) 				{
(0413) 					spi_transfer_8(msg_buffer[5]);
    0343 91000079  LDS	R16,0x79
    0345 D5AB      RCALL	_spi_transfer_8
(0414) 				}
(0415) 				
(0416) 				spi_transfer_16(address&0xFFFF);
    0346 EF4F      LDI	R20,0xFF
    0347 EF5F      LDI	R21,0xFF
    0348 E060      LDI	R22,0
    0349 E070      LDI	R23,0
    034A 9040006E  LDS	R4,address+2
    034C 9050006F  LDS	R5,address+3
    034E 9020006C  LDS	R2,address
    0350 9030006D  LDS	R3,address+1
    0352 2224      AND	R2,R20
    0353 2235      AND	R3,R21
    0354 2246      AND	R4,R22
    0355 2257      AND	R5,R23
    0356 0181      MOVW	R16,R2
    0357 D59E      RCALL	_spi_transfer_16
(0417) 				spi_transfer_8(msg_buffer[i+10]);
    0358 E784      LDI	R24,0x74
    0359 E090      LDI	R25,0
    035A 01F6      MOVW	R30,R12
    035B 963A      ADIW	R30,0xA
    035C 0FE8      ADD	R30,R24
    035D 1FF9      ADC	R31,R25
    035E 8100      LDD	R16,Z+0
    035F D591      RCALL	_spi_transfer_8
(0418) 				
(0419) 				//Check if we can do polling
(0420) 				if(msg_buffer[8]!=msg_buffer[i+10])
    0360 E784      LDI	R24,0x74
    0361 E090      LDI	R25,0
    0362 01F6      MOVW	R30,R12
    0363 963A      ADIW	R30,0xA
    0364 0FE8      ADD	R30,R24
    0365 1FF9      ADC	R31,R25
    0366 8020      LDD	R2,Z+0
    0367 9030007C  LDS	R3,0x7C
    0369 1432      CP	R3,R2
    036A F0B1      BEQ	0x0381
(0421) 				{
(0422) 					polling_address = address&0xFFFF;
    036B EF4F      LDI	R20,0xFF
    036C EF5F      LDI	R21,0xFF
    036D E060      LDI	R22,0
    036E E070      LDI	R23,0
    036F 9040006E  LDS	R4,address+2
    0371 9050006F  LDS	R5,address+3
    0373 9020006C  LDS	R2,address
    0375 9030006D  LDS	R3,address+1
    0377 2224      AND	R2,R20
    0378 2235      AND	R3,R21
    0379 2246      AND	R4,R22
    037A 2257      AND	R5,R23
    037B 01FE      MOVW	R30,R28
    037C 8222      STD	Z+2,R2
    037D 8233      STD	Z+3,R3
    037E 8244      STD	Z+4,R4
    037F 8255      STD	Z+5,R5
(0423) 				}
    0380 C004      RJMP	0x0385
(0424) 				//If not switch the mode hard waiting
(0425) 				else
(0426) 				{
(0427) 					mode = (mode&(~0x0E)) | 0x02;
    0381 2D8E      MOV	R24,R14
    0382 7F81      ANDI	R24,0xF1
    0383 6082      ORI	R24,2
    0384 2EE8      MOV	R14,R24
(0428) 				}
(0429) 				
(0430) 				//Different polling methods
(0431) 				//Hard waiting
(0432) 				if((mode&0x0E) == 0x02)
    0385 2D8E      MOV	R24,R14
    0386 708E      ANDI	R24,0xE
    0387 3082      CPI	R24,2
    0388 F429      BNE	0x038E
(0433) 				{
(0434) 					wait_ms(msg_buffer[4]);
    0389 91000078  LDS	R16,0x78
    038B 2711      CLR	R17
    038C DCCF      RCALL	_wait_ms
(0435) 				}
    038D C02B      RJMP	0x03B9
(0436) 				//Data polling
(0437) 				else if((mode&0x0E) == 0x04)
    038E 2D8E      MOV	R24,R14
    038F 708E      ANDI	R24,0xE
    0390 3084      CPI	R24,4
    0391 F4B9      BNE	0x03A9
(0438) 				{
(0439) 					do{
(0440) 						//If we have an uneven byte read the
(0441) 						//high byte			
(0442) 						if(i&1)
    0392 FEC0      SBRS	R12,0
    0393 C005      RJMP	0x0399
(0443) 						{
(0444) 							spi_transfer_8(msg_buffer[7]|(1<<3));
    0394 9100007B  LDS	R16,0x7B
    0396 6008      ORI	R16,0x8
    0397 D559      RCALL	_spi_transfer_8
(0445) 						}
    0398 C003      RJMP	0x039C
(0446) 						else
(0447) 						{
(0448) 							spi_transfer_8(msg_buffer[7]);
    0399 9100007B  LDS	R16,0x7B
    039B D555      RCALL	_spi_transfer_8
(0449) 						}
(0450) 						spi_transfer_16(polling_address);
    039C 01FE      MOVW	R30,R28
    039D 8102      LDD	R16,Z+2
    039E 8113      LDD	R17,Z+3
    039F D556      RCALL	_spi_transfer_16
(0451) 						tmp=spi_transfer_8(0x00);
    03A0 2700      CLR	R16
    03A1 D54F      RCALL	_spi_transfer_8
    03A2 870D      STD	Y+13,R16
(0452) 					}while(tmp==msg_buffer[8]);
    03A3 9020007C  LDS	R2,0x7C
    03A5 840D      LDD	R0,Y+13
    03A6 1402      CP	R0,R2
    03A7 F351      BEQ	0x0392
(0453) 				}
    03A8 C010      RJMP	0x03B9
(0454) 				//RDY/BSY polling
(0455) 				else if((mode&0x0E) == 0x08)
    03A9 2D8E      MOV	R24,R14
    03AA 708E      ANDI	R24,0xE
    03AB 3088      CPI	R24,0x8
    03AC F441      BNE	0x03B5
(0456) 				{
(0457) 					while(spi_transfer_32(0xF0000000)&1);
    03AD E000      LDI	R16,0
    03AE E010      LDI	R17,0
    03AF E020      LDI	R18,0
    03B0 EF30      LDI	R19,0xF0
    03B1 D550      RCALL	_spi_transfer_32
    03B2 FD00      SBRC	R16,0
    03B3 CFF9      RJMP	0x03AD
(0458) 				}
    03B4 C004      RJMP	0x03B9
(0459) 				//If something was not correct with the given mode do
(0460) 				//hard waiting. Should never reach this point
(0461) 				else
(0462) 				{
(0463) 					wait_ms(msg_buffer[4]);					
    03B5 91000078  LDS	R16,0x78
    03B7 2711      CLR	R17
    03B8 DCA3      RCALL	_wait_ms
(0464) 				}
(0465) 				
(0466) 				//increment (word) address only when we have an uneven (byte) address
(0467) 				if(i&1) address++;
    03B9 FEC0      SBRS	R12,0
    03BA C018      RJMP	0x03D3
    03BB E041      LDI	R20,1
    03BC E050      LDI	R21,0
    03BD E060      LDI	R22,0
    03BE E070      LDI	R23,0
    03BF 9040006E  LDS	R4,address+2
    03C1 9050006F  LDS	R5,address+3
    03C3 9020006C  LDS	R2,address
    03C5 9030006D  LDS	R3,address+1
    03C7 0E24      ADD	R2,R20
    03C8 1E35      ADC	R3,R21
    03C9 1E46      ADC	R4,R22
    03CA 1E57      ADC	R5,R23
    03CB 9230006D  STS	address+1,R3
    03CD 9220006C  STS	address,R2
    03CF 9250006F  STS	address+3,R5
    03D1 9240006E  STS	address+2,R4
    03D3 01C6      MOVW	R24,R12
    03D4 9601      ADIW	R24,1
    03D5 016C      MOVW	R12,R24
    03D6 14CA      CP	R12,R10
    03D7 04DB      CPC	R13,R11
    03D8 F408      BCC	0x03DA
    03D9 CF62      RJMP	0x033C
(0468) 			}			
(0469) 		}
    03DA C101      RJMP	0x04DC
(0470) 		//Page Mode
(0471) 		else
(0472) 		{
(0473) 			for(i=0;i<block_size;i++)
    03DB 24CC      CLR	R12
    03DC 24DD      CLR	R13
    03DD C081      RJMP	0x045F
(0474) 			{
(0475) 				//If we have an uneven byte programm the
(0476) 				//high byte			
(0477) 				if(i&1)
    03DE FEC0      SBRS	R12,0
    03DF C005      RJMP	0x03E5
(0478) 				{
(0479) 					spi_transfer_8(msg_buffer[5]|(1<<3));
    03E0 91000079  LDS	R16,0x79
    03E2 6008      ORI	R16,0x8
    03E3 D50D      RCALL	_spi_transfer_8
(0480) 				}
    03E4 C003      RJMP	0x03E8
(0481) 				else
(0482) 				{
(0483) 					spi_transfer_8(msg_buffer[5]);
    03E5 91000079  LDS	R16,0x79
    03E7 D509      RCALL	_spi_transfer_8
(0484) 				}
(0485) 				
(0486) 				spi_transfer_16(address&0xFFFF);
    03E8 EF4F      LDI	R20,0xFF
    03E9 EF5F      LDI	R21,0xFF
    03EA E060      LDI	R22,0
    03EB E070      LDI	R23,0
    03EC 9040006E  LDS	R4,address+2
    03EE 9050006F  LDS	R5,address+3
    03F0 9020006C  LDS	R2,address
    03F2 9030006D  LDS	R3,address+1
    03F4 2224      AND	R2,R20
    03F5 2235      AND	R3,R21
    03F6 2246      AND	R4,R22
    03F7 2257      AND	R5,R23
    03F8 0181      MOVW	R16,R2
    03F9 D4FC      RCALL	_spi_transfer_16
(0487) 				spi_transfer_8(msg_buffer[i+10]);
    03FA E784      LDI	R24,0x74
    03FB E090      LDI	R25,0
    03FC 01F6      MOVW	R30,R12
    03FD 963A      ADIW	R30,0xA
    03FE 0FE8      ADD	R30,R24
    03FF 1FF9      ADC	R31,R25
    0400 8100      LDD	R16,Z+0
    0401 D4EF      RCALL	_spi_transfer_8
(0488) 				
(0489) 				//Check if we can do polling
(0490) 				if(msg_buffer[8]!=msg_buffer[i+10])
    0402 E784      LDI	R24,0x74
    0403 E090      LDI	R25,0
    0404 01F6      MOVW	R30,R12
    0405 963A      ADIW	R30,0xA
    0406 0FE8      ADD	R30,R24
    0407 1FF9      ADC	R31,R25
    0408 8020      LDD	R2,Z+0
    0409 9030007C  LDS	R3,0x7C
    040B 1432      CP	R3,R2
    040C F409      BNE	0x040E
    040D C034      RJMP	0x0442
(0491) 				{
(0492) 					//We have to check if we have an uneven byte. 
(0493) 					//Set the polling address to a byte address
(0494) 					//so that we can poll the right location
(0495) 					polling_address = (address&0xFFFF)*2;
    040E EF4F      LDI	R20,0xFF
    040F EF5F      LDI	R21,0xFF
    0410 E060      LDI	R22,0
    0411 E070      LDI	R23,0
    0412 9040006E  LDS	R4,address+2
    0414 9050006F  LDS	R5,address+3
    0416 9020006C  LDS	R2,address
    0418 9030006D  LDS	R3,address+1
    041A 2224      AND	R2,R20
    041B 2235      AND	R3,R21
    041C 2246      AND	R4,R22
    041D 2257      AND	R5,R23
    041E E042      LDI	R20,2
    041F E050      LDI	R21,0
    0420 E060      LDI	R22,0
    0421 E070      LDI	R23,0
    0422 925A      ST	R5,-Y
    0423 924A      ST	R4,-Y
    0424 923A      ST	R3,-Y
    0425 922A      ST	R2,-Y
    0426 018A      MOVW	R16,R20
    0427 019B      MOVW	R18,R22
    0428 D540      RCALL	empy32s
    0429 01FE      MOVW	R30,R28
    042A 8302      STD	Z+2,R16
    042B 8313      STD	Z+3,R17
    042C 8324      STD	Z+4,R18
    042D 8335      STD	Z+5,R19
(0496) 					if(i&1) polling_address++;
    042E FEC0      SBRS	R12,0
    042F C012      RJMP	0x0442
    0430 E041      LDI	R20,1
    0431 E050      LDI	R21,0
    0432 E060      LDI	R22,0
    0433 E070      LDI	R23,0
    0434 01FE      MOVW	R30,R28
    0435 8022      LDD	R2,Z+2
    0436 8033      LDD	R3,Z+3
    0437 8044      LDD	R4,Z+4
    0438 8055      LDD	R5,Z+5
    0439 0E24      ADD	R2,R20
    043A 1E35      ADC	R3,R21
    043B 1E46      ADC	R4,R22
    043C 1E57      ADC	R5,R23
    043D 01FE      MOVW	R30,R28
    043E 8222      STD	Z+2,R2
    043F 8233      STD	Z+3,R3
    0440 8244      STD	Z+4,R4
    0441 8255      STD	Z+5,R5
(0497) 				}

⌨️ 快捷键说明

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