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

📄 stk500i.lst

📁 文档里面的代码是可以正常使用的
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0499) 					polling_address = (address&0xFFFF)*2;
    0479 EF4F      LDI	R20,0xFF
    047A EF5F      LDI	R21,0xFF
    047B E060      LDI	R22,0
    047C E070      LDI	R23,0
    047D 9040010E  LDS	R4,address+2
    047F 9050010F  LDS	R5,address+3
    0481 9020010C  LDS	R2,address
    0483 9030010D  LDS	R3,address+1
    0485 2224      AND	R2,R20
    0486 2235      AND	R3,R21
    0487 2246      AND	R4,R22
    0488 2257      AND	R5,R23
    0489 E042      LDI	R20,2
    048A E050      LDI	R21,0
    048B E060      LDI	R22,0
    048C E070      LDI	R23,0
    048D 925A      ST	R5,-Y
    048E 924A      ST	R4,-Y
    048F 923A      ST	R3,-Y
    0490 922A      ST	R2,-Y
    0491 018A      MOVW	R16,R20
    0492 019B      MOVW	R18,R22
    0493 D580      RCALL	empy32s
    0494 01FE      MOVW	R30,R28
    0495 8302      STD	Z+2,R16
    0496 8313      STD	Z+3,R17
    0497 8324      STD	Z+4,R18
    0498 8335      STD	Z+5,R19
(0500) 					if(i&1) polling_address++;
    0499 FEC0      SBRS	R12,0
    049A C012      RJMP	0x04AD
    049B E041      LDI	R20,1
    049C E050      LDI	R21,0
    049D E060      LDI	R22,0
    049E E070      LDI	R23,0
    049F 01FE      MOVW	R30,R28
    04A0 8022      LDD	R2,Z+2
    04A1 8033      LDD	R3,Z+3
    04A2 8044      LDD	R4,Z+4
    04A3 8055      LDD	R5,Z+5
    04A4 0E24      ADD	R2,R20
    04A5 1E35      ADC	R3,R21
    04A6 1E46      ADC	R4,R22
    04A7 1E57      ADC	R5,R23
    04A8 01FE      MOVW	R30,R28
    04A9 8222      STD	Z+2,R2
    04AA 8233      STD	Z+3,R3
    04AB 8244      STD	Z+4,R4
    04AC 8255      STD	Z+5,R5
(0501) 				}
(0502) 				
(0503) 				//increment (word) address only when we have an uneven (byte) address
(0504) 				if(i&1) address++;
    04AD FEC0      SBRS	R12,0
    04AE C018      RJMP	0x04C7
    04AF E041      LDI	R20,1
    04B0 E050      LDI	R21,0
    04B1 E060      LDI	R22,0
    04B2 E070      LDI	R23,0
    04B3 9040010E  LDS	R4,address+2
    04B5 9050010F  LDS	R5,address+3
    04B7 9020010C  LDS	R2,address
    04B9 9030010D  LDS	R3,address+1
    04BB 0E24      ADD	R2,R20
    04BC 1E35      ADC	R3,R21
    04BD 1E46      ADC	R4,R22
    04BE 1E57      ADC	R5,R23
    04BF 9230010D  STS	address+1,R3
    04C1 9220010C  STS	address,R2
    04C3 9250010F  STS	address+3,R5
    04C5 9240010E  STS	address+2,R4
    04C7 01C6      MOVW	R24,R12
    04C8 9601      ADIW	R24,1
    04C9 016C      MOVW	R12,R24
    04CA 14CA      CP	R12,R10
    04CB 04DB      CPC	R13,R11
    04CC F408      BCC	0x04CE
    04CD CF7B      RJMP	0x0449
(0505) 			}
(0506) 			
(0507) 			//If this page is complete the bit 7 of mode will be set and we programm the page
(0508) 			if(mode&0x80)
    04CE FEE7      SBRS	R14,7
    04CF C077      RJMP	0x0547
(0509) 			{
(0510) 				spi_transfer_8(msg_buffer[6]);								
    04D0 9100011A  LDS	R16,0x11A
    04D2 D4C8      RCALL	_spi_transfer_8
(0511) 				spi_transfer_16(start_address&0xFFFF);
    04D3 EF4F      LDI	R20,0xFF
    04D4 EF5F      LDI	R21,0xFF
    04D5 E060      LDI	R22,0
    04D6 E070      LDI	R23,0
    04D7 01FE      MOVW	R30,R28
    04D8 8026      LDD	R2,Z+6
    04D9 8037      LDD	R3,Z+7
    04DA 8440      LDD	R4,Z+8
    04DB 8451      LDD	R5,Z+9
    04DC 2224      AND	R2,R20
    04DD 2235      AND	R3,R21
    04DE 2246      AND	R4,R22
    04DF 2257      AND	R5,R23
    04E0 0181      MOVW	R16,R2
    04E1 D4BF      RCALL	_spi_transfer_16
(0512) 				spi_transfer_8(0);
    04E2 2700      CLR	R16
    04E3 D4B7      RCALL	_spi_transfer_8
(0513) 				
(0514) 				//If we have no valid polling address switch to simple wait mode
(0515) 				if(polling_address==0)
    04E4 E040      LDI	R20,0
    04E5 E050      LDI	R21,0
    04E6 E060      LDI	R22,0
    04E7 E070      LDI	R23,0
    04E8 01FE      MOVW	R30,R28
    04E9 8022      LDD	R2,Z+2
    04EA 8033      LDD	R3,Z+3
    04EB 8044      LDD	R4,Z+4
    04EC 8055      LDD	R5,Z+5
    04ED 1624      CP	R2,R20
    04EE 0635      CPC	R3,R21
    04EF 0646      CPC	R4,R22
    04F0 0657      CPC	R5,R23
    04F1 F421      BNE	0x04F6
(0516) 				{
(0517) 					mode = (mode&(~0x70)) | 0x10;
    04F2 2D8E      MOV	R24,R14
    04F3 788F      ANDI	R24,0x8F
    04F4 6180      ORI	R24,0x10
    04F5 2EE8      MOV	R14,R24
(0518) 				}
(0519) 				
(0520) 				//Different polling methods
(0521) 				//Hard waiting
(0522) 				if((mode&0x70) == 0x10)
    04F6 2D8E      MOV	R24,R14
    04F7 7780      ANDI	R24,0x70
    04F8 3180      CPI	R24,0x10
    04F9 F429      BNE	0x04FF
(0523) 				{
(0524) 					wait_ms(msg_buffer[4]);
    04FA 91000118  LDS	R16,0x118
    04FC 2711      CLR	R17
    04FD DB56      RCALL	_wait_ms
(0525) 				}
    04FE C048      RJMP	0x0547
(0526) 				//Data polling
(0527) 				else if((mode&0x70) == 0x20)
    04FF 2D8E      MOV	R24,R14
    0500 7780      ANDI	R24,0x70
    0501 3280      CPI	R24,0x20
    0502 F009      BEQ	0x0504
    0503 C033      RJMP	0x0537
(0528) 				{
(0529) 					do{
(0530) 						//If we have an uneven byte read the
(0531) 						//high byte			
(0532) 						if(polling_address%2)
    0504 E041      LDI	R20,1
    0505 E050      LDI	R21,0
    0506 E060      LDI	R22,0
    0507 E070      LDI	R23,0
    0508 01FE      MOVW	R30,R28
    0509 8022      LDD	R2,Z+2
    050A 8033      LDD	R3,Z+3
    050B 8044      LDD	R4,Z+4
    050C 8055      LDD	R5,Z+5
    050D 2224      AND	R2,R20
    050E 2235      AND	R3,R21
    050F 2246      AND	R4,R22
    0510 2257      AND	R5,R23
    0511 E040      LDI	R20,0
    0512 E050      LDI	R21,0
    0513 E060      LDI	R22,0
    0514 E070      LDI	R23,0
    0515 1624      CP	R2,R20
    0516 0635      CPC	R3,R21
    0517 0646      CPC	R4,R22
    0518 0657      CPC	R5,R23
    0519 F029      BEQ	0x051F
(0533) 						{
(0534) 							spi_transfer_8(msg_buffer[7]|(1<<3));
    051A 9100011B  LDS	R16,0x11B
    051C 6008      ORI	R16,0x8
    051D D47D      RCALL	_spi_transfer_8
(0535) 						}
    051E C003      RJMP	0x0522
(0536) 						else
(0537) 						{
(0538) 							spi_transfer_8(msg_buffer[7]);
    051F 9100011B  LDS	R16,0x11B
    0521 D479      RCALL	_spi_transfer_8
(0539) 						}
(0540) 						spi_transfer_16(polling_address/2);
    0522 01FE      MOVW	R30,R28
    0523 8022      LDD	R2,Z+2
    0524 8033      LDD	R3,Z+3
    0525 8044      LDD	R4,Z+4
    0526 8055      LDD	R5,Z+5
    0527 9456      LSR	R5
    0528 9447      ROR	R4
    0529 9437      ROR	R3
    052A 9427      ROR	R2
    052B 0181      MOVW	R16,R2
    052C D474      RCALL	_spi_transfer_16
(0541) 						tmp=spi_transfer_8(0x00);
    052D 2700      CLR	R16
    052E D46C      RCALL	_spi_transfer_8
    052F 870D      STD	Y+13,R16
(0542) 					}while(tmp==msg_buffer[8]);
    0530 9020011C  LDS	R2,0x11C
    0532 840D      LDD	R0,Y+13
    0533 1402      CP	R0,R2
    0534 F409      BNE	0x0536
    0535 CFCE      RJMP	0x0504
(0543) 				}
    0536 C010      RJMP	0x0547
(0544) 				//RDY/BSY polling
(0545) 				else if((mode&0x70) == 0x40)
    0537 2D8E      MOV	R24,R14
    0538 7780      ANDI	R24,0x70
    0539 3480      CPI	R24,0x40
    053A F441      BNE	0x0543
(0546) 				{
(0547) 					while(spi_transfer_32(0xF0000000)&1);
    053B E000      LDI	R16,0
    053C E010      LDI	R17,0
    053D E020      LDI	R18,0
    053E EF30      LDI	R19,0xF0
    053F D46D      RCALL	_spi_transfer_32
    0540 FD00      SBRC	R16,0
    0541 CFF9      RJMP	0x053B
(0548) 				}
    0542 C004      RJMP	0x0547
(0549) 				//If something was not correct with the given mode do
(0550) 				//hard waiting. Should never reach this point
(0551) 				else
(0552) 				{
(0553) 					wait_ms(msg_buffer[4]);					
    0543 91000118  LDS	R16,0x118
    0545 2711      CLR	R17
    0546 DB0D      RCALL	_wait_ms
(0554) 				}
(0555) 			}
(0556) 		}
(0557) 		
(0558) 		num_bytes = 2;
    0547 E082      LDI	R24,2
    0548 E090      LDI	R25,0
    0549 879B      STD	Y+11,R25
    054A 878A      STD	Y+10,R24
(0559) 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
    054B E183      LDI	R24,0x13
    054C 93800114  STS	msg_buffer,R24
(0560) 		msg_buffer[1] = STATUS_CMD_OK;
    054E 2422      CLR	R2
    054F 92200115  STS	msg_buffer+1,R2
(0561) 	}
    0551 C373      RJMP	0x08C5
(0562) 	//////////////////////////////////////
(0563) 	//CMD_READ_FLASH_ISP
(0564) 	//////////////////////////////////////
(0565) 	else if(cmd==CMD_READ_FLASH_ISP)
    0552 858C      LDD	R24,Y+12
    0553 3184      CPI	R24,0x14
    0554 F009      BEQ	0x0556
    0555 C066      RJMP	0x05BC
(0566) 	{
(0567) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    0556 90A00115  LDS	R10,msg_buffer+1
    0558 24BB      CLR	R11
    0559 2CBA      MOV	R11,R10
    055A 24AA      CLR	R10
(0568) 		block_size |= msg_buffer[2];
    055B 90200116  LDS	R2,msg_buffer+2
    055D 2433      CLR	R3
    055E 28A2      OR	R10,R2
    055F 28B3      OR	R11,R3
(0569) 		tmp = msg_buffer[3];
    0560 90200117  LDS	R2,msg_buffer+3
    0562 862D      STD	Y+13,R2
(0570) 		
(0571) 		for(i=0;i<block_size;i++)
    0563 24CC      CLR	R12
    0564 24DD      CLR	R13
    0565 C040      RJMP	0x05A6
(0572) 		{
(0573) 			//Select Low or High-Byte
(0574) 			if(i&1)
    0566 FEC0      SBRS	R12,0
    0567 C004      RJMP	0x056C
(0575) 			{
(0576) 				spi_transfer_8(tmp|(1<<3));
    0568 850D      LDD	R16,Y+13
    0569 6008      ORI	R16,0x8
    056A D430      RCALL	_spi_transfer_8
(0577) 			}
    056B C002      RJMP	0x056E
(0578) 			else
(0579) 			{
(0580) 				spi_transfer_8(tmp);
    056C 850D      LDD	R16,Y+13
    056D D42D      RCALL	_spi_transfer_8
(0581) 			}
(0582) 			
(0583) 			spi_transfer_16(address&0xFFFF);
    056E EF4F      LDI	R20,0xFF
    056F EF5F      LDI	R21,0xFF
    0570 E060      LDI	R22,0
    0571 E070      LDI	R23,0
    0572 9040010E  LDS	R4,address+2
    0574 9050010F  LDS	R5,address+3
    0576 9020010C  LDS	R2,address
    0578 9030010D  LDS	R3,address+1
    057A 2224      AND	R2,R20
    057B 2235      AND	R3,R21
    057C 2246      AND	R4,R22
    057D 2257      AND	R5,R23
    057E 0181      MOVW	R16,R2
    057F D421      RCALL	_spi_transfer_16
(0584) 			msg_buffer[i+2] = spi_transfer_8(0);
    0580 2700      CLR	R16
    0581 D419      RCALL	_spi_transfer_8
    0582 E184      LDI	R24,0x14
    0583 E091      LDI	R25,1
    0584 01F6      MOVW	R30,R12
    0585 9632      ADIW	R30,2
    0586 0FE8      ADD	R30,R24
    0587 1FF9      ADC	R31,R25
    0588 8300      STD	Z+0,R16
(0585) 			
(0586) 			//increment (word) address only when we have an uneven (byte) address
(0587) 			if(i&1) address++;
    0589 FEC0      SBRS	R12,0
    058A C018      RJMP	0x05A3
    058B E041      LDI	R20,1
    058C E050      LDI	R21,0
    058D E060      LDI	R22,0
    058E E070      LDI	R23,0
    058F 9040010E  LDS	R4,address+2
    0591 9050010F  LDS	R5,address+3
    0593 9020010C  LDS	R2,address
    0595 9030010D  LDS	R3,address+1
    0597 0E24      ADD	R2,R20
    0598 1E35      ADC	R3,R21
    0599 1E46      ADC	R4,R22
    059A 1E57      ADC	R5,R23
    059B 9230010D  STS	address+1,R3
    059D 9220010C  STS	address,R2
    059F 9250010F  STS	address+3,R5
    05A1 9240010E  STS	address+2,R4
    05A3 01C6      MOVW	R24,R12
    05A4 9601      ADIW	R24,1
    05A5 016C      MOVW	R12,R24
    05A6 14CA      CP	R12,R10
    05A7 04DB      CPC	R13,R11
    05A8 F408      BCC	0x05AA
    05A9 CFBC      RJMP	0x0566
(0588) 		}
(0589) 		
(0590) 		num_bytes = block_size+3;
    05AA 01C5      MOVW	R24,R10
    05AB 9603      ADIW	R24,3
    05AC 879B      STD	Y+11,R25
    05AD 878A      STD	Y+10,R24
(0591) 		msg_buffer[0] = CMD_READ_FLASH_ISP;
    05AE E184      LDI	R24,0x14
    05AF 93800114  STS	msg_buffer,R24
(0592) 		msg_buffer[1] = STATUS_CMD_OK;
    05B1 2422      CLR	R2
    05B2 92200115  STS	msg_buffer+1,R2
(0593) 		msg_buffer[block_size+2] = STATUS_CMD_OK;
    05B4 E184      LDI	R24,0x14
    05B5 E091      LDI	R25,1
    05B6 01F5      MOVW	R30,R10
    05B7 9632      ADIW	R30,2
    05B8 0FE8      ADD	R30,R24
    05B9 1FF9      ADC	R31,R25
    05BA 8220      STD	Z+0,R2
(0594) 	}
    05BB C309      RJMP	0x08C5
(0595) 	//////////////////////////////////////
(0596) 	//CMD_PROGRAM_EEPROM_ISP
(0597) 	//////////////////////////////////////
(0598) 	else if(cmd==CMD_PROGRAM_EEPROM_ISP)
    05BC 858C      LDD	R24,Y+12
    05BD 3185      CPI	R24,0x15
    05BE F009      BEQ	0x05C0
    05BF C174      RJMP	0x0734
(0599) 	{
(0600) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    05C0 90A00115  LDS	R10,msg_buffer+1
    05C2 24BB      CLR	R11
    05C3 2CBA      MOV	R11,R10
    05C4 24AA      CLR	R10
(0601) 		block_size |= msg_buffer[2];
    05C5 90200116  LDS	R2,msg_buffer+2
    05C7 2433      CLR	R3
    05C8 28A2      OR	R10,R2
    05C9 28B3      OR	R11,R3
(0602) 		mode = msg_buffer[3];
    05CA 90E00117  LDS	R14,msg_buffer+3
(0603) 		
(0604) 		//Byte Mode
(0605) 		if((mode&1) == 0)
    05CC FCE0      SBRC	R14,0
    05CD C09B      RJMP	0x0669
(0606) 		{		
(0607) 			for(i=0;i<block_size;i++)
    05CE 24CC      CLR	R12
    05CF 24DD      CLR	R13
    05D0 C093      RJMP	0x0664
(0608) 			{	
(0609) 				spi_transfer_8(msg_buffer[5]);								
    05D1 91000119  LDS	R16,0x119
    05D3 D3C7      RCALL	_spi_transfer_8
(0610) 				spi_transfer_16(address&0xFFFF);
    05D4 EF4F      LDI	R20,0xFF

⌨️ 快捷键说明

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