?? bldstk500.lst
字號:
1E8D 079E CPC R25,R30
1E8E F340 BCS 0x1E77
(0257) }
(0258) address+=SPM_PAGESIZE<<2;
1E8F 9180006C LDS R24,address
1E91 9190006D LDS R25,address+1
1E93 5080 SUBI R24,0
1E94 4F9F SBCI R25,0xFF
1E95 9390006D STS address+1,R25
1E97 9380006C STS address,R24
(0259) num_bytes = (SPM_PAGESIZE<<2)+3;
1E99 E083 LDI R24,3
1E9A E091 LDI R25,1
1E9B 839F STD Y+7,R25
1E9C 838E STD Y+6,R24
(0260) msg_buffer[0] = CMD_READ_FLASH_ISP;
1E9D E184 LDI R24,0x14
1E9E 93800077 STS msg_buffer,R24
(0261) msg_buffer[1] = STATUS_CMD_OK;
1EA0 2422 CLR R2
1EA1 92200078 STS msg_buffer+1,R2
(0262) msg_buffer[(SPM_PAGESIZE<<2)+2] = STATUS_CMD_OK;
1EA3 92200179 STS 0x179,R2
(0263) }
1EA5 C05C RJMP 0x1F02
(0264) //命令CMD_READ_FUSE_ISP
(0265) else if(cmd==CMD_READ_FUSE_ISP)
1EA6 2D8E MOV R24,R14
1EA7 3188 CPI R24,0x18
1EA8 F571 BNE 0x1ED7
(0266) {
(0267) switch(msg_buffer[2])
1EA9 90A00079 LDS R10,msg_buffer+2
1EAB 24BB CLR R11
1EAC 01C5 MOVW R24,R10
1EAD 3580 CPI R24,0x50
1EAE E0E0 LDI R30,0
1EAF 079E CPC R25,R30
1EB0 F051 BEQ 0x1EBB
1EB1 3580 CPI R24,0x50
1EB2 E0E0 LDI R30,0
1EB3 079E CPC R25,R30
1EB4 F0AC BLT 0x1ECA
1EB5 01C5 MOVW R24,R10
1EB6 3588 CPI R24,0x58
1EB7 E0E0 LDI R30,0
1EB8 079E CPC R25,R30
1EB9 F049 BEQ 0x1EC3
1EBA C00F RJMP 0x1ECA
(0268) {
(0269) case 0x50:
(0270) msg_buffer[2] = read_program_memory(0x0000,1); //讀熔絲位
1EBB E021 LDI R18,1
1EBC 2700 CLR R16
1EBD 2711 CLR R17
1EBE 940E1F8A CALL _read_program_memory
1EC0 93000079 STS msg_buffer+2,R16
(0271) break;
1EC2 C007 RJMP 0x1ECA
(0272) case 0x58:
(0273) msg_buffer[2] = read_program_memory(0x0003,1); //讀高熔絲位
1EC3 E021 LDI R18,1
1EC4 E003 LDI R16,3
1EC5 E010 LDI R17,0
1EC6 940E1F8A CALL _read_program_memory
1EC8 93000079 STS msg_buffer+2,R16
(0274) break;
(0275) default:
(0276) break;
(0277) }
(0278) num_bytes = 4;
1ECA E084 LDI R24,4
1ECB E090 LDI R25,0
1ECC 839F STD Y+7,R25
1ECD 838E STD Y+6,R24
(0279) msg_buffer[0] = CMD_READ_FUSE_ISP;
1ECE E188 LDI R24,0x18
1ECF 93800077 STS msg_buffer,R24
(0280) msg_buffer[1] = STATUS_CMD_OK;
1ED1 2422 CLR R2
1ED2 92200078 STS msg_buffer+1,R2
(0281) msg_buffer[3] = STATUS_CMD_OK;
1ED4 9220007A STS msg_buffer+3,R2
(0282) }
1ED6 C02B RJMP 0x1F02
(0283) //命令CMD_PROGRAM_LOCK_ISP
(0284) else if(cmd==CMD_PROGRAM_LOCK_ISP)
1ED7 2D8E MOV R24,R14
1ED8 3189 CPI R24,0x19
1ED9 F491 BNE 0x1EEC
(0285) {
(0286) write_lock_bits (msg_buffer[4]|0xC0);
1EDA 9100007B LDS R16,0x7B
1EDC 6C00 ORI R16,0xC0
1EDD 940E1F7F CALL _write_lock_bits
(0287) num_bytes = 3;
1EDF E083 LDI R24,3
1EE0 E090 LDI R25,0
1EE1 839F STD Y+7,R25
1EE2 838E STD Y+6,R24
(0288) msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
1EE3 E189 LDI R24,0x19
1EE4 93800077 STS msg_buffer,R24
(0289) msg_buffer[1] = STATUS_CMD_OK;
1EE6 2422 CLR R2
1EE7 92200078 STS msg_buffer+1,R2
(0290) msg_buffer[2] = STATUS_CMD_OK;
1EE9 92200079 STS msg_buffer+2,R2
(0291) }
1EEB C016 RJMP 0x1F02
(0292) //命令CMD_READ_LOCK_ISP
(0293) else if(cmd==CMD_READ_LOCK_ISP)
1EEC 2D8E MOV R24,R14
1EED 318A CPI R24,0x1A
1EEE F499 BNE 0x1F02
(0294) {
(0295) msg_buffer[2] = read_program_memory(0x0001,1);
1EEF E021 LDI R18,1
1EF0 E001 LDI R16,1
1EF1 E010 LDI R17,0
1EF2 940E1F8A CALL _read_program_memory
1EF4 93000079 STS msg_buffer+2,R16
(0296) num_bytes = 4;
1EF6 E084 LDI R24,4
1EF7 E090 LDI R25,0
1EF8 839F STD Y+7,R25
1EF9 838E STD Y+6,R24
(0297) msg_buffer[0] = CMD_READ_LOCK_ISP;
1EFA E18A LDI R24,0x1A
1EFB 93800077 STS msg_buffer,R24
(0298) msg_buffer[1] = STATUS_CMD_OK;
1EFD 2422 CLR R2
1EFE 92200078 STS msg_buffer+1,R2
(0299) msg_buffer[3] = STATUS_CMD_OK;
1F00 9220007A STS msg_buffer+3,R2
(0300) }
(0301) //傳送緩沖區數據
(0302) if(num_bytes>0)
1F02 800E LDD R0,Y+6
1F03 801F LDD R1,Y+7
1F04 2000 TST R0
1F05 F419 BNE 0x1F09
1F06 2011 TST R1
1F07 F409 BNE 0x1F09
1F08 C059 RJMP 0x1F62
(0303) {
(0304) putChar(MESSAGE_START);
1F09 E10B LDI R16,0x1B
1F0A 940E1C53 CALL _putChar
(0305) checkSum=MESSAGE_START;
1F0C E18B LDI R24,0x1B
1F0D 93800075 STS checkSum,R24
(0306) putChar(seqNum);
1F0F 890B LDD R16,Y+19
1F10 940E1C53 CALL _putChar
(0307) checkSum^=seqNum;
1F12 90200075 LDS R2,checkSum
1F14 880B LDD R0,Y+19
1F15 2420 EOR R2,R0
1F16 92200075 STS checkSum,R2
(0308) tmp=(num_bytes&0xFF00)>>8;
1F18 818E LDD R24,Y+6
1F19 819F LDD R25,Y+7
1F1A 7080 ANDI R24,0
1F1B 2F89 MOV R24,R25
1F1C 2799 CLR R25
1F1D 8788 STD Y+8,R24
(0309) putChar(tmp);
1F1E 2F08 MOV R16,R24
1F1F 940E1C53 CALL _putChar
(0310) checkSum^=tmp;
1F21 90200075 LDS R2,checkSum
1F23 8408 LDD R0,Y+8
1F24 2420 EOR R2,R0
1F25 92200075 STS checkSum,R2
(0311) tmp=num_bytes&0x00FF;
1F27 818E LDD R24,Y+6
1F28 819F LDD R25,Y+7
1F29 7090 ANDI R25,0
1F2A 8788 STD Y+8,R24
(0312) putChar(tmp);
1F2B 2F08 MOV R16,R24
1F2C 940E1C53 CALL _putChar
(0313) checkSum^=tmp;
1F2E 90200075 LDS R2,checkSum
1F30 8408 LDD R0,Y+8
1F31 2420 EOR R2,R0
1F32 92200075 STS checkSum,R2
(0314) putChar(TOKEN);
1F34 E00E LDI R16,0xE
1F35 940E1C53 CALL _putChar
(0315) checkSum^=TOKEN;
1F37 E08E LDI R24,0xE
1F38 90200075 LDS R2,checkSum
1F3A 2628 EOR R2,R24
1F3B 92200075 STS checkSum,R2
(0316) for(i=0;i<num_bytes;i++)
1F3D 24CC CLR R12
1F3E 24DD CLR R13
1F3F C016 RJMP 0x1F56
(0317) {
(0318) putChar(msg_buffer[i]);
1F40 E787 LDI R24,0x77
1F41 E090 LDI R25,0
1F42 01F6 MOVW R30,R12
1F43 0FE8 ADD R30,R24
1F44 1FF9 ADC R31,R25
1F45 8100 LDD R16,Z+0
1F46 940E1C53 CALL _putChar
(0319) checkSum^=msg_buffer[i];
1F48 E787 LDI R24,0x77
1F49 E090 LDI R25,0
1F4A 01F6 MOVW R30,R12
1F4B 0FE8 ADD R30,R24
1F4C 1FF9 ADC R31,R25
1F4D 8020 LDD R2,Z+0
1F4E 90300075 LDS R3,checkSum
1F50 2432 EOR R3,R2
1F51 92300075 STS checkSum,R3
1F53 01C6 MOVW R24,R12
1F54 9601 ADIW R24,1
1F55 016C MOVW R12,R24
1F56 800E LDD R0,Y+6
1F57 801F LDD R1,Y+7
1F58 14C0 CP R12,R0
1F59 04D1 CPC R13,R1
1F5A F328 BCS 0x1F40
(0320) }
(0321) putChar(checkSum);
1F5B 91000075 LDS R16,checkSum
1F5D 940E1C53 CALL _putChar
(0322) checkSum=0x00;
1F5F 2422 CLR R2
1F60 92200075 STS checkSum,R2
(0323) }
1F62 9629 ADIW R28,0x9
1F63 940E1FA3 CALL pop_gset5
1F65 9622 ADIW R28,2
1F66 9508 RET
FILE: F:\job\stk500\AVRMEG~1\bldSTK500\self_prog.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **
(0003) ** 開 發 部
(0004) **
(0005) ** 文 件 名: self_prog.c
(0006) ** 最后修改日期: 2006-1-24 13:00
(0007) ** 描 述: SPM操作函數
(0008) ** 版 本: V1.0,根據machao程序改編
(0009) ** 主 控 芯 片:M16 晶振頻率:7.3728MHZ
(0010) **********************************************************************************************************/
(0011) #include<iom16v.h>
(0012) #include<macros.h>
(0013) #include"define.h"
(0014) #include"extern.h"
(0015)
(0016)
(0017) /**********************************************************************
(0018) functionName:void someNop(void)
(0019) description: 擦除(code=0x03)和寫入(code=0x05)一個Flash頁
(0020) **********************************************************************/
(0021) void boot_page_ew(uint16 pageAddr,uint08 code)
(0022) {
(0023) asm("mov r30,r16\n"
_boot_page_ew:
code --> R18
pageAddr --> R16
1F67 2FE0 MOV R30,R16
1F68 2FF1 MOV R31,R17
(0024) "mov r31,r17\n"); //將頁地址放入Z寄存器和RAMPZ的Bit0中
(0025) SPMCR = code; //寄存器SPMCSR中為操作碼
1F69 BF27 OUT 0x37,R18
(0026) asm("spm\n"); //對指定Flash頁進行操作
1F6A 95E8 SPM
1F6B 9508 RET
(0027) }
(0028)
(0029) /**********************************************************************
(0030) functionName:void boot_page_fill(uint16 address,uint16 data)
(0031) description: 填充Flash緩沖頁中的一個字
(0032) **********************************************************************/
(0033) void boot_page_fill(uint16 address,uint16 data)
(0034) {
(0035) asm("mov r30,r16\n"
_boot_page_fill:
data --> R18
address --> R16
1F6C 2FE0 MOV R30,R16
1F6D 2FF1 MOV R31,R17
1F6E 2E02 MOV R0,R18
1F6F 2E13 MOV R1,R19
(0036) "mov r31,r17\n" //Z寄存器中為填沖頁內地址
(0037) "mov r0,r18\n"
(0038) "mov r1,r19\n"); //R0R1中為一個指令字
(0039) SPMCR = 0x01;
1F70 E081 LDI R24,1
1F71 BF87 OUT 0x37,R24
(0040) asm("spm\n");
1F72 95E8 SPM
1F73 9508 RET
(0041) }
(0042)
(0043) /**********************************************************************
(0044) functionName:void wait_page_rw_ok(void)
(0045) description: 等待一個Flash頁的寫完成
(0046) **********************************************************************/
(0047) void wait_page_rw_ok(void)
(0048) {
_wait_page_rw_ok:
1F74 C006 RJMP 0x1F7B
(0049) while(SPMCR & 0x40)
(0050) {
(0051) while(SPMCR & 0x01);
1F75 B627 IN R2,0x37
1F76 FC20 SBRC R2,0
1F77 CFFD RJMP 0x1F75
(0052) SPMCR = 0x11;
1F78 E181 LDI R24,0x11
1F79 BF87 OUT 0x37,R24
(0053) asm("spm\n");
1F7A 95E8 SPM
1F7B B627 IN R2,0x37
1F7C FC26 SBRC R2,6
1F7D CFF7 RJMP 0x1F75
1F7E 9508 RET
(0054) }
(0055) }
(0056)
(0057)
(0058)
(0059)
(0060) /**********************************************************************
(0061) functionName:void write_lock_bits (unsigned char val)
(0062) description:寫鎖定位
(0063) **********************************************************************/
(0064) void write_lock_bits (unsigned char val)
(0065) {
(0066) asm("mov r0,r16\n");
_write_lock_bits:
val --> R16
1F7F 2E00 MOV R0,R16
(0067) SPMCR=0x09;
1F80 E089 LDI R24,0x9
1F81 BF87 OUT 0x37,R24
(0068) asm("spm\n");
1F82 95E8 SPM
(0069) while(SPMCR&BIT(0));
1F83 B627 IN R2,0x37
1F84 FC20 SBRC R2,0
1F85 CFFD RJMP 0x1F83
(0070) SPMCR = 0x11;
1F86 E181 LDI R24,0x11
1F87 BF87 OUT 0x37,R24
(0071) asm("spm\n");
1F88 95E8 SPM
1F89 9508 RET
(0072) }
(0073)
(0074) /**********************************************************************
(0075) functionName:uint08 read_program_memory (uint16 addr,uint08 cmd)
(0076) description: 返回addr地址數據,以字節為單位
(0077) cmd:
(0078) 0:讀flashrom
(0079) 1:讀熔絲位或者鎖定位
(0080) addr=0x0001 鎖定位
(0081) addr=0x0000 熔絲位低字節
(0082) addr=0x0003 熔絲位高字節
(0083) **********************************************************************/
(0084) uint08 read_program_memory(uint16 addr,uint08 cmd)
(0085) {
(0086) asm("mov r30,r16\n"
_read_program_memory:
cmd --> R18
addr --> R16
1F8A 2FE0 MOV R30,R16
1F8B 2FF1 MOV R31,R17
(0087) "mov r31,r17\n");
(0088) if(cmd)
1F8C 2322 TST R18
1F8D F011 BEQ 0x1F90
(0089) {
(0090) SPMCR=0x09;
1F8E E089 LDI R24,0x9
1F8F BF87 OUT 0x37,R24
(0091) }
(0092) asm("lpm r0,z\n");
1F90 9004 LPM R0,0(Z)
(0093) return(R0);
FILE: <library>
1F91 27EE CLR R30
1F92 27FF CLR R31
1F93 8100 LDD R16,Z+0
1F94 9508 RET
_memcpy:
1F95 2FA0 MOV R26,R16
1F96 2FB1 MOV R27,R17
1F97 2FE2 MOV R30,R18
1F98 2FF3 MOV R31,R19
1F99 8188 LDD R24,Y+0
1F9A 8199 LDD R25,Y+1
1F9B 3080 CPI R24,0
1F9C 0798 CPC R25,R24
1F9D C003 RJMP 0x1FA1
1F9E 9001 LD R0,Z+
1F9F 920D ST R0,X+
1FA0 9701 SBIW R24,1
1FA1 F7E1 BNE 0x1F9E
1FA2 9508 RET
pop_gset5:
1FA3 27EE CLR R30
1FA4 940C1FB2 JMP pop
push_gset5:
1FA6 92FA ST R15,-Y
1FA7 92EA ST R14,-Y
push_gset4:
1FA8 92DA ST R13,-Y
1FA9 92CA ST R12,-Y
push_gset3:
1FAA 92BA ST R11,-Y
1FAB 92AA ST R10,-Y
push_gset2:
1FAC 937A ST R23,-Y
1FAD 936A ST R22,-Y
push_gset1:
1FAE 935A ST R21,-Y
1FAF 934A ST R20,-Y
1FB0 9508 RET
pop_gset1:
1FB1 E0E1 LDI R30,1
pop:
1FB2 9149 LD R20,Y+
1FB3 9159 LD R21,Y+
1FB4 FDE0 SBRC R30,0
1FB5 9508 RET
1FB6 9169 LD R22,Y+
1FB7 9179 LD R23,Y+
1FB8 FDE1 SBRC R30,1
1FB9 9508 RET
1FBA 90A9 LD R10,Y+
1FBB 90B9 LD R11,Y+
1FBC FDE2 SBRC R30,2
1FBD 9508 RET
1FBE 90C9 LD R12,Y+
1FBF 90D9 LD R13,Y+
1FC0 FDE3 SBRC R30,3
1FC1 9508 RET
1FC2 90E9 LD R14,Y+
1FC3 90F9 LD R15,Y+
1FC4 9508 RET
lsl32:
1FC5 920F PUSH R0
1FC6 9009 LD R0,Y+
1FC7 2000 TST R0
1FC8 F031 BEQ 0x1FCF
1FC9 0F00 LSL R16
1FCA 1F11 ROL R17
1FCB 1F22 ROL R18
1FCC 1F33 ROL R19
1FCD 940A DEC R0
1FCE CFF8 RJMP 0x1FC7
1FCF 900F POP R0
1FD0 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -