📄 avr-bootloader.lst
字号:
FD4F E40F LDI R16,0x4F
FD50 DFB6 RCALL _uart_putchar
FD51 E40B LDI R16,0x4B
FD52 DFB4 RCALL _uart_putchar
FD53 E30F LDI R16,0x3F
FD54 DFB2 RCALL _uart_putchar
(0125) uart_putchar(0x0d);uart_putchar(0x0a);
FD55 E00D LDI R16,0xD
FD56 DFB0 RCALL _uart_putchar
FD57 E00A LDI R16,0xA
FD58 DFAE RCALL _uart_putchar
(0126) while(!(UCSR0A&0x20));
FD59 9B5D SBIS 0x0B,5
FD5A CFFE RJMP 0xFD59
(0127) MCUCR=0x01;
FD5B E081 LDI R24,1
FD5C BF85 OUT 0x35,R24
(0128) MCUCR=0x00;
FD5D 2422 CLR R2
FD5E BE25 OUT 0x35,R2
(0129) RAMPZ=0x00;
FD5F BE2B OUT 0x3B,R2
(0130) asm("jmp 0x0000\n");
FD60 940C 0000 JMP 0x0000
FD62 9508 RET
(0131) }
(0132)
(0133) //主程序
(0134) void main(void)
(0135) {
(0136) int i=0;
_main:
timercount --> R12
crc --> R10
packNO --> R22
i --> R10
bufferPoint --> R20
FD63 24AA CLR R10
FD64 24BB CLR R11
(0137) unsigned char timercount=0;
FD65 24CC CLR R12
(0138) unsigned char packNO=1;
FD66 E061 LDI R22,1
(0139) int bufferPoint=0;
FD67 2744 CLR R20
FD68 2755 CLR R21
(0140) unsigned int crc;
(0141) //初始化M128的USART0
(0142) UBRR0H=BAUD_H;
FD69 2422 CLR R2
FD6A 9220 0090 STS 0x0090,R2
(0143) UBRR0L=BAUD_L;
FD6C E187 LDI R24,0x17
FD6D B989 OUT 0x09,R24
(0144) UCSR0B=0x18;
FD6E E188 LDI R24,0x18
FD6F B98A OUT 0x0A,R24
(0145) UCSR0C=0x0E;
FD70 E08E LDI R24,0xE
FD71 9380 0095 STS 0x0095,R24
(0146) OCR0=0xEA;
FD73 EE8A LDI R24,0xEA
FD74 BF81 OUT 0x31,R24
(0147) //////////
(0148) MCUCR = 0x00;
FD75 BE25 OUT 0x35,R2
(0149) EICRA = 0x00; //extended ext ints
FD76 9220 006A STS 0x006A,R2
(0150) EICRB = 0x00; //extended ext ints
FD78 BE2A OUT 0x3A,R2
(0151) EIMSK = 0x00;
FD79 BE29 OUT 0x39,R2
(0152) TIMSK = 0x00; //timer interrupt sources
FD7A BE27 OUT 0x37,R2
(0153) ETIMSK = 0x00; //extended timer interrupt sources
FD7B 9220 007D STS 0x007D,R2
(0154)
(0155) TCCR0 = 0x00; //stop
FD7D BE23 OUT 0x33,R2
(0156) ASSR = 0x00; //set async mode
FD7E BE20 OUT 0x30,R2
(0157) TCNT0 = 0x29; //set count
FD7F E289 LDI R24,0x29
FD80 BF82 OUT 0x32,R24
(0158) OCR0 = 0xD7;
FD81 ED87 LDI R24,0xD7
FD82 BF81 OUT 0x31,R24
FD83 C00A RJMP 0xFD8E
(0159) //TCCR0 = 0x07; //start timer
(0160) ///////////
(0161) while(startupString[i]!='\0')
(0162) {
(0163) uart_putchar(startupString[i]);
FD84 E88C LDI R24,0x8C
FD85 EF98 LDI R25,0xF8
FD86 01F5 MOVW R30,R10
FD87 0FE8 ADD R30,R24
FD88 1FF9 ADC R31,R25
FD89 9106 ELPM R16,248(Z)
FD8A DF7C RCALL _uart_putchar
(0164) i++;
FD8B 01C5 MOVW R24,R10
FD8C 9601 ADIW R24,1
FD8D 015C MOVW R10,R24
FD8E E88C LDI R24,0x8C
FD8F EF98 LDI R25,0xF8
FD90 01F5 MOVW R30,R10
FD91 0FE8 ADD R30,R24
FD92 1FF9 ADC R31,R25
FD93 9026 ELPM R2,248(Z)
FD94 2022 TST R2
FD95 F771 BNE 0xFD84
(0165) }
(0166) TCCR0 = 0x07; //start timer
FD96 E087 LDI R24,7
FD97 BF83 OUT 0x33,R24
FD98 C015 RJMP 0xFDAE
(0167) //////3秒等待PC机发'd',否则退出Bootloader程序,从0x0000处执行应用程序
(0168) while(1)
(0169) {
(0170) if(uart_getchar()=='d')break;
FD99 DF71 RCALL _uart_getchar
FD9A 3604 CPI R16,0x64
FD9B E0E0 LDI R30,0
FD9C 071E CPC R17,R30
FD9D F409 BNE 0xFD9F
FD9E C020 RJMP 0xFDBF
(0171) if(TIFR&0x02)
FD9F B626 IN R2,0x36
FDA0 FE21 SBRS R2,1
FDA1 C00C RJMP 0xFDAE
(0172) {
(0173) if(++timercount>200) quit(); //3秒
FDA2 2D8C MOV R24,R12
FDA3 5F8F SUBI R24,0xFF
FDA4 2EC8 MOV R12,R24
FDA5 EC88 LDI R24,0xC8
FDA6 158C CP R24,R12
FDA7 F408 BCC 0xFDA9
FDA8 DFA6 RCALL _quit
(0174) // if(++timercount>20) quit(); //1秒 林树亮 2007-6-25改
(0175)
(0176) TCNT0 = 0x29; //set count
FDA9 E289 LDI R24,0x29
FDAA BF82 OUT 0x32,R24
(0177) TIFR=TIFR|0x02;
FDAB B786 IN R24,0x36
FDAC 6082 ORI R24,2
FDAD BF86 OUT 0x36,R24
FDAE CFEA RJMP 0xFD99
(0178) }
(0179) }
(0180)
(0181) ////每秒向PC机发送一个控制字符C,等待控制字
(0182) while(uart_getchar()!=XMODEM_SOH)
(0183) {
(0184) if(TIFR&0x02)
FDAF B626 IN R2,0x36
FDB0 FE21 SBRS R2,1
FDB1 C00D RJMP 0xFDBF
(0185) {
(0186) if(++timercount>67)
FDB2 2D8C MOV R24,R12
FDB3 5F8F SUBI R24,0xFF
FDB4 2EE8 MOV R14,R24
FDB5 2EC8 MOV R12,R24
FDB6 E483 LDI R24,0x43
FDB7 158C CP R24,R12
FDB8 F418 BCC 0xFDBC
(0187) {
(0188) uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);
FDB9 E403 LDI R16,0x43
FDBA DF4C RCALL _uart_putchar
(0189) timercount=0;
FDBB 24CC CLR R12
(0190) }
(0191) TIFR=TIFR|0x02;
FDBC B786 IN R24,0x36
FDBD 6082 ORI R24,2
FDBE BF86 OUT 0x36,R24
FDBF DF4B RCALL _uart_getchar
FDC0 0178 MOVW R14,R16
FDC1 3001 CPI R16,1
FDC2 E0E0 LDI R30,0
FDC3 071E CPC R17,R30
FDC4 F751 BNE 0xFDAF
(0192) }
(0193) }
(0194) //////开始接收数据块
(0195) do
(0196) {
(0197) if((packNO==uart_waitchar())&&(packNO==(~uart_waitchar())))
FDC5 DF54 RCALL _uart_waitchar
FDC6 2EC0 MOV R12,R16
FDC7 1760 CP R22,R16
FDC8 F009 BEQ 0xFDCA
FDC9 C05A RJMP 0xFE24
FDCA DF4F RCALL _uart_waitchar
FDCB 2EC0 MOV R12,R16
FDCC 2C2C MOV R2,R12
FDCD 9420 COM R2
FDCE 1562 CP R22,R2
FDCF F009 BEQ 0xFDD1
FDD0 C053 RJMP 0xFE24
(0198) {
(0199) for(i=0;i<128;i++)
FDD1 24AA CLR R10
FDD2 24BB CLR R11
(0200) {
(0201) data[bufferPoint]=uart_waitchar();
FDD3 DF46 RCALL _uart_waitchar
FDD4 2EC0 MOV R12,R16
FDD5 E084 LDI R24,4
FDD6 E091 LDI R25,1
FDD7 01FA MOVW R30,R20
FDD8 0FE8 ADD R30,R24
FDD9 1FF9 ADC R31,R25
FDDA 82C0 STD Z+0,R12
(0202) bufferPoint++;
FDDB 5F4F SUBI R20,0xFF
FDDC 4F5F SBCI R21,0xFF
FDDD 01C5 MOVW R24,R10
FDDE 9601 ADIW R24,1
FDDF 015C MOVW R10,R24
FDE0 3880 CPI R24,0x80
FDE1 E0E0 LDI R30,0
FDE2 079E CPC R25,R30
FDE3 F37C BLT 0xFDD3
(0203) }
(0204) crc=uart_waitchar()<<8; //修改处
FDE4 DF35 RCALL _uart_waitchar
FDE5 2EA0 MOV R10,R16
FDE6 2C2A MOV R2,R10
FDE7 2433 CLR R3
FDE8 2C32 MOV R3,R2
FDE9 2422 CLR R2
FDEA 0151 MOVW R10,R2
(0205) crc+=uart_waitchar(); //修改处
FDEB DF2E RCALL _uart_waitchar
FDEC 2EC0 MOV R12,R16
FDED 2C2C MOV R2,R12
FDEE 2433 CLR R3
FDEF 0CA2 ADD R10,R2
FDF0 1CB3 ADC R11,R3
(0206) if(calcrc(&data[bufferPoint-128],128)==crc)
FDF1 E820 LDI R18,0x80
FDF2 E030 LDI R19,0
FDF3 E884 LDI R24,0x84
FDF4 E090 LDI R25,0
FDF5 018A MOVW R16,R20
FDF6 0F08 ADD R16,R24
FDF7 1F19 ADC R17,R25
FDF8 DF2C RCALL _calcrc
FDF9 0168 MOVW R12,R16
FDFA 150A CP R16,R10
FDFB 051B CPC R17,R11
FDFC F521 BNE 0xFE21
(0207) {
FDFD C01B RJMP 0xFE19
(0208) while(bufferPoint>=SPM_PAGESIZE)
(0209) {
(0210) write_one_page();
FDFE DECE RCALL _write_one_page
(0211) address+=SPM_PAGESIZE;
FDFF E080 LDI R24,0
FE00 E091 LDI R25,1
FE01 E0A0 LDI R26,0
FE02 E0B0 LDI R27,0
FE03 9040 0102 LDS R4,address+2
FE05 9050 0103 LDS R5,address+3
FE07 9020 0100 LDS R2,address
FE09 9030 0101 LDS R3,address+1
FE0B 0E28 ADD R2,R24
FE0C 1E39 ADC R3,R25
FE0D 1E4A ADC R4,R26
FE0E 1E5B ADC R5,R27
FE0F 9230 0101 STS address+1,R3
FE11 9220 0100 STS address,R2
FE13 9250 0103 STS address+3,R5
FE15 9240 0102 STS address+2,R4
(0212) bufferPoint=0;
FE17 2744 CLR R20
FE18 2755 CLR R21
FE19 3040 CPI R20,0
FE1A E0E1 LDI R30,1
FE1B 075E CPC R21,R30
FE1C F70C BGE 0xFDFE
(0213) }
(0214) uart_putchar(XMODEM_ACK);
FE1D E006 LDI R16,6
FE1E DEE8 RCALL _uart_putchar
(0215) packNO++;
FE1F 9563 INC R22
(0216) }
FE20 C005 RJMP 0xFE26
(0217) else
(0218) {
(0219) uart_putchar(XMODEM_NAK);
FE21 E105 LDI R16,0x15
FE22 DEE4 RCALL _uart_putchar
(0220) }
(0221) }
FE23 C002 RJMP 0xFE26
(0222) else
(0223) {
(0224) uart_putchar(XMODEM_NAK);
FE24 E105 LDI R16,0x15
FE25 DEE1 RCALL _uart_putchar
(0225) }
(0226) }
(0227) while(uart_waitchar()!=XMODEM_EOT);
FE26 DEF3 RCALL _uart_waitchar
FE27 2EA0 MOV R10,R16
FE28 3004 CPI R16,4
FE29 F009 BEQ 0xFE2B
FE2A CF9A RJMP 0xFDC5
(0228) uart_putchar(XMODEM_ACK);
FE2B E006 LDI R16,6
FE2C DEDA RCALL _uart_putchar
(0229) if(bufferPoint)
FE2D 3040 CPI R20,0
FE2E 0745 CPC R20,R21
FE2F F009 BEQ 0xFE31
(0230) write_one_page();
FE30 DE9C RCALL _write_one_page
(0231) quit();
FILE: <library>
FE31 DF1D RCALL _quit
FE32 9508 RET
push_arg4:
FE33 933A ST R19,-Y
FE34 932A ST R18,-Y
push_arg2:
FE35 931A ST R17,-Y
FE36 930A ST R16,-Y
FE37 9508 RET
push_xgset300C:
FE38 935A ST R21,-Y
FE39 934A ST R20,-Y
FE3A 92BA ST R11,-Y
FE3B 92AA ST R10,-Y
FE3C 9508 RET
pop_xgset300C:
FE3D 90A9 LD R10,Y+
FE3E 90B9 LD R11,Y+
FE3F 9149 LD R20,Y+
FE40 9159 LD R21,Y+
FE41 9508 RET
push_xgsetF00C:
FE42 937A ST R23,-Y
FE43 936A ST R22,-Y
FE44 935A ST R21,-Y
FE45 934A ST R20,-Y
FE46 92BA ST R11,-Y
FE47 92AA ST R10,-Y
FE48 9508 RET
pop_xgsetF00C:
FE49 90A9 LD R10,Y+
FE4A 90B9 LD R11,Y+
FE4B 9149 LD R20,Y+
FE4C 9159 LD R21,Y+
FE4D 9169 LD R22,Y+
FE4E 9179 LD R23,Y+
FE4F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -