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

📄 19boot.lst

📁 ATEMEL AVR128 BOOT程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
(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 + -