📄 bldstk500.lst
字号:
1E8C 5080 SUBI R24,0
1E8D 4F9F SBCI R25,0xFF
1E8E 9390006D STS address+1,R25
1E90 9380006C STS address,R24
(0248) num_bytes = (SPM_PAGESIZE<<2)+3;
1E92 E083 LDI R24,3
1E93 E091 LDI R25,1
1E94 839F STD Y+7,R25
1E95 838E STD Y+6,R24
(0249) msg_buffer[0] = CMD_READ_FLASH_ISP;
1E96 E184 LDI R24,0x14
1E97 93800077 STS msg_buffer,R24
(0250) msg_buffer[1] = STATUS_CMD_OK;
1E99 2422 CLR R2
1E9A 92200078 STS msg_buffer+1,R2
(0251) msg_buffer[(SPM_PAGESIZE<<2)+2] = STATUS_CMD_OK;
1E9C 92200179 STS 0x179,R2
(0252) }
1E9E C05C RJMP 0x1EFB
(0253) //命令CMD_READ_FUSE_ISP
(0254) else if(cmd==CMD_READ_FUSE_ISP)
1E9F 2D8E MOV R24,R14
1EA0 3188 CPI R24,0x18
1EA1 F571 BNE 0x1ED0
(0255) {
(0256) switch(msg_buffer[2])
1EA2 90A00079 LDS R10,msg_buffer+2
1EA4 24BB CLR R11
1EA5 01C5 MOVW R24,R10
1EA6 3580 CPI R24,0x50
1EA7 E0E0 LDI R30,0
1EA8 079E CPC R25,R30
1EA9 F051 BEQ 0x1EB4
1EAA 3580 CPI R24,0x50
1EAB E0E0 LDI R30,0
1EAC 079E CPC R25,R30
1EAD F0AC BLT 0x1EC3
1EAE 01C5 MOVW R24,R10
1EAF 3588 CPI R24,0x58
1EB0 E0E0 LDI R30,0
1EB1 079E CPC R25,R30
1EB2 F049 BEQ 0x1EBC
1EB3 C00F RJMP 0x1EC3
(0257) {
(0258) case 0x50:
(0259) msg_buffer[2] = read_program_memory(0x0000,1); //读熔丝位
1EB4 E021 LDI R18,1
1EB5 2700 CLR R16
1EB6 2711 CLR R17
1EB7 940E1F83 CALL _read_program_memory
1EB9 93000079 STS msg_buffer+2,R16
(0260) break;
1EBB C007 RJMP 0x1EC3
(0261) case 0x58:
(0262) msg_buffer[2] = read_program_memory(0x0003,1); //读高熔丝位
1EBC E021 LDI R18,1
1EBD E003 LDI R16,3
1EBE E010 LDI R17,0
1EBF 940E1F83 CALL _read_program_memory
1EC1 93000079 STS msg_buffer+2,R16
(0263) break;
(0264) default:
(0265) break;
(0266) }
(0267) num_bytes = 4;
1EC3 E084 LDI R24,4
1EC4 E090 LDI R25,0
1EC5 839F STD Y+7,R25
1EC6 838E STD Y+6,R24
(0268) msg_buffer[0] = CMD_READ_FUSE_ISP;
1EC7 E188 LDI R24,0x18
1EC8 93800077 STS msg_buffer,R24
(0269) msg_buffer[1] = STATUS_CMD_OK;
1ECA 2422 CLR R2
1ECB 92200078 STS msg_buffer+1,R2
(0270) msg_buffer[3] = STATUS_CMD_OK;
1ECD 9220007A STS msg_buffer+3,R2
(0271) }
1ECF C02B RJMP 0x1EFB
(0272) //命令CMD_PROGRAM_LOCK_ISP
(0273) else if(cmd==CMD_PROGRAM_LOCK_ISP)
1ED0 2D8E MOV R24,R14
1ED1 3189 CPI R24,0x19
1ED2 F491 BNE 0x1EE5
(0274) {
(0275) write_lock_bits (msg_buffer[4]|0xC0);
1ED3 9100007B LDS R16,0x7B
1ED5 6C00 ORI R16,0xC0
1ED6 940E1F78 CALL _write_lock_bits
(0276) num_bytes = 3;
1ED8 E083 LDI R24,3
1ED9 E090 LDI R25,0
1EDA 839F STD Y+7,R25
1EDB 838E STD Y+6,R24
(0277) msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
1EDC E189 LDI R24,0x19
1EDD 93800077 STS msg_buffer,R24
(0278) msg_buffer[1] = STATUS_CMD_OK;
1EDF 2422 CLR R2
1EE0 92200078 STS msg_buffer+1,R2
(0279) msg_buffer[2] = STATUS_CMD_OK;
1EE2 92200079 STS msg_buffer+2,R2
(0280) }
1EE4 C016 RJMP 0x1EFB
(0281) //命令CMD_READ_LOCK_ISP
(0282) else if(cmd==CMD_READ_LOCK_ISP)
1EE5 2D8E MOV R24,R14
1EE6 318A CPI R24,0x1A
1EE7 F499 BNE 0x1EFB
(0283) {
(0284) msg_buffer[2] = read_program_memory(0x0001,1);
1EE8 E021 LDI R18,1
1EE9 E001 LDI R16,1
1EEA E010 LDI R17,0
1EEB 940E1F83 CALL _read_program_memory
1EED 93000079 STS msg_buffer+2,R16
(0285) num_bytes = 4;
1EEF E084 LDI R24,4
1EF0 E090 LDI R25,0
1EF1 839F STD Y+7,R25
1EF2 838E STD Y+6,R24
(0286) msg_buffer[0] = CMD_READ_LOCK_ISP;
1EF3 E18A LDI R24,0x1A
1EF4 93800077 STS msg_buffer,R24
(0287) msg_buffer[1] = STATUS_CMD_OK;
1EF6 2422 CLR R2
1EF7 92200078 STS msg_buffer+1,R2
(0288) msg_buffer[3] = STATUS_CMD_OK;
1EF9 9220007A STS msg_buffer+3,R2
(0289) }
(0290) //传送缓冲区数据
(0291) if(num_bytes>0)
1EFB 800E LDD R0,Y+6
1EFC 801F LDD R1,Y+7
1EFD 2000 TST R0
1EFE F419 BNE 0x1F02
1EFF 2011 TST R1
1F00 F409 BNE 0x1F02
1F01 C059 RJMP 0x1F5B
(0292) {
(0293) putChar(MESSAGE_START);
1F02 E10B LDI R16,0x1B
1F03 940E1C53 CALL _putChar
(0294) checkSum=MESSAGE_START;
1F05 E18B LDI R24,0x1B
1F06 93800075 STS checkSum,R24
(0295) putChar(seqNum);
1F08 890B LDD R16,Y+19
1F09 940E1C53 CALL _putChar
(0296) checkSum^=seqNum;
1F0B 90200075 LDS R2,checkSum
1F0D 880B LDD R0,Y+19
1F0E 2420 EOR R2,R0
1F0F 92200075 STS checkSum,R2
(0297) tmp=(num_bytes&0xFF00)>>8;
1F11 818E LDD R24,Y+6
1F12 819F LDD R25,Y+7
1F13 7080 ANDI R24,0
1F14 2F89 MOV R24,R25
1F15 2799 CLR R25
1F16 8788 STD Y+8,R24
(0298) putChar(tmp);
1F17 2F08 MOV R16,R24
1F18 940E1C53 CALL _putChar
(0299) checkSum^=tmp;
1F1A 90200075 LDS R2,checkSum
1F1C 8408 LDD R0,Y+8
1F1D 2420 EOR R2,R0
1F1E 92200075 STS checkSum,R2
(0300) tmp=num_bytes&0x00FF;
1F20 818E LDD R24,Y+6
1F21 819F LDD R25,Y+7
1F22 7090 ANDI R25,0
1F23 8788 STD Y+8,R24
(0301) putChar(tmp);
1F24 2F08 MOV R16,R24
1F25 940E1C53 CALL _putChar
(0302) checkSum^=tmp;
1F27 90200075 LDS R2,checkSum
1F29 8408 LDD R0,Y+8
1F2A 2420 EOR R2,R0
1F2B 92200075 STS checkSum,R2
(0303) putChar(TOKEN);
1F2D E00E LDI R16,0xE
1F2E 940E1C53 CALL _putChar
(0304) checkSum^=TOKEN;
1F30 E08E LDI R24,0xE
1F31 90200075 LDS R2,checkSum
1F33 2628 EOR R2,R24
1F34 92200075 STS checkSum,R2
(0305) for(i=0;i<num_bytes;i++)
1F36 24CC CLR R12
1F37 24DD CLR R13
1F38 C016 RJMP 0x1F4F
(0306) {
(0307) putChar(msg_buffer[i]);
1F39 E787 LDI R24,0x77
1F3A E090 LDI R25,0
1F3B 01F6 MOVW R30,R12
1F3C 0FE8 ADD R30,R24
1F3D 1FF9 ADC R31,R25
1F3E 8100 LDD R16,Z+0
1F3F 940E1C53 CALL _putChar
(0308) checkSum^=msg_buffer[i];
1F41 E787 LDI R24,0x77
1F42 E090 LDI R25,0
1F43 01F6 MOVW R30,R12
1F44 0FE8 ADD R30,R24
1F45 1FF9 ADC R31,R25
1F46 8020 LDD R2,Z+0
1F47 90300075 LDS R3,checkSum
1F49 2432 EOR R3,R2
1F4A 92300075 STS checkSum,R3
1F4C 01C6 MOVW R24,R12
1F4D 9601 ADIW R24,1
1F4E 016C MOVW R12,R24
1F4F 800E LDD R0,Y+6
1F50 801F LDD R1,Y+7
1F51 14C0 CP R12,R0
1F52 04D1 CPC R13,R1
1F53 F328 BCS 0x1F39
(0309) }
(0310) putChar(checkSum);
1F54 91000075 LDS R16,checkSum
1F56 940E1C53 CALL _putChar
(0311) checkSum=0x00;
1F58 2422 CLR R2
1F59 92200075 STS checkSum,R2
(0312) }
1F5B 9629 ADIW R28,0x9
1F5C 940E1F9B CALL pop_gset5
1F5E 9622 ADIW R28,2
1F5F 9508 RET
FILE: D:\iccv7avr\AVRBOO~1\self_prog.c
(0001) /****************************************Copyright (c)*****************************
(0002) 文件名: self_prog.c
(0003) 修改日期: 2006-1-24 13:00
(0004) 描述: SPM操作函数
(0005) 版本: V1.0,根据machao程序改编
(0006) 主控 芯 片: M16 晶振频率:7.3728MHZ
(0007) ********************************************************************************/
(0008) #include<iom16v.h>
(0009) #include<macros.h>
(0010) #include"define.h"
(0011) #include"extern.h"
(0012)
(0013)
(0014) /**********************************************************************
(0015) functionName:void someNop(void)
(0016) description: 擦除(code=0x03)和写入(code=0x05)一个Flash页
(0017) **********************************************************************/
(0018) void boot_page_ew(uint16 pageAddr,uint08 code)
(0019) {
(0020) asm("mov r30,r16\n"
_boot_page_ew:
code --> R18
pageAddr --> R16
1F60 2FE0 MOV R30,R16
1F61 2FF1 MOV R31,R17
(0021) "mov r31,r17\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
(0022) SPMCR = code; //寄存器SPMCSR中为操作码
1F62 BF27 OUT 0x37,R18
(0023) asm("spm\n"); //对指定Flash页进行操作
1F63 95E8 SPM
1F64 9508 RET
(0024) }
(0025)
(0026) /**********************************************************************
(0027) functionName:void boot_page_fill(uint16 address,uint16 data)
(0028) description: 填充Flash缓冲页中的一个字
(0029) **********************************************************************/
(0030) void boot_page_fill(uint16 address,uint16 data)
(0031) {
(0032) asm("mov r30,r16\n"
_boot_page_fill:
data --> R18
address --> R16
1F65 2FE0 MOV R30,R16
1F66 2FF1 MOV R31,R17
1F67 2E02 MOV R0,R18
1F68 2E13 MOV R1,R19
(0033) "mov r31,r17\n" //Z寄存器中为填冲页内地址
(0034) "mov r0,r18\n"
(0035) "mov r1,r19\n"); //R0R1中为一个指令字
(0036) SPMCR = 0x01;
1F69 E081 LDI R24,1
1F6A BF87 OUT 0x37,R24
(0037) asm("spm\n");
1F6B 95E8 SPM
1F6C 9508 RET
(0038) }
(0039)
(0040) /**********************************************************************
(0041) functionName:void wait_page_rw_ok(void)
(0042) description: 等待一个Flash页的写完成
(0043) **********************************************************************/
(0044) void wait_page_rw_ok(void)
(0045) {
_wait_page_rw_ok:
1F6D C006 RJMP 0x1F74
(0046) while(SPMCR & 0x40)
(0047) {
(0048) while(SPMCR & 0x01);
1F6E B627 IN R2,0x37
1F6F FC20 SBRC R2,0
1F70 CFFD RJMP 0x1F6E
(0049) SPMCR = 0x11;
1F71 E181 LDI R24,0x11
1F72 BF87 OUT 0x37,R24
(0050) asm("spm\n");
1F73 95E8 SPM
1F74 B627 IN R2,0x37
1F75 FC26 SBRC R2,6
1F76 CFF7 RJMP 0x1F6E
1F77 9508 RET
(0051) }
(0052) }
(0053)
(0054)
(0055)
(0056)
(0057) /**********************************************************************
(0058) functionName:void write_lock_bits (unsigned char val)
(0059) description:写锁定位
(0060) **********************************************************************/
(0061) void write_lock_bits (unsigned char val)
(0062) {
(0063) asm("mov r0,r16\n");
_write_lock_bits:
val --> R16
1F78 2E00 MOV R0,R16
(0064) SPMCR=0x09;
1F79 E089 LDI R24,0x9
1F7A BF87 OUT 0x37,R24
(0065) asm("spm\n");
1F7B 95E8 SPM
(0066) while(SPMCR&BIT(0));
1F7C B627 IN R2,0x37
1F7D FC20 SBRC R2,0
1F7E CFFD RJMP 0x1F7C
(0067) SPMCR = 0x11;
1F7F E181 LDI R24,0x11
1F80 BF87 OUT 0x37,R24
(0068) asm("spm\n");
1F81 95E8 SPM
1F82 9508 RET
(0069) }
(0070)
(0071) /**********************************************************************
(0072) functionName:uint08 read_program_memory (uint16 addr,uint08 cmd)
(0073) description: 返回addr地址数据,以字节为单位
(0074) cmd:
(0075) 0:读flashrom
(0076) 1:读熔丝位或者锁定位
(0077) addr=0x0001 锁定位
(0078) addr=0x0000 熔丝位低字节
(0079) addr=0x0003 熔丝位高字节
(0080) **********************************************************************/
(0081) uint08 read_program_memory(uint16 addr,uint08 cmd)
(0082) {
(0083) asm("mov r30,r16\n"
_read_program_memory:
cmd --> R18
addr --> R16
1F83 2FE0 MOV R30,R16
1F84 2FF1 MOV R31,R17
(0084) "mov r31,r17\n");
(0085) if(cmd)
1F85 2322 TST R18
1F86 F011 BEQ 0x1F89
(0086) {
(0087) SPMCR=0x09;
1F87 E089 LDI R24,0x9
1F88 BF87 OUT 0x37,R24
(0088) }
(0089) asm("lpm r0,z\n");
1F89 9004 LPM R0,0(Z)
(0090) return(R0);
FILE: <library>
1F8A 91000000 LDS R16,0x0
1F8C 9508 RET
_memcpy:
1F8D 2FA0 MOV R26,R16
1F8E 2FB1 MOV R27,R17
1F8F 2FE2 MOV R30,R18
1F90 2FF3 MOV R31,R19
1F91 8188 LDD R24,Y+0
1F92 8199 LDD R25,Y+1
1F93 3080 CPI R24,0
1F94 0798 CPC R25,R24
1F95 C003 RJMP 0x1F99
1F96 9001 LD R0,Z+
1F97 920D ST R0,X+
1F98 9701 SBIW R24,1
1F99 F7E1 BNE 0x1F96
1F9A 9508 RET
pop_gset5:
1F9B 27EE CLR R30
1F9C 940C1FAA JMP pop
push_gset5:
1F9E 92FA ST R15,-Y
1F9F 92EA ST R14,-Y
push_gset4:
1FA0 92DA ST R13,-Y
1FA1 92CA ST R12,-Y
push_gset3:
1FA2 92BA ST R11,-Y
1FA3 92AA ST R10,-Y
push_gset2:
1FA4 937A ST R23,-Y
1FA5 936A ST R22,-Y
push_gset1:
1FA6 935A ST R21,-Y
1FA7 934A ST R20,-Y
1FA8 9508 RET
pop_gset1:
1FA9 E0E1 LDI R30,1
pop:
1FAA 9149 LD R20,Y+
1FAB 9159 LD R21,Y+
1FAC FDE0 SBRC R30,0
1FAD 9508 RET
1FAE 9169 LD R22,Y+
1FAF 9179 LD R23,Y+
1FB0 FDE1 SBRC R30,1
1FB1 9508 RET
1FB2 90A9 LD R10,Y+
1FB3 90B9 LD R11,Y+
1FB4 FDE2 SBRC R30,2
1FB5 9508 RET
1FB6 90C9 LD R12,Y+
1FB7 90D9 LD R13,Y+
1FB8 FDE3 SBRC R30,3
1FB9 9508 RET
1FBA 90E9 LD R14,Y+
1FBB 90F9 LD R15,Y+
1FBC 9508 RET
lsl32:
1FBD 920F PUSH R0
1FBE 9009 LD R0,Y+
1FBF 2000 TST R0
1FC0 F031 BEQ 0x1FC7
1FC1 0F00 LSL R16
1FC2 1F11 ROL R17
1FC3 1F22 ROL R18
1FC4 1F33 ROL R19
1FC5 940A DEC R0
1FC6 CFF8 RJMP 0x1FBF
1FC7 900F POP R0
1FC8 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -