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

📄 bldstk500.lst

📁 使用STK500_2 协议的bootloader
💻 LST
📖 第 1 页 / 共 3 页
字号:
    1D2E 8340      STD	Z+0,R20
(0092) 			checkSum ^= rec_data;
    1D2F 90200075  LDS	R2,checkSum
    1D31 2624      EOR	R2,R20
    1D32 92200075  STS	checkSum,R2
(0093) 			if(msgCounter==msgSize)
    1D34 9020006E  LDS	R2,msgSize
    1D36 9030006F  LDS	R3,msgSize+1
    1D38 9040006A  LDS	R4,msgCounter
    1D3A 9050006B  LDS	R5,msgCounter+1
    1D3C 1442      CP	R4,R2
    1D3D 0453      CPC	R5,R3
    1D3E F491      BNE	0x1D51
(0094) 			{
(0095) 				statusMachine = ST_GET_CHECK;
    1D3F EF86      LDI	R24,0xF6
    1D40 93800070  STS	statusMachine,R24
(0096) 			}
(0097) 		}
    1D42 C00E      RJMP	0x1D51
(0098) 		else if(statusMachine == ST_GET_CHECK)
    1D43 91800070  LDS	R24,statusMachine
    1D45 3F86      CPI	R24,0xF6
    1D46 F451      BNE	0x1D51
(0099) 		{
(0100) 			if(rec_data == checkSum)
    1D47 90200075  LDS	R2,checkSum
    1D49 1542      CP	R20,R2
    1D4A F419      BNE	0x1D4E
(0101) 			{
(0102) 				packageProcess(seqNumber);
    1D4B 91000076  LDS	R16,seqNumber
    1D4D D005      RCALL	_packageProcess
(0103) 			}		
(0104) 			statusMachine = ST_START;	
    1D4E EF80      LDI	R24,0xF0
    1D4F 93800070  STS	statusMachine,R24
    1D51 CF59      RJMP	0x1CAB
    1D52 9508      RET
_packageProcess:
  temp16               --> R10
  start_address        --> Y+2
  cmd                  --> R14
  tmp                  --> Y+8
  num_bytes            --> Y+6
  i                    --> R12
  seqNum               --> Y+19
    1D53 931A      ST	R17,-Y
    1D54 930A      ST	R16,-Y
    1D55 940E1FA6  CALL	push_gset5
    1D57 9729      SBIW	R28,0x9
(0105) 		}
(0106) 	}
(0107) }
(0108) 
(0109) 	
(0110) 	
(0111) 
(0112) /**********************************************************************
(0113) functionName:void packageProcess(uint08 seqNum) 
(0114) description:数据包的处理过程
(0115) **********************************************************************/		
(0116) void packageProcess(uint08 seqNum) 
(0117) {
(0118) 	uint08 cmd;
(0119) 	uint08 tmp=0;
    1D58 2400      CLR	R0
    1D59 8608      STD	Y+8,R0
(0120) 	uint16 i;
(0121) 	uint16 num_bytes=0;
    1D5A 2411      CLR	R1
    1D5B 821F      STD	Y+7,R1
    1D5C 820E      STD	Y+6,R0
(0122) 	uint32 start_address = address;
    1D5D 9020006C  LDS	R2,address
    1D5F 9030006D  LDS	R3,address+1
    1D61 2444      CLR	R4
    1D62 2455      CLR	R5
    1D63 822A      STD	Y+2,R2
    1D64 823B      STD	Y+3,R3
    1D65 824C      STD	Y+4,R4
    1D66 825D      STD	Y+5,R5
(0123) 	
(0124) 	cmd = msg_buffer[0];
    1D67 90E00077  LDS	R14,msg_buffer
(0125) 	//命令CMD_SIGN_ON
(0126) 	if(cmd==CMD_SIGN_ON)
    1D69 2D8E      MOV	R24,R14
    1D6A 3081      CPI	R24,1
    1D6B F4B1      BNE	0x1D82
(0127) 	{
(0128) 		num_bytes = 11;
    1D6C E08B      LDI	R24,0xB
    1D6D E090      LDI	R25,0
    1D6E 839F      STD	Y+7,R25
    1D6F 838E      STD	Y+6,R24
(0129) 		msg_buffer[0] = CMD_SIGN_ON;
    1D70 E081      LDI	R24,1
    1D71 93800077  STS	msg_buffer,R24
(0130) 		msg_buffer[1] = STATUS_CMD_OK;
    1D73 2422      CLR	R2
    1D74 92200078  STS	msg_buffer+1,R2
(0131) 		msg_buffer[2] = 8;
    1D76 E088      LDI	R24,0x8
    1D77 93800079  STS	msg_buffer+2,R24
(0132) 		memcpy(msg_buffer+3,"STK500_2",8);
    1D79 8399      STD	Y+1,R25
    1D7A 8388      STD	Y+0,R24
    1D7B E621      LDI	R18,0x61
    1D7C E030      LDI	R19,0
    1D7D E70A      LDI	R16,0x7A
    1D7E E010      LDI	R17,0
    1D7F 940E1F95  CALL	_memcpy
(0133) 	}
    1D81 C180      RJMP	0x1F02
(0134) 	//命令CMD_SET_PARAMETER
(0135) 	else if(cmd==CMD_SET_PARAMETER)
    1D82 2D8E      MOV	R24,R14
    1D83 3082      CPI	R24,2
    1D84 F451      BNE	0x1D8F
(0136) 	{
(0137) 		num_bytes = 2;
    1D85 E082      LDI	R24,2
    1D86 E090      LDI	R25,0
    1D87 839F      STD	Y+7,R25
    1D88 838E      STD	Y+6,R24
(0138) 		msg_buffer[0] = CMD_SET_PARAMETER;
    1D89 93800077  STS	msg_buffer,R24
(0139) 		msg_buffer[1] = STATUS_CMD_OK;
    1D8B 2422      CLR	R2
    1D8C 92200078  STS	msg_buffer+1,R2
(0140) 	}
    1D8E C173      RJMP	0x1F02
(0141) 	//命令CMD_GET_PARAMETER
(0142) 	else if(cmd==CMD_GET_PARAMETER)
    1D8F 2D8E      MOV	R24,R14
    1D90 3083      CPI	R24,3
    1D91 F5B1      BNE	0x1DC8
(0143) 	{
(0144) 		switch(msg_buffer[1])
    1D92 90A00078  LDS	R10,msg_buffer+1
    1D94 24BB      CLR	R11
    1D95 01C5      MOVW	R24,R10
    1D96 3982      CPI	R24,0x92
    1D97 E0E0      LDI	R30,0
    1D98 079E      CPC	R25,R30
    1D99 F091      BEQ	0x1DAC
    1D9A 3984      CPI	R24,0x94
    1D9B E0E0      LDI	R30,0
    1D9C 079E      CPC	R25,R30
    1D9D F0A9      BEQ	0x1DB3
    1D9E 3985      CPI	R24,0x95
    1D9F E0E0      LDI	R30,0
    1DA0 079E      CPC	R25,R30
    1DA1 F0A1      BEQ	0x1DB6
    1DA2 3982      CPI	R24,0x92
    1DA3 E0E0      LDI	R30,0
    1DA4 079E      CPC	R25,R30
    1DA5 F09C      BLT	0x1DB9
    1DA6 01C5      MOVW	R24,R10
    1DA7 398E      CPI	R24,0x9E
    1DA8 E0E0      LDI	R30,0
    1DA9 079E      CPC	R25,R30
    1DAA F021      BEQ	0x1DAF
    1DAB C00D      RJMP	0x1DB9
(0145) 		{
(0146) 			/*case PARAM_BUILD_NUMBER_LOW:
(0147) 				tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
(0148) 				break;
(0149) 			case PARAM_BUILD_NUMBER_HIGH:
(0150) 				tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
(0151) 				break;
(0152) 			case PARAM_HW_VER:
(0153) 				tmp = CONFIG_PARAM_HW_VER;
(0154) 				break;
(0155) 			case PARAM_SW_MAJOR:
(0156) 				tmp = CONFIG_PARAM_SW_MAJOR;
(0157) 				break;*/
(0158) 			case PARAM_SW_MINOR:
(0159) 				tmp = CONFIG_PARAM_SW_MINOR;
    1DAC E084      LDI	R24,4
    1DAD 8788      STD	Y+8,R24
(0160) 				break;
    1DAE C00C      RJMP	0x1DBB
(0161) 			case PARAM_RESET_POLARITY:
(0162) 				tmp = resetPolarity;
    1DAF 90200073  LDS	R2,resetPolarity
    1DB1 8628      STD	Y+8,R2
(0163) 				break;
    1DB2 C008      RJMP	0x1DBB
(0164) 			case PARAM_VTARGET:				//目标电压
(0165) 				tmp = 50;
    1DB3 E382      LDI	R24,0x32
    1DB4 8788      STD	Y+8,R24
(0166) 				break;	
    1DB5 C005      RJMP	0x1DBB
(0167) 			case PARAM_VADJUST:
(0168) 				tmp = 50;				//参考电压
    1DB6 E382      LDI	R24,0x32
    1DB7 8788      STD	Y+8,R24
(0169) 				break;
    1DB8 C002      RJMP	0x1DBB
(0170) 			/*case PARAM_TOPCARD_DETECT:
(0171) 				tmp = TOP_CARD_STK520;
(0172) 				break;
(0173) 			case PARAM_CONTROLLER_INIT:
(0174) 				tmp = paramControllerInit;
(0175) 				break;
(0176) 			case PARAM_SCK_DURATION:
(0177) 				tmp = clockSpeed;
(0178) 				break;*/
(0179) 			default:
(0180) 				tmp = CONFIG_PARAM_SW_MAJOR;
    1DB9 E082      LDI	R24,2
    1DBA 8788      STD	Y+8,R24
(0181) 				break;		
(0182) 		}
(0183) 		num_bytes = 3;
    1DBB E083      LDI	R24,3
    1DBC E090      LDI	R25,0
    1DBD 839F      STD	Y+7,R25
    1DBE 838E      STD	Y+6,R24
(0184) 		msg_buffer[0] = CMD_GET_PARAMETER;
    1DBF 93800077  STS	msg_buffer,R24
(0185) 		msg_buffer[1] = STATUS_CMD_OK;
    1DC1 2422      CLR	R2
    1DC2 92200078  STS	msg_buffer+1,R2
(0186) 		msg_buffer[2] = tmp;
    1DC4 8408      LDD	R0,Y+8
    1DC5 92000079  STS	msg_buffer+2,R0
(0187) 	}
    1DC7 C13A      RJMP	0x1F02
(0188) 	//命令CMD_OSCCAL
(0189) 	/*else if(cmd==CMD_OSCCAL)
(0190) 	{
(0191) 		num_bytes = 2;
(0192) 		msg_buffer[0] = CMD_OSCCAL;
(0193) 		msg_buffer[1] = STATUS_CMD_OK;
(0194) 	}*/
(0195) 	//命令CMD_LOAD_ADDRESS
(0196) 	else if(cmd==CMD_LOAD_ADDRESS)
    1DC8 2D8E      MOV	R24,R14
    1DC9 3086      CPI	R24,6
    1DCA F549      BNE	0x1DF4
(0197) 	{
(0198) 		//address =  ((unsigned long)msg_buffer[1])<<24;
(0199) 		//address |= ((unsigned long)msg_buffer[2])<<16;
(0200) 		address = ((unsigned long)msg_buffer[3])<<8;
    1DCB E088      LDI	R24,0x8
    1DCC E090      LDI	R25,0
    1DCD 9100007A  LDS	R16,msg_buffer+3
    1DCF 2711      CLR	R17
    1DD0 2722      CLR	R18
    1DD1 2733      CLR	R19
    1DD2 938A      ST	R24,-Y
    1DD3 940E1FC5  CALL	lsl32
    1DD5 9310006D  STS	address+1,R17
    1DD7 9300006C  STS	address,R16
(0201) 		address |= ((unsigned long)msg_buffer[4]);
    1DD9 9020007B  LDS	R2,0x7B
    1DDB 2433      CLR	R3
    1DDC 2444      CLR	R4
    1DDD 2455      CLR	R5
    1DDE 0138      MOVW	R6,R16
    1DDF 2488      CLR	R8
    1DE0 2499      CLR	R9
    1DE1 2862      OR	R6,R2
    1DE2 2873      OR	R7,R3
    1DE3 2884      OR	R8,R4
    1DE4 2895      OR	R9,R5
    1DE5 9270006D  STS	address+1,R7
    1DE7 9260006C  STS	address,R6
(0202) 		num_bytes = 2;
    1DE9 E082      LDI	R24,2
    1DEA E090      LDI	R25,0
    1DEB 839F      STD	Y+7,R25
    1DEC 838E      STD	Y+6,R24
(0203) 		msg_buffer[0] = CMD_LOAD_ADDRESS;
    1DED E086      LDI	R24,6
    1DEE 93800077  STS	msg_buffer,R24
(0204) 		msg_buffer[1] = STATUS_CMD_OK;
    1DF0 2422      CLR	R2
    1DF1 92200078  STS	msg_buffer+1,R2
(0205) 	}
    1DF3 C10E      RJMP	0x1F02
(0206) 	//CMD_CHIP_ERASE_ISP
(0207) 	else if(cmd==CMD_CHIP_ERASE_ISP)
    1DF4 2D8E      MOV	R24,R14
    1DF5 3182      CPI	R24,0x12
    1DF6 F459      BNE	0x1E02
(0208) 	{		
(0209) 		num_bytes = 2;
    1DF7 E082      LDI	R24,2
    1DF8 E090      LDI	R25,0
    1DF9 839F      STD	Y+7,R25
    1DFA 838E      STD	Y+6,R24
(0210) 		msg_buffer[0] = CMD_CHIP_ERASE_ISP;
    1DFB E182      LDI	R24,0x12
    1DFC 93800077  STS	msg_buffer,R24
(0211) 		msg_buffer[1] = STATUS_CMD_OK;		
    1DFE 2422      CLR	R2
    1DFF 92200078  STS	msg_buffer+1,R2
(0212) 	}
    1E01 C100      RJMP	0x1F02
(0213) 	//命令CMD_ENTER_PROGMODE_ISP
(0214) 	else if(cmd == CMD_ENTER_PROGMODE_ISP)
    1E02 2D8E      MOV	R24,R14
    1E03 3180      CPI	R24,0x10
    1E04 F459      BNE	0x1E10
(0215) 	{
(0216) 		num_bytes = 2;
    1E05 E082      LDI	R24,2
    1E06 E090      LDI	R25,0
    1E07 839F      STD	Y+7,R25
    1E08 838E      STD	Y+6,R24
(0217) 		msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
    1E09 E180      LDI	R24,0x10
    1E0A 93800077  STS	msg_buffer,R24
(0218) 		msg_buffer[1] = STATUS_CMD_OK;
    1E0C 2422      CLR	R2
    1E0D 92200078  STS	msg_buffer+1,R2
(0219) 	}
    1E0F C0F2      RJMP	0x1F02
(0220) 	//命令 CMD_LEAVE_PROGMODE_ISP
(0221) 	else if(cmd==CMD_LEAVE_PROGMODE_ISP)
    1E10 2D8E      MOV	R24,R14
    1E11 3181      CPI	R24,0x11
    1E12 F491      BNE	0x1E25
(0222) 	{
(0223) 		num_bytes = 2;
    1E13 E082      LDI	R24,2
    1E14 E090      LDI	R25,0
    1E15 839F      STD	Y+7,R25
    1E16 838E      STD	Y+6,R24
(0224) 		msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
    1E17 E181      LDI	R24,0x11
    1E18 93800077  STS	msg_buffer,R24
(0225) 		msg_buffer[1] = STATUS_CMD_OK;	
    1E1A 2422      CLR	R2
    1E1B 92200078  STS	msg_buffer+1,R2
(0226) 			
(0227) 		flag = 0;
    1E1D 92200060  STS	flag,R2
(0228) 		TCNT1 = 0x2d11;
    1E1F E29D      LDI	R25,0x2D
    1E20 BD9D      OUT	0x2D,R25
    1E21 BD8C      OUT	0x2C,R24
(0229) 		TCCR1B = 0x05;
    1E22 E085      LDI	R24,5
    1E23 BD8E      OUT	0x2E,R24
(0230) 	}
    1E24 C0DD      RJMP	0x1F02
(0231) 	//命令CMD_PROGRAM_FLASH_ISP
(0232) 	else if(cmd==CMD_PROGRAM_FLASH_ISP)
    1E25 2D8E      MOV	R24,R14
    1E26 3183      CPI	R24,0x13
    1E27 F009      BEQ	0x1E29
    1E28 C048      RJMP	0x1E71
(0233) 	{
(0234) 		uint16 temp16; 
(0235) 		boot_page_ew(address,0x03);						//擦除页
    1E29 E023      LDI	R18,3
    1E2A 9100006C  LDS	R16,address
    1E2C 9110006D  LDS	R17,address+1
    1E2E 940E1F67  CALL	_boot_page_ew
(0236) 		wait_page_rw_ok();                            	//等待擦除完成 
    1E30 940E1F74  CALL	_wait_page_rw_ok
(0237) 		for(i=0;i<(SPM_PAGESIZE<<1);i+=2)            		//将数据填入Flash缓冲页中 
    1E32 24CC      CLR	R12
    1E33 24DD      CLR	R13
    1E34 C019      RJMP	0x1E4E
(0238) 		{ 
(0239) 				temp16=msg_buffer[i+11];
    1E35 E787      LDI	R24,0x77
    1E36 E090      LDI	R25,0
    1E37 01F6      MOVW	R30,R12
    1E38 963B      ADIW	R30,0xB
    1E39 0FE8      ADD	R30,R24
    1E3A 1FF9      ADC	R31,R25
    1E3B 80A0      LDD	R10,Z+0
    1E3C 24BB      CLR	R11
(0240) 				temp16<<=8;
    1E3D 2CBA      MOV	R11,R10
    1E3E 24AA      CLR	R10
(0241) 				temp16+=msg_buffer[i+10];
    1E3F 01F6      MOVW	R30,R12
    1E40 963A      ADIW	R30,0xA
    1E41 0FE8      ADD	R30,R24
    1E42 1FF9      ADC	R31,R25
    1E43 8020      LDD	R2,Z+0
    1E44 2433      CLR	R3
    1E45 0CA2      ADD	R10,R2
    1E46 1CB3      ADC	R11,R3
(0242) 				boot_page_fill(i,temp16); 
    1E47 0195      MOVW	R18,R10
    1E48 0186      MOVW	R16,R12
    1E49 940E1F6C  CALL	_boot_page_fill
    1E4B 01C6      MOVW	R24,R12
    1E4C 9602      ADIW	R24,2
    1E4D 016C      MOVW	R12,R24
    1E4E 01C6      MOVW	R24,R12
    1E4F 3880      CPI	R24,0x80
    1E50 E0E0      LDI	R30,0
    1E51 079E      CPC	R25,R30
    1E52 F310      BCS	0x1E35
(0243)     	}
(0244) 		boot_page_ew(address,0x05);                    	//将缓冲页数据写入一个Flash页 
    1E53 E025      LDI	R18,5
    1E54 9100006C  LDS	R16,address
    1E56 9110006D  LDS	R17,address+1
    1E58 940E1F67  CALL	_boot_page_ew
(0245)     	wait_page_rw_ok();                            	//等待写入完成 
    1E5A 940E1F74  CALL	_wait_page_rw_ok
(0246) 		address+=(SPM_PAGESIZE<<1);
    1E5C 9180006C  LDS	R24,address
    1E5E 9190006D  LDS	R25,address+1
    1E60 5880      SUBI	R24,0x80
    1E61 4F9F      SBCI	R25,0xFF
    1E62 9390006D  STS	address+1,R25
    1E64 9380006C  STS	address,R24
(0247) 		num_bytes = 2;
    1E66 E082      LDI	R24,2
    1E67 E090      LDI	R25,0
    1E68 839F      STD	Y+7,R25
    1E69 838E      STD	Y+6,R24
(0248) 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
    1E6A E183      LDI	R24,0x13
    1E6B 93800077  STS	msg_buffer,R24
(0249) 		msg_buffer[1] = STATUS_CMD_OK;
    1E6D 2422      CLR	R2
    1E6E 92200078  STS	msg_buffer+1,R2
(0250) 	}
    1E70 C091      RJMP	0x1F02
(0251) 	//命令CMD_READ_FLASH_ISP
(0252) 	else if(cmd==CMD_READ_FLASH_ISP)
    1E71 2D8E      MOV	R24,R14
    1E72 3184      CPI	R24,0x14
    1E73 F591      BNE	0x1EA6
(0253) 	{
(0254) 		for(i=0;i<(SPM_PAGESIZE<<2);i++)
    1E74 24CC      CLR	R12
    1E75 24DD      CLR	R13
    1E76 C013      RJMP	0x1E8A
(0255) 		{
(0256) 			msg_buffer[i+2] = read_program_memory (address+i,0x00);
    1E77 2722      CLR	R18
    1E78 9100006C  LDS	R16,address
    1E7A 9110006D  LDS	R17,address+1
    1E7C 0D0C      ADD	R16,R12
    1E7D 1D1D      ADC	R17,R13
    1E7E 940E1F8A  CALL	_read_program_memory
    1E80 E787      LDI	R24,0x77
    1E81 E090      LDI	R25,0
    1E82 01F6      MOVW	R30,R12
    1E83 9632      ADIW	R30,2
    1E84 0FE8      ADD	R30,R24
    1E85 1FF9      ADC	R31,R25
    1E86 8300      STD	Z+0,R16
    1E87 01C6      MOVW	R24,R12
    1E88 9601      ADIW	R24,1
    1E89 016C      MOVW	R12,R24
    1E8A 01C6      MOVW	R24,R12
    1E8B 3080      CPI	R24,0
    1E8C E0E1      LDI	R30,1

⌨️ 快捷键说明

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