📄 bldstk500.lst
字号:
1D3B F451 BNE 0x1D46
(0088) {
(0089) if(rec_data == checkSum)
1D3C 90200075 LDS R2,checkSum
1D3E 1542 CP R20,R2
1D3F F419 BNE 0x1D43
(0090) {
(0091) packageProcess(seqNumber);
1D40 91000076 LDS R16,seqNumber
1D42 D005 RCALL _packageProcess
(0092) }
(0093) statusMachine = ST_START;
1D43 EF80 LDI R24,0xF0
1D44 93800070 STS statusMachine,R24
1D46 CF59 RJMP 0x1CA0
1D47 9508 RET
_packageProcess:
temp16 --> R10
start_address --> Y+2
cmd --> R14
tmp --> Y+8
num_bytes --> Y+6
i --> R12
seqNum --> Y+19
1D48 931A ST R17,-Y
1D49 930A ST R16,-Y
1D4A 940E1F9E CALL push_gset5
1D4C 9729 SBIW R28,0x9
(0094) }
(0095) }
(0096) }
(0097)
(0098)
(0099)
(0100)
(0101) /**********************************************************************
(0102) functionName:void packageProcess(uint08 seqNum)
(0103) description:数据包的处理过程
(0104) **********************************************************************/
(0105) void packageProcess(uint08 seqNum)
(0106) {
(0107) uint08 cmd;
(0108) uint08 tmp=0;
1D4D 2400 CLR R0
1D4E 8608 STD Y+8,R0
(0109) uint16 i;
(0110) uint16 num_bytes=0;
1D4F 2411 CLR R1
1D50 821F STD Y+7,R1
1D51 820E STD Y+6,R0
(0111) uint32 start_address = address;
1D52 9020006C LDS R2,address
1D54 9030006D LDS R3,address+1
1D56 2444 CLR R4
1D57 2455 CLR R5
1D58 01FE MOVW R30,R28
1D59 8222 STD Z+2,R2
1D5A 8233 STD Z+3,R3
1D5B 8244 STD Z+4,R4
1D5C 8255 STD Z+5,R5
(0112)
(0113) cmd = msg_buffer[0];
1D5D 90E00077 LDS R14,msg_buffer
(0114) //命令CMD_SIGN_ON
(0115) if(cmd==CMD_SIGN_ON)
1D5F 2D8E MOV R24,R14
1D60 3081 CPI R24,1
1D61 F4B1 BNE 0x1D78
(0116) {
(0117) num_bytes = 11;
1D62 E08B LDI R24,0xB
1D63 E090 LDI R25,0
1D64 839F STD Y+7,R25
1D65 838E STD Y+6,R24
(0118) msg_buffer[0] = CMD_SIGN_ON;
1D66 E081 LDI R24,1
1D67 93800077 STS msg_buffer,R24
(0119) msg_buffer[1] = STATUS_CMD_OK;
1D69 2422 CLR R2
1D6A 92200078 STS msg_buffer+1,R2
(0120) msg_buffer[2] = 8;
1D6C E088 LDI R24,0x8
1D6D 93800079 STS msg_buffer+2,R24
(0121) memcpy(msg_buffer+3,"STK500_2",8);
1D6F 8399 STD Y+1,R25
1D70 8388 STD Y+0,R24
1D71 E621 LDI R18,0x61
1D72 E030 LDI R19,0
1D73 E70A LDI R16,0x7A
1D74 E010 LDI R17,0
1D75 940E1F8D CALL _memcpy
(0122) }
1D77 C183 RJMP 0x1EFB
(0123) //命令CMD_SET_PARAMETER
(0124) else if(cmd==CMD_SET_PARAMETER)
1D78 2D8E MOV R24,R14
1D79 3082 CPI R24,2
1D7A F451 BNE 0x1D85
(0125) {
(0126) num_bytes = 2;
1D7B E082 LDI R24,2
1D7C E090 LDI R25,0
1D7D 839F STD Y+7,R25
1D7E 838E STD Y+6,R24
(0127) msg_buffer[0] = CMD_SET_PARAMETER;
1D7F 93800077 STS msg_buffer,R24
(0128) msg_buffer[1] = STATUS_CMD_OK;
1D81 2422 CLR R2
1D82 92200078 STS msg_buffer+1,R2
(0129) }
1D84 C176 RJMP 0x1EFB
(0130) //命令CMD_GET_PARAMETER
(0131) else if(cmd==CMD_GET_PARAMETER)
1D85 2D8E MOV R24,R14
1D86 3083 CPI R24,3
1D87 F5B1 BNE 0x1DBE
(0132) {
(0133) switch(msg_buffer[1])
1D88 90A00078 LDS R10,msg_buffer+1
1D8A 24BB CLR R11
1D8B 01C5 MOVW R24,R10
1D8C 3982 CPI R24,0x92
1D8D E0E0 LDI R30,0
1D8E 079E CPC R25,R30
1D8F F091 BEQ 0x1DA2
1D90 3984 CPI R24,0x94
1D91 E0E0 LDI R30,0
1D92 079E CPC R25,R30
1D93 F0A9 BEQ 0x1DA9
1D94 3985 CPI R24,0x95
1D95 E0E0 LDI R30,0
1D96 079E CPC R25,R30
1D97 F0A1 BEQ 0x1DAC
1D98 3982 CPI R24,0x92
1D99 E0E0 LDI R30,0
1D9A 079E CPC R25,R30
1D9B F09C BLT 0x1DAF
1D9C 01C5 MOVW R24,R10
1D9D 398E CPI R24,0x9E
1D9E E0E0 LDI R30,0
1D9F 079E CPC R25,R30
1DA0 F021 BEQ 0x1DA5
1DA1 C00D RJMP 0x1DAF
(0134) {
(0135) /*case PARAM_BUILD_NUMBER_LOW:
(0136) tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
(0137) break;
(0138) case PARAM_BUILD_NUMBER_HIGH:
(0139) tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
(0140) break;
(0141) case PARAM_HW_VER:
(0142) tmp = CONFIG_PARAM_HW_VER;
(0143) break;
(0144) case PARAM_SW_MAJOR:
(0145) tmp = CONFIG_PARAM_SW_MAJOR;
(0146) break;*/
(0147) case PARAM_SW_MINOR:
(0148) tmp = CONFIG_PARAM_SW_MINOR;
1DA2 E084 LDI R24,4
1DA3 8788 STD Y+8,R24
(0149) break;
1DA4 C00C RJMP 0x1DB1
(0150) case PARAM_RESET_POLARITY:
(0151) tmp = resetPolarity;
1DA5 90200073 LDS R2,resetPolarity
1DA7 8628 STD Y+8,R2
(0152) break;
1DA8 C008 RJMP 0x1DB1
(0153) case PARAM_VTARGET: //目标电压
(0154) tmp = 50;
1DA9 E382 LDI R24,0x32
1DAA 8788 STD Y+8,R24
(0155) break;
1DAB C005 RJMP 0x1DB1
(0156) case PARAM_VADJUST:
(0157) tmp = 50; //参考电压
1DAC E382 LDI R24,0x32
1DAD 8788 STD Y+8,R24
(0158) break;
1DAE C002 RJMP 0x1DB1
(0159) /*case PARAM_TOPCARD_DETECT:
(0160) tmp = TOP_CARD_STK520;
(0161) break;
(0162) case PARAM_CONTROLLER_INIT:
(0163) tmp = paramControllerInit;
(0164) break;
(0165) case PARAM_SCK_DURATION:
(0166) tmp = clockSpeed;
(0167) break;*/
(0168) default:
(0169) tmp = CONFIG_PARAM_SW_MAJOR;
1DAF E082 LDI R24,2
1DB0 8788 STD Y+8,R24
(0170) break;
(0171) }
(0172) num_bytes = 3;
1DB1 E083 LDI R24,3
1DB2 E090 LDI R25,0
1DB3 839F STD Y+7,R25
1DB4 838E STD Y+6,R24
(0173) msg_buffer[0] = CMD_GET_PARAMETER;
1DB5 93800077 STS msg_buffer,R24
(0174) msg_buffer[1] = STATUS_CMD_OK;
1DB7 2422 CLR R2
1DB8 92200078 STS msg_buffer+1,R2
(0175) msg_buffer[2] = tmp;
1DBA 8408 LDD R0,Y+8
1DBB 92000079 STS msg_buffer+2,R0
(0176) }
1DBD C13D RJMP 0x1EFB
(0177) //命令CMD_OSCCAL
(0178) /*else if(cmd==CMD_OSCCAL)
(0179) {
(0180) num_bytes = 2;
(0181) msg_buffer[0] = CMD_OSCCAL;
(0182) msg_buffer[1] = STATUS_CMD_OK;
(0183) }*/
(0184) //命令CMD_LOAD_ADDRESS
(0185) else if(cmd==CMD_LOAD_ADDRESS)
1DBE 2D8E MOV R24,R14
1DBF 3086 CPI R24,6
1DC0 F559 BNE 0x1DEC
(0186) {
(0187) //address = ((unsigned long)msg_buffer[1])<<24;
(0188) //address |= ((unsigned long)msg_buffer[2])<<16;
(0189) address = ((unsigned long)msg_buffer[3])<<8;
1DC1 E088 LDI R24,0x8
1DC2 E090 LDI R25,0
1DC3 9020007A LDS R2,msg_buffer+3
1DC5 2433 CLR R3
1DC6 2444 CLR R4
1DC7 2455 CLR R5
1DC8 938A ST R24,-Y
1DC9 0181 MOVW R16,R2
1DCA 0192 MOVW R18,R4
1DCB 940E1FBD CALL lsl32
1DCD 9310006D STS address+1,R17
1DCF 9300006C STS address,R16
(0190) address |= ((unsigned long)msg_buffer[4]);
1DD1 9020007B LDS R2,0x7B
1DD3 2433 CLR R3
1DD4 2444 CLR R4
1DD5 2455 CLR R5
1DD6 0138 MOVW R6,R16
1DD7 2488 CLR R8
1DD8 2499 CLR R9
1DD9 2862 OR R6,R2
1DDA 2873 OR R7,R3
1DDB 2884 OR R8,R4
1DDC 2895 OR R9,R5
1DDD 9270006D STS address+1,R7
1DDF 9260006C STS address,R6
(0191) num_bytes = 2;
1DE1 E082 LDI R24,2
1DE2 E090 LDI R25,0
1DE3 839F STD Y+7,R25
1DE4 838E STD Y+6,R24
(0192) msg_buffer[0] = CMD_LOAD_ADDRESS;
1DE5 E086 LDI R24,6
1DE6 93800077 STS msg_buffer,R24
(0193) msg_buffer[1] = STATUS_CMD_OK;
1DE8 2422 CLR R2
1DE9 92200078 STS msg_buffer+1,R2
(0194) }
1DEB C10F RJMP 0x1EFB
(0195) //CMD_CHIP_ERASE_ISP
(0196) else if(cmd==CMD_CHIP_ERASE_ISP)
1DEC 2D8E MOV R24,R14
1DED 3182 CPI R24,0x12
1DEE F459 BNE 0x1DFA
(0197) {
(0198) num_bytes = 2;
1DEF E082 LDI R24,2
1DF0 E090 LDI R25,0
1DF1 839F STD Y+7,R25
1DF2 838E STD Y+6,R24
(0199) msg_buffer[0] = CMD_CHIP_ERASE_ISP;
1DF3 E182 LDI R24,0x12
1DF4 93800077 STS msg_buffer,R24
(0200) msg_buffer[1] = STATUS_CMD_OK;
1DF6 2422 CLR R2
1DF7 92200078 STS msg_buffer+1,R2
(0201) }
1DF9 C101 RJMP 0x1EFB
(0202) //命令CMD_ENTER_PROGMODE_ISP
(0203) else if(cmd == CMD_ENTER_PROGMODE_ISP)
1DFA 2D8E MOV R24,R14
1DFB 3180 CPI R24,0x10
1DFC F459 BNE 0x1E08
(0204) {
(0205) num_bytes = 2;
1DFD E082 LDI R24,2
1DFE E090 LDI R25,0
1DFF 839F STD Y+7,R25
1E00 838E STD Y+6,R24
(0206) msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
1E01 E180 LDI R24,0x10
1E02 93800077 STS msg_buffer,R24
(0207) msg_buffer[1] = STATUS_CMD_OK;
1E04 2422 CLR R2
1E05 92200078 STS msg_buffer+1,R2
(0208) }
1E07 C0F3 RJMP 0x1EFB
(0209) //命令 CMD_LEAVE_PROGMODE_ISP
(0210) else if(cmd==CMD_LEAVE_PROGMODE_ISP)
1E08 2D8E MOV R24,R14
1E09 3181 CPI R24,0x11
1E0A F499 BNE 0x1E1E
(0211) {
(0212) num_bytes = 2;
1E0B E082 LDI R24,2
1E0C E090 LDI R25,0
1E0D 839F STD Y+7,R25
1E0E 838E STD Y+6,R24
(0213) msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
1E0F E181 LDI R24,0x11
1E10 93800077 STS msg_buffer,R24
(0214) msg_buffer[1] = STATUS_CMD_OK;
1E12 2422 CLR R2
1E13 92200078 STS msg_buffer+1,R2
(0215)
(0216) flag = 0;
1E15 92200060 STS flag,R2
(0217) TCNT1 = 0x735F;
1E17 E58F LDI R24,0x5F
1E18 E793 LDI R25,0x73
1E19 BD9D OUT 0x2D,R25
1E1A BD8C OUT 0x2C,R24
(0218) TCCR1B = 0x05;
1E1B E085 LDI R24,5
1E1C BD8E OUT 0x2E,R24
(0219) }
1E1D C0DD RJMP 0x1EFB
(0220) //命令CMD_PROGRAM_FLASH_ISP
(0221) else if(cmd==CMD_PROGRAM_FLASH_ISP)
1E1E 2D8E MOV R24,R14
1E1F 3183 CPI R24,0x13
1E20 F009 BEQ 0x1E22
1E21 C048 RJMP 0x1E6A
(0222) {
(0223) uint16 temp16;
(0224) boot_page_ew(address,0x03); //擦除页
1E22 E023 LDI R18,3
1E23 9100006C LDS R16,address
1E25 9110006D LDS R17,address+1
1E27 940E1F60 CALL _boot_page_ew
(0225) wait_page_rw_ok(); //等待擦除完成
1E29 940E1F6D CALL _wait_page_rw_ok
(0226) for(i=0;i<(SPM_PAGESIZE<<1);i+=2) //将数据填入Flash缓冲页中
1E2B 24CC CLR R12
1E2C 24DD CLR R13
1E2D C019 RJMP 0x1E47
(0227) {
(0228) temp16=msg_buffer[i+11];
1E2E E787 LDI R24,0x77
1E2F E090 LDI R25,0
1E30 01F6 MOVW R30,R12
1E31 963B ADIW R30,0xB
1E32 0FE8 ADD R30,R24
1E33 1FF9 ADC R31,R25
1E34 80A0 LDD R10,Z+0
1E35 24BB CLR R11
(0229) temp16<<=8;
1E36 2CBA MOV R11,R10
1E37 24AA CLR R10
(0230) temp16+=msg_buffer[i+10];
1E38 01F6 MOVW R30,R12
1E39 963A ADIW R30,0xA
1E3A 0FE8 ADD R30,R24
1E3B 1FF9 ADC R31,R25
1E3C 8020 LDD R2,Z+0
1E3D 2433 CLR R3
1E3E 0CA2 ADD R10,R2
1E3F 1CB3 ADC R11,R3
(0231) boot_page_fill(i,temp16);
1E40 0195 MOVW R18,R10
1E41 0186 MOVW R16,R12
1E42 940E1F65 CALL _boot_page_fill
1E44 01C6 MOVW R24,R12
1E45 9602 ADIW R24,2
1E46 016C MOVW R12,R24
1E47 01C6 MOVW R24,R12
1E48 3880 CPI R24,0x80
1E49 E0E0 LDI R30,0
1E4A 079E CPC R25,R30
1E4B F310 BCS 0x1E2E
(0232) }
(0233) boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
1E4C E025 LDI R18,5
1E4D 9100006C LDS R16,address
1E4F 9110006D LDS R17,address+1
1E51 940E1F60 CALL _boot_page_ew
(0234) wait_page_rw_ok(); //等待写入完成
1E53 940E1F6D CALL _wait_page_rw_ok
(0235) address+=(SPM_PAGESIZE<<1);
1E55 9180006C LDS R24,address
1E57 9190006D LDS R25,address+1
1E59 5880 SUBI R24,0x80
1E5A 4F9F SBCI R25,0xFF
1E5B 9390006D STS address+1,R25
1E5D 9380006C STS address,R24
(0236) num_bytes = 2;
1E5F E082 LDI R24,2
1E60 E090 LDI R25,0
1E61 839F STD Y+7,R25
1E62 838E STD Y+6,R24
(0237) msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
1E63 E183 LDI R24,0x13
1E64 93800077 STS msg_buffer,R24
(0238) msg_buffer[1] = STATUS_CMD_OK;
1E66 2422 CLR R2
1E67 92200078 STS msg_buffer+1,R2
(0239) }
1E69 C091 RJMP 0x1EFB
(0240) //命令CMD_READ_FLASH_ISP
(0241) else if(cmd==CMD_READ_FLASH_ISP)
1E6A 2D8E MOV R24,R14
1E6B 3184 CPI R24,0x14
1E6C F591 BNE 0x1E9F
(0242) {
(0243) for(i=0;i<(SPM_PAGESIZE<<2);i++)
1E6D 24CC CLR R12
1E6E 24DD CLR R13
1E6F C013 RJMP 0x1E83
(0244) {
(0245) msg_buffer[i+2] = read_program_memory (address+i,0x00);
1E70 2722 CLR R18
1E71 9100006C LDS R16,address
1E73 9110006D LDS R17,address+1
1E75 0D0C ADD R16,R12
1E76 1D1D ADC R17,R13
1E77 940E1F83 CALL _read_program_memory
1E79 E787 LDI R24,0x77
1E7A E090 LDI R25,0
1E7B 01F6 MOVW R30,R12
1E7C 9632 ADIW R30,2
1E7D 0FE8 ADD R30,R24
1E7E 1FF9 ADC R31,R25
1E7F 8300 STD Z+0,R16
1E80 01C6 MOVW R24,R12
1E81 9601 ADIW R24,1
1E82 016C MOVW R12,R24
1E83 01C6 MOVW R24,R12
1E84 3080 CPI R24,0
1E85 E0E1 LDI R30,1
1E86 079E CPC R25,R30
1E87 F340 BCS 0x1E70
(0246) }
(0247) address+=SPM_PAGESIZE<<2;
1E88 9180006C LDS R24,address
1E8A 9190006D LDS R25,address+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -