📄 19boot.lst
字号:
(0127) break;
FA1C C005 RJMP 0xFA22
(0128) case PARAM_VADJUST:
(0129) tmp = 50; //参考电压
FA1D E382 LDI R24,0x32
FA1E 8788 STD Y+8,R24
(0130) break;
FA1F C002 RJMP 0xFA22
(0131) /*case PARAM_TOPCARD_DETECT:
(0132) tmp = TOP_CARD_STK520;
(0133) break;
(0134) case PARAM_CONTROLLER_INIT:
(0135) tmp = paramControllerInit;
(0136) break;
(0137) case PARAM_SCK_DURATION:
(0138) tmp = clockSpeed;
(0139) break;*/
(0140) default:
(0141) tmp = CONFIG_PARAM_SW_MAJOR;
FA20 E082 LDI R24,2
FA21 8788 STD Y+8,R24
(0142) break;
(0143) }
(0144) num_bytes = 3;
FA22 E083 LDI R24,3
FA23 E090 LDI R25,0
FA24 839F STD Y+7,R25
FA25 838E STD Y+6,R24
(0145) msg_buffer[0] = CMD_GET_PARAMETER;
FA26 93800117 STS msg_buffer,R24
(0146) msg_buffer[1] = STATUS_CMD_OK;
FA28 2422 CLR R2
FA29 92200118 STS msg_buffer+1,R2
(0147) msg_buffer[2] = tmp;
FA2B 8408 LDD R0,Y+8
FA2C 92000119 STS msg_buffer+2,R0
(0148) }
FA2E C1CD RJMP 0xFBFC
(0149) //读取时钟修正值
(0150) /*else if (cmd==CMD_OSCCAL) {
(0151) num_bytes = 2;
(0152) msg_buffer[0] = CMD_OSCCAL;
(0153) msg_buffer[1] = STATUS_CMD_OK;
(0154) }*/
(0155) //设置地址
(0156) else if (cmd==CMD_LOAD_ADDRESS) {
FA2F 2D8E MOV R24,R14
FA30 3086 CPI R24,6
FA31 F009 BEQ 0xFA33
FA32 C054 RJMP 0xFA87
(0157) //address = ((unsigned long)msg_buffer[1])<<24;
(0158) address = ((unsigned long)msg_buffer[2])<<16;
FA33 90200119 LDS R2,msg_buffer+2
FA35 2433 CLR R3
FA36 2444 CLR R4
FA37 2455 CLR R5
FA38 0121 MOVW R4,R2
FA39 2422 CLR R2
FA3A 2433 CLR R3
FA3B 9230010B STS address+1,R3
FA3D 9220010A STS address,R2
FA3F 9250010D STS address+3,R5
FA41 9240010C STS address+2,R4
(0159) address |= ((unsigned long)msg_buffer[3])<<8;
FA43 E088 LDI R24,0x8
FA44 E090 LDI R25,0
FA45 9020011A LDS R2,msg_buffer+3
FA47 2433 CLR R3
FA48 2444 CLR R4
FA49 2455 CLR R5
FA4A 938A ST R24,-Y
FA4B 0181 MOVW R16,R2
FA4C 0192 MOVW R18,R4
FA4D 940EFC95 CALL lsl32
FA4F 9040010C LDS R4,address+2
FA51 9050010D LDS R5,address+3
FA53 9020010A LDS R2,address
FA55 9030010B LDS R3,address+1
FA57 2A20 OR R2,R16
FA58 2A31 OR R3,R17
FA59 2A42 OR R4,R18
FA5A 2A53 OR R5,R19
FA5B 9230010B STS address+1,R3
FA5D 9220010A STS address,R2
FA5F 9250010D STS address+3,R5
FA61 9240010C STS address+2,R4
(0160) address |= ((unsigned long)msg_buffer[4]);
FA63 9020011B LDS R2,0x11B
FA65 2433 CLR R3
FA66 2444 CLR R4
FA67 2455 CLR R5
FA68 9080010C LDS R8,address+2
FA6A 9090010D LDS R9,address+3
FA6C 9060010A LDS R6,address
FA6E 9070010B LDS R7,address+1
FA70 2862 OR R6,R2
FA71 2873 OR R7,R3
FA72 2884 OR R8,R4
FA73 2895 OR R9,R5
FA74 9270010B STS address+1,R7
FA76 9260010A STS address,R6
FA78 9290010D STS address+3,R9
FA7A 9280010C STS address+2,R8
(0161) num_bytes = 2;
FA7C E082 LDI R24,2
FA7D E090 LDI R25,0
FA7E 839F STD Y+7,R25
FA7F 838E STD Y+6,R24
(0162) msg_buffer[0] = CMD_LOAD_ADDRESS;
FA80 E086 LDI R24,6
FA81 93800117 STS msg_buffer,R24
(0163) msg_buffer[1] = STATUS_CMD_OK;
FA83 2422 CLR R2
FA84 92200118 STS msg_buffer+1,R2
(0164) }
FA86 C175 RJMP 0xFBFC
(0165) //芯片擦除
(0166) else if (cmd==CMD_CHIP_ERASE_ISP) {
FA87 2D8E MOV R24,R14
FA88 3182 CPI R24,0x12
FA89 F459 BNE 0xFA95
(0167) num_bytes = 2;
FA8A E082 LDI R24,2
FA8B E090 LDI R25,0
FA8C 839F STD Y+7,R25
FA8D 838E STD Y+6,R24
(0168) msg_buffer[0] = CMD_CHIP_ERASE_ISP;
FA8E E182 LDI R24,0x12
FA8F 93800117 STS msg_buffer,R24
(0169) msg_buffer[1] = STATUS_CMD_OK;
FA91 2422 CLR R2
FA92 92200118 STS msg_buffer+1,R2
(0170) }
FA94 C167 RJMP 0xFBFC
(0171) //进入编程模式
(0172) else if (cmd == CMD_ENTER_PROGMODE_ISP) {
FA95 2D8E MOV R24,R14
FA96 3180 CPI R24,0x10
FA97 F461 BNE 0xFAA4
(0173) num_bytes = 2;
FA98 E082 LDI R24,2
FA99 E090 LDI R25,0
FA9A 839F STD Y+7,R25
FA9B 838E STD Y+6,R24
(0174) msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
FA9C E180 LDI R24,0x10
FA9D 93800117 STS msg_buffer,R24
(0175) msg_buffer[1] = STATUS_CMD_OK;
FA9F 2422 CLR R2
FAA0 92200118 STS msg_buffer+1,R2
(0176) PORTB &= ~(1 << PB6);
FAA2 98C6 CBI 0x18,6
(0177) }
FAA3 C158 RJMP 0xFBFC
(0178) //退出编程模式
(0179) else if (cmd==CMD_LEAVE_PROGMODE_ISP) {
FAA4 2D8E MOV R24,R14
FAA5 3181 CPI R24,0x11
FAA6 F471 BNE 0xFAB5
(0180) num_bytes = 2;
FAA7 E082 LDI R24,2
FAA8 E090 LDI R25,0
FAA9 839F STD Y+7,R25
FAAA 838E STD Y+6,R24
(0181) msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
FAAB E181 LDI R24,0x11
FAAC 93800117 STS msg_buffer,R24
(0182) msg_buffer[1] = STATUS_CMD_OK;
FAAE 2422 CLR R2
FAAF 92200118 STS msg_buffer+1,R2
(0183)
(0184) flag = 0;
FAB1 92200100 STS flag,R2
(0185) PORTB |= (1 << PB6);
FAB3 9AC6 SBI 0x18,6
(0186) }
FAB4 C147 RJMP 0xFBFC
(0187) /*写FLASH*/
(0188) /*
(0189) M128一页容量为256字节,而AVRISP一帧数据为128字节。
(0190) 为了仿止有奇数帧出现,所以必顺每一帧写入一次。
(0191) 每页数据将写入两次,但是下一帧数据不能覆盖上一帧数据。
(0192) 整个写入过程大概如下:
(0193) 1、写上半页:擦除一页,写入上半页数据。
(0194) 2、写全部页:擦除一页,写入整个页数据。
(0195) */
(0196) else if (cmd==CMD_PROGRAM_FLASH_ISP) {
FAB5 2D8E MOV R24,R14
FAB6 3183 CPI R24,0x13
FAB7 F009 BEQ 0xFAB9
FAB8 C09E RJMP 0xFB57
(0197) /*缓存合并处理*/
(0198) if ((address & 0xFF) == 0x00) { /*判断是否为上半页*/
FAB9 EF4F LDI R20,0xFF
FABA E050 LDI R21,0
FABB E060 LDI R22,0
FABC E070 LDI R23,0
FABD 9040010C LDS R4,address+2
FABF 9050010D LDS R5,address+3
FAC1 9020010A LDS R2,address
FAC3 9030010B LDS R3,address+1
FAC5 2224 AND R2,R20
FAC6 2235 AND R3,R21
FAC7 2246 AND R4,R22
FAC8 2257 AND R5,R23
FAC9 E040 LDI R20,0
FACA E050 LDI R21,0
FACB E060 LDI R22,0
FACC E070 LDI R23,0
FACD 1624 CP R2,R20
FACE 0635 CPC R3,R21
FACF 0646 CPC R4,R22
FAD0 0657 CPC R5,R23
FAD1 F009 BEQ 0xFAD3
FAD2 C030 RJMP 0xFB03
(0199) boot_page_ew(address,0x03); /*擦除页*/
FAD3 E083 LDI R24,3
FAD4 8388 STD Y+0,R24
FAD5 9120010C LDS R18,address+2
FAD7 9130010D LDS R19,address+3
FAD9 9100010A LDS R16,address
FADB 9110010B LDS R17,address+1
FADD 940EF872 CALL _boot_page_ew
(0200) wait_page_rw_ok(); /*等待擦除完成 */
FADF 940EF886 CALL _wait_page_rw_ok
(0201) /*加载上半页数据*/
(0202) for (i = 0; i < SPM_PAGESIZE; i += 2) { /*加载上半页数据*/
FAE1 24CC CLR R12
FAE2 24DD CLR R13
FAE3 C019 RJMP 0xFAFD
(0203) temp16=msg_buffer[i+11];
FAE4 E187 LDI R24,0x17
FAE5 E091 LDI R25,1
FAE6 01F6 MOVW R30,R12
FAE7 963B ADIW R30,0xB
FAE8 0FE8 ADD R30,R24
FAE9 1FF9 ADC R31,R25
FAEA 80A0 LDD R10,Z+0
FAEB 24BB CLR R11
(0204) temp16<<=8;
FAEC 2CBA MOV R11,R10
FAED 24AA CLR R10
(0205) temp16+=msg_buffer[i+10];
FAEE 01F6 MOVW R30,R12
FAEF 963A ADIW R30,0xA
FAF0 0FE8 ADD R30,R24
FAF1 1FF9 ADC R31,R25
FAF2 8020 LDD R2,Z+0
FAF3 2433 CLR R3
FAF4 0CA2 ADD R10,R2
FAF5 1CB3 ADC R11,R3
(0206) boot_page_fill(i,temp16);
FAF6 0195 MOVW R18,R10
FAF7 0186 MOVW R16,R12
FAF8 940EF87D CALL _boot_page_fill
FAFA 01C6 MOVW R24,R12
FAFB 9602 ADIW R24,2
FAFC 016C MOVW R12,R24
FAFD 01C6 MOVW R24,R12
FAFE 3880 CPI R24,0x80
FAFF E0E0 LDI R30,0
FB00 079E CPC R25,R30
FB01 F310 BCS 0xFAE4
(0207) }
(0208) }
FB02 C023 RJMP 0xFB26
(0209) else {
(0210) /*写下半页时不擦除页*/
(0211) /*加载上半页数据*/
(0212) for (i = 0; i < SPM_PAGESIZE; i += 2) { /*填充在后半页,完成合并*/
FB03 24CC CLR R12
FB04 24DD CLR R13
FB05 C01B RJMP 0xFB21
(0213) temp16=msg_buffer[i+11];
FB06 E187 LDI R24,0x17
FB07 E091 LDI R25,1
FB08 01F6 MOVW R30,R12
FB09 963B ADIW R30,0xB
FB0A 0FE8 ADD R30,R24
FB0B 1FF9 ADC R31,R25
FB0C 80A0 LDD R10,Z+0
FB0D 24BB CLR R11
(0214) temp16<<=8;
FB0E 2CBA MOV R11,R10
FB0F 24AA CLR R10
(0215) temp16+=msg_buffer[i+10];
FB10 01F6 MOVW R30,R12
FB11 963A ADIW R30,0xA
FB12 0FE8 ADD R30,R24
FB13 1FF9 ADC R31,R25
FB14 8020 LDD R2,Z+0
FB15 2433 CLR R3
FB16 0CA2 ADD R10,R2
FB17 1CB3 ADC R11,R3
(0216) boot_page_fill(i + 128, temp16);
FB18 0195 MOVW R18,R10
FB19 0186 MOVW R16,R12
FB1A 5800 SUBI R16,0x80
FB1B 4F1F SBCI R17,0xFF
FB1C 940EF87D CALL _boot_page_fill
FB1E 01C6 MOVW R24,R12
FB1F 9602 ADIW R24,2
FB20 016C MOVW R12,R24
FB21 01C6 MOVW R24,R12
FB22 3880 CPI R24,0x80
FB23 E0E0 LDI R30,0
FB24 079E CPC R25,R30
FB25 F300 BCS 0xFB06
(0217) }
(0218) }
(0219) boot_page_ew(address,0x05); /*将缓冲页数据写入一个Flash页 */
FB26 E085 LDI R24,5
FB27 8388 STD Y+0,R24
FB28 9120010C LDS R18,address+2
FB2A 9130010D LDS R19,address+3
FB2C 9100010A LDS R16,address
FB2E 9110010B LDS R17,address+1
FB30 940EF872 CALL _boot_page_ew
(0220) wait_page_rw_ok(); /*等待写入完成 */
FB32 940EF886 CALL _wait_page_rw_ok
(0221) address+=(SPM_PAGESIZE);
FB34 E840 LDI R20,0x80
FB35 E050 LDI R21,0
FB36 E060 LDI R22,0
FB37 E070 LDI R23,0
FB38 9040010C LDS R4,address+2
FB3A 9050010D LDS R5,address+3
FB3C 9020010A LDS R2,address
FB3E 9030010B LDS R3,address+1
FB40 0E24 ADD R2,R20
FB41 1E35 ADC R3,R21
FB42 1E46 ADC R4,R22
FB43 1E57 ADC R5,R23
FB44 9230010B STS address+1,R3
FB46 9220010A STS address,R2
FB48 9250010D STS address+3,R5
FB4A 9240010C STS address+2,R4
(0222) num_bytes = 2;
FB4C E082 LDI R24,2
FB4D E090 LDI R25,0
FB4E 839F STD Y+7,R25
FB4F 838E STD Y+6,R24
(0223) msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
FB50 E183 LDI R24,0x13
FB51 93800117 STS msg_buffer,R24
(0224) msg_buffer[1] = STATUS_CMD_OK;
FB53 2422 CLR R2
FB54 92200118 STS msg_buffer+1,R2
(0225) }
FB56 C0A5 RJMP 0xFBFC
(0226) //读FLASH
(0227) else if (cmd==CMD_READ_FLASH_ISP) {
FB57 2D8E MOV R24,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -