📄 bootloader.lst
字号:
1CDD 1760 CP R22,R16
1CDE F411 BNE 0x1CE1
(0138) return 1;
1CDF E001 LDI R16,1
1CE0 C001 RJMP 0x1CE2
(0139) else
(0140) return 0;
1CE1 2700 CLR R16
1CE2 940E1DB3 CALL pop_gset3
1CE4 9508 RET
_WriteFlash:
TempInt --> R20
i --> R22
1CE5 940E1DBC CALL push_gset2
(0141) }
(0142)
(0143) /*****************************************************************************/
(0144) void WriteFlash(void)
(0145) {
(0146) unsigned int i;
(0147) unsigned int TempInt;
(0148) for (i=0;i<PageByte;i+=2)
1CE7 2766 CLR R22
1CE8 2777 CLR R23
1CE9 C017 RJMP 0x1D01
(0149) {
(0150) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
1CEA E684 LDI R24,0x64
1CEB E090 LDI R25,0
1CEC 01FB MOVW R30,R22
1CED 9631 ADIW R30,1
1CEE 0FE8 ADD R30,R24
1CEF 1FF9 ADC R31,R25
1CF0 8020 LDD R2,Z+0
1CF1 2433 CLR R3
1CF2 2C32 MOV R3,R2
1CF3 2422 CLR R2
1CF4 01FB MOVW R30,R22
1CF5 0FE8 ADD R30,R24
1CF6 1FF9 ADC R31,R25
1CF7 8140 LDD R20,Z+0
1CF8 2755 CLR R21
1CF9 0D42 ADD R20,R2
1CFA 1D53 ADC R21,R3
(0151) fill_temp_buffer(TempInt,i); //call asm routine.
1CFB 019B MOVW R18,R22
1CFC 018A MOVW R16,R20
1CFD 940E1C54 CALL _fill_temp_buffer
1CFF 5F6E SUBI R22,0xFE
1D00 4F7F SBCI R23,0xFF
1D01 3860 CPI R22,0x80
1D02 E0E0 LDI R30,0
1D03 077E CPC R23,R30
1D04 F328 BCS 0x1CEA
(0152) }
(0153) write_page(PageAddress,0x03); //擦除页
1D05 E023 LDI R18,3
1D06 91000060 LDS R16,PageAddress
1D08 91100061 LDS R17,PageAddress+1
1D0A 940E1C4E CALL _write_page
(0154) write_page(PageAddress,0x05); //写页数据
1D0C E025 LDI R18,5
1D0D 91000060 LDS R16,PageAddress
1D0F 91100061 LDS R17,PageAddress+1
1D11 940E1C4E CALL _write_page
(0155)
(0156) enableRWW();
1D13 940E1C68 CALL _enableRWW
1D15 940E1DB0 CALL pop_gset2
1D17 9508 RET
_CheckFlash:
TempInt2 --> R20
TempInt --> R22
i --> R10
1D18 940E1DBA CALL push_gset3
(0157) }
(0158)
(0159) /*****************************************************************************/
(0160)
(0161) char CheckFlash(void)
(0162) {
(0163) unsigned char i;
(0164) unsigned int TempInt;
(0165) unsigned int TempInt2;
(0166)
(0167) for (i=0;i<PageByte;i+=2)
1D1A 24AA CLR R10
1D1B C028 RJMP 0x1D44
(0168) {
(0169) TempInt = read_program_memory(PageAddress + i,0x00);
1D1C 2722 CLR R18
1D1D 2C2A MOV R2,R10
1D1E 2433 CLR R3
1D1F 91000060 LDS R16,PageAddress
1D21 91100061 LDS R17,PageAddress+1
1D23 0D02 ADD R16,R2
1D24 1D13 ADC R17,R3
1D25 940E1C61 CALL _read_program_memory
1D27 01B8 MOVW R22,R16
(0170) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
1D28 E685 LDI R24,0x65
1D29 E090 LDI R25,0
1D2A 2DEA MOV R30,R10
1D2B 27FF CLR R31
1D2C 0FE8 ADD R30,R24
1D2D 1FF9 ADC R31,R25
1D2E 8020 LDD R2,Z+0
1D2F 2433 CLR R3
1D30 2C32 MOV R3,R2
1D31 2422 CLR R2
1D32 E684 LDI R24,0x64
1D33 E090 LDI R25,0
1D34 2DEA MOV R30,R10
1D35 27FF CLR R31
1D36 0FE8 ADD R30,R24
1D37 1FF9 ADC R31,R25
1D38 8140 LDD R20,Z+0
1D39 2755 CLR R21
1D3A 0D42 ADD R20,R2
1D3B 1D53 ADC R21,R3
(0171) if (TempInt != TempInt2)
1D3C 1704 CP R16,R20
1D3D 0715 CPC R17,R21
1D3E F011 BEQ 0x1D41
(0172) return 0;
1D3F 2700 CLR R16
1D40 C007 RJMP 0x1D48
1D41 2D8A MOV R24,R10
1D42 5F8E SUBI R24,0xFE
1D43 2EA8 MOV R10,R24
1D44 2D8A MOV R24,R10
1D45 3880 CPI R24,0x80
1D46 F2A8 BCS 0x1D1C
(0173) }
(0174) return 1;
1D47 E001 LDI R16,1
1D48 940E1DB3 CALL pop_gset3
1D4A 9508 RET
(0175) }
(0176) /*****************************************************************************/
(0177) /* Serial Port Code */
(0178) /*****************************************************************************/
(0179) unsigned char IsChar(void)
(0180) {
(0181) if(UCSRA & 0x80)
_IsChar:
1D4B 9B5F SBIS 0x0B,7
1D4C C002 RJMP 0x1D4F
(0182) return 1;
1D4D E001 LDI R16,1
1D4E C001 RJMP 0x1D50
(0183) else
(0184) return 0;
1D4F 2700 CLR R16
1D50 9508 RET
(0185) }
(0186) /*****************************************************************************/
(0187) /* 字符输入函数 */
(0188) unsigned char RecChar(void)
(0189) {
(0190) while(!(UCSRA & 0x80));
_RecChar:
1D51 9B5F SBIS 0x0B,7
1D52 CFFE RJMP _RecChar
(0191) return UDR;
1D53 B10C IN R16,0x0C
1D54 9508 RET
(0192) }
(0193) /*****************************************************************************/
(0194) void SendChar(unsigned char c)
(0195) {
(0196) while (!(UCSRA&(1<<UDRE)));
_SendChar:
c --> R16
1D55 9B5D SBIS 0x0B,5
1D56 CFFE RJMP _SendChar
(0197) UDR=c;
1D57 B90C OUT 0x0C,R16
1D58 9508 RET
(0198) }
(0199) void delay(void)
(0200) {
(0201) unsigned int i;
(0202) for (i=0;i<65530;i++);
_delay:
i --> R16
1D59 2700 CLR R16
1D5A 2711 CLR R17
1D5B C002 RJMP 0x1D5E
1D5C 5F0F SUBI R16,0xFF
1D5D 4F1F SBCI R17,0xFF
1D5E 3F0A CPI R16,0xFA
1D5F EFEF LDI R30,0xFF
1D60 071E CPC R17,R30
1D61 F3D0 BCS 0x1D5C
1D62 9508 RET
(0203) }
(0204)
(0205) /*****************************************************************************/
(0206) void ExecCode(void)
(0207) {
(0208) #ifdef RAMPZ_FLAG
(0209) RAMPZ = 0;
(0210) #endif
(0211) INTVECREG=0x01; //中断向量表移位允许
_ExecCode:
1D63 E081 LDI R24,1
1D64 BF8B OUT 0x3B,R24
(0212) INTVECREG=0x00; //中断向量指向应用程序区
1D65 2422 CLR R2
1D66 BE2B OUT 0x3B,R2
(0213) asm("jmp 0x0000");
1D67 940C0000 JMP 0x0
1D69 9508 RET
(0214) }
(0215)
(0216) void main(void)
(0217) {
(0218) unsigned char BootFlag;
(0219)
(0220) #ifdef InteClk //如果使用内部时钟,读取时钟校准值
(0221) OSCCAL=read_flash(OscAddress);
_main:
BootFlag --> R20
1D6A EF0F LDI R16,0xFF
1D6B E11F LDI R17,0x1F
1D6C 940E1C5C CALL _read_flash
1D6E BF01 OUT 0x31,R16
(0222) #endif
(0223)
(0224) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
1D6F E886 LDI R24,0x86
1D70 BD80 OUT 0x20,R24
(0225) UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
1D71 E188 LDI R24,0x18
1D72 B98A OUT 0x0A,R24
(0226) UBRR = BAU;
1D73 E187 LDI R24,0x17
1D74 B989 OUT 0x09,R24
(0227)
(0228)
(0229) SendChar('>'); //通知PC机,BOOT下载准备就绪
1D75 E30E LDI R16,0x3E
1D76 DFDE RCALL _SendChar
(0230) delay(); //延时等待PC机响应
1D77 DFE1 RCALL _delay
(0231) delay();
1D78 DFE0 RCALL _delay
(0232) delay();
1D79 DFDF RCALL _delay
(0233) delay();
1D7A DFDE RCALL _delay
(0234) delay();
1D7B DFDD RCALL _delay
(0235) delay();
1D7C DFDC RCALL _delay
(0236) delay();
1D7D DFDB RCALL _delay
(0237) delay();
1D7E DFDA RCALL _delay
(0238)
(0239) BootFlag=UDR;
1D7F B14C IN R20,0x0C
(0240) if (BootFlag == '<')
1D80 334C CPI R20,0x3C
1D81 F531 BNE 0x1DA8
(0241) {
(0242) SendChar(ChipType);
1D82 E301 LDI R16,0x31
1D83 DFD1 RCALL _SendChar
(0243) while (RecChar()!='N');
1D84 DFCC RCALL _RecChar
1D85 340E CPI R16,0x4E
1D86 F7E9 BNE 0x1D84
(0244) SendChar(BootSize);
1D87 E604 LDI R16,0x64
1D88 DFCC RCALL _SendChar
(0245) while (RecChar()!='N');
1D89 DFC7 RCALL _RecChar
1D8A 340E CPI R16,0x4E
1D8B F7E9 BNE 0x1D89
(0246) SendChar(BootVer);
1D8C E606 LDI R16,0x66
1D8D DFC7 RCALL _SendChar
1D8E C018 RJMP 0x1DA7
(0247) while (1)
(0248) {
(0249) switch (RecChar())
1D8F DFC1 RCALL _RecChar
1D90 2F40 MOV R20,R16
1D91 2755 CLR R21
1D92 3445 CPI R20,0x45
1D93 E0E0 LDI R30,0
1D94 075E CPC R21,R30
1D95 F059 BEQ 0x1DA1
1D96 3445 CPI R20,0x45
1D97 E0E0 LDI R30,0
1D98 075E CPC R21,R30
1D99 F06C BLT 0x1DA7
1D9A 3547 CPI R20,0x57
1D9B E0E0 LDI R30,0
1D9C 075E CPC R21,R30
1D9D F009 BEQ 0x1D9F
1D9E C008 RJMP 0x1DA7
(0250) {
(0251) case 'W': FlashLoad(); break;
1D9F DED3 RCALL _FlashLoad
1DA0 C006 RJMP 0x1DA7
(0252) case 'E': {
(0253) SendChar('E'); //通知PC机,进入运用程序区
1DA1 E405 LDI R16,0x45
1DA2 DFB2 RCALL _SendChar
(0254) while (RecChar()!='N');
1DA3 DFAD RCALL _RecChar
1DA4 340E CPI R16,0x4E
1DA5 F7E9 BNE 0x1DA3
(0255) ExecCode();
1DA6 DFBC RCALL _ExecCode
1DA7 CFE7 RJMP 0x1D8F
(0256) } break;
(0257) default : break;
(0258) }
(0259) }
(0260) }
(0261) SendChar('E'); //通知PC机,进入运用程序区
1DA8 E405 LDI R16,0x45
1DA9 DFAB RCALL _SendChar
(0262) //while (RecChar()!='N');
(0263) delay();
1DAA DFAE RCALL _delay
(0264) delay();
1DAB DFAD RCALL _delay
(0265) delay();
1DAC DFAC RCALL _delay
(0266) delay();
1DAD DFAB RCALL _delay
(0267) ExecCode();
FILE: <library>
1DAE DFB4 RCALL _ExecCode
1DAF 9508 RET
pop_gset2:
1DB0 E0E2 LDI R30,2
1DB1 940C1DC2 JMP pop
pop_gset3:
1DB3 E0E4 LDI R30,4
1DB4 940C1DC2 JMP pop
push_gset5:
1DB6 92FA ST R15,-Y
1DB7 92EA ST R14,-Y
push_gset4:
1DB8 92DA ST R13,-Y
1DB9 92CA ST R12,-Y
push_gset3:
1DBA 92BA ST R11,-Y
1DBB 92AA ST R10,-Y
push_gset2:
1DBC 937A ST R23,-Y
1DBD 936A ST R22,-Y
push_gset1:
1DBE 935A ST R21,-Y
1DBF 934A ST R20,-Y
1DC0 9508 RET
pop_gset1:
1DC1 E0E1 LDI R30,1
pop:
1DC2 9149 LD R20,Y+
1DC3 9159 LD R21,Y+
1DC4 FDE0 SBRC R30,0
1DC5 9508 RET
1DC6 9169 LD R22,Y+
1DC7 9179 LD R23,Y+
1DC8 FDE1 SBRC R30,1
1DC9 9508 RET
1DCA 90A9 LD R10,Y+
1DCB 90B9 LD R11,Y+
1DCC FDE2 SBRC R30,2
1DCD 9508 RET
1DCE 90C9 LD R12,Y+
1DCF 90D9 LD R13,Y+
1DD0 FDE3 SBRC R30,3
1DD1 9508 RET
1DD2 90E9 LD R14,Y+
1DD3 90F9 LD R15,Y+
1DD4 9508 RET
lsl16:
1DD5 2322 TST R18
1DD6 F021 BEQ 0x1DDB
1DD7 0F00 LSL R16
1DD8 1F11 ROL R17
1DD9 952A DEC R18
1DDA CFFA RJMP lsl16
1DDB 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -