📄 atmega128iap.lst
字号:
FD2C DFB1 RCALL _uart_putchar
FD2D E00A LDI R16,0xA
FD2E DFAF RCALL _uart_putchar
(0127) while(!(UCSR0A & 0x20)); //等待结束提示信息回送完成
FD2F 9B5D SBIS 0x0B,5
FD30 CFFE RJMP 0xFD2F
(0128) MCUCR = 0x01;
FD31 E081 LDI R24,1
FD32 BF85 OUT 0x35,R24
(0129) MCUCR = 0x00; //将中断向量表迁移到应用程序区头部
FD33 2422 CLR R2
FD34 BE25 OUT 0x35,R2
(0130) RAMPZ = 0x00; //RAMPZ/清零初始化
FD35 BE2B OUT 0x3B,R2
(0131) asm("jmp 0x0000\n"); //跳转到Flash的0x0000处,执行用户的应用程序
FD36 940C0000 JMP 0x0
(0132) }
FD38 9508 RET
_main:
timercount --> Y+2
crc --> R10
packNO --> R14
i --> Y+0
bufferPoint --> R12
FD39 9723 SBIW R28,3
(0133) //主程序
(0134) void main(void)
(0135) {
(0136) int i = 0;
FD3A 2400 CLR R0
FD3B 2411 CLR R1
FD3C 8219 STD Y+1,R1
FD3D 8208 STD Y+0,R0
(0137) unsigned char timercount = 0;
FD3E 820A STD Y+2,R0
(0138) unsigned char packNO = 1;
FD3F 24EE CLR R14
FD40 94E3 INC R14
(0139) int bufferPoint = 0;
FD41 24CC CLR R12
FD42 24DD CLR R13
(0140) unsigned int crc;
(0141) //初始化M128的USART0
(0142) UBRR0H = BAUD_H;
FD43 2422 CLR R2
FD44 92200090 STS 0x90,R2
(0143) UBRR0L = BAUD_L; //Set/ baud rate
FD46 E189 LDI R24,0x19
FD47 B989 OUT 0x09,R24
(0144) UCSR0B = 0x18; //Enable/ Receiver and Transmitter
FD48 E188 LDI R24,0x18
FD49 B98A OUT 0x0A,R24
(0145) UCSR0C = 0x0E; //Set/ frame format: 8data, 2stop bit
FD4A E08E LDI R24,0xE
FD4B 93800095 STS 0x95,R24
(0146) //初始化M128的T/C0,15ms自动重载
(0147) OCR0 = 0xEA;
FD4D EE8A LDI R24,0xEA
FD4E BF81 OUT 0x31,R24
(0148) TCCR0 = 0x0F;
FD4F E08F LDI R24,0xF
FD50 BF83 OUT 0x33,R24
FD51 C00D RJMP 0xFD5F
(0149) //向PC机发送开始提示信息
(0150) while(startupString[i]!='\0')
(0151) {
(0152) uart_putchar(startupString[i]);
FD52 E88C LDI R24,0x8C
FD53 EF98 LDI R25,0xF8
FD54 81E8 LDD R30,Y+0
FD55 81F9 LDD R31,Y+1
FD56 0FE8 ADD R30,R24
FD57 1FF9 ADC R31,R25
FD58 9106 ELPM R16,0(Z)
FD59 DF84 RCALL _uart_putchar
(0153) i++;
FD5A 8188 LDD R24,Y+0
FD5B 8199 LDD R25,Y+1
FD5C 9601 ADIW R24,1
FD5D 8399 STD Y+1,R25
FD5E 8388 STD Y+0,R24
FD5F E88C LDI R24,0x8C
FD60 EF98 LDI R25,0xF8
FD61 81E8 LDD R30,Y+0
FD62 81F9 LDD R31,Y+1
FD63 0FE8 ADD R30,R24
FD64 1FF9 ADC R31,R25
FD65 91E6 ELPM R30,0(Z)
FD66 23EE TST R30
FD67 F751 BNE 0xFD52
FD68 C014 RJMP 0xFD7D
(0154) }
(0155) //3/秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序
(0156) while(1)
(0157) {
(0158) if(uart_getchar()== 'd') break;
FD69 DF78 RCALL _uart_getchar
FD6A 3604 CPI R16,0x64
FD6B E0E0 LDI R30,0
FD6C 071E CPC R17,R30
FD6D F409 BNE 0xFD6F
FD6E C020 RJMP 0xFD8F
(0159) if (TIFR & 0x02) //timer0/ over flow
FD6F B626 IN R2,0x36
FD70 FE21 SBRS R2,1
FD71 C00B RJMP 0xFD7D
(0160) {
(0161) if (++timercount > 200) quit(); //200*15ms/ = 3s
FD72 818A LDD R24,Y+2
FD73 5F8F SUBI R24,0xFF
FD74 2E28 MOV R2,R24
FD75 822A STD Y+2,R2
FD76 EC88 LDI R24,0xC8
FD77 1582 CP R24,R2
FD78 F408 BCC 0xFD7A
FD79 DFAD RCALL _quit
(0162) TIFR = TIFR|0x02;
FD7A B786 IN R24,0x36
FD7B 6082 ORI R24,2
FD7C BF86 OUT 0x36,R24
FD7D CFEB RJMP 0xFD69
(0163) }
(0164) }
(0165) //每秒向PC机发送一个控制字符"C",等待控制字〈soh〉
(0166) while(uart_getchar()!=XMODEM_SOH) //receive/ the start of Xmodem
(0167) {
(0168) if(TIFR & 0x02) //timer0/ over flow
FD7E B626 IN R2,0x36
FD7F FE21 SBRS R2,1
FD80 C00E RJMP 0xFD8F
(0169) {
(0170) if(++timercount > 67) //wait/ about 1 second
FD81 818A LDD R24,Y+2
FD82 5F8F SUBI R24,0xFF
FD83 2E28 MOV R2,R24
FD84 822A STD Y+2,R2
FD85 E483 LDI R24,0x43
FD86 1582 CP R24,R2
FD87 F420 BCC 0xFD8C
(0171) {
(0172) uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); //send/ a "C"
FD88 E403 LDI R16,0x43
FD89 DF54 RCALL _uart_putchar
(0173) timercount=0;
FD8A 2400 CLR R0
FD8B 820A STD Y+2,R0
(0174) }
(0175) TIFR=TIFR | 0x02;
FD8C B786 IN R24,0x36
FD8D 6082 ORI R24,2
FD8E BF86 OUT 0x36,R24
FD8F DF52 RCALL _uart_getchar
FD90 3001 CPI R16,1
FD91 E0E0 LDI R30,0
FD92 071E CPC R17,R30
FD93 F751 BNE 0xFD7E
(0176) }
(0177) }
(0178) //开始接收数据块
(0179) do
(0180) {
(0181) if ((packNO == uart_waitchar()) && (packNO ==(~uart_waitchar())))
FD94 DF5C RCALL _uart_waitchar
FD95 16E0 CP R14,R16
FD96 F009 BEQ 0xFD98
FD97 C05A RJMP 0xFDF2
FD98 DF58 RCALL _uart_waitchar
FD99 2E20 MOV R2,R16
FD9A 9420 COM R2
FD9B 14E2 CP R14,R2
FD9C F009 BEQ 0xFD9E
FD9D C054 RJMP 0xFDF2
(0182) { //核对数据块编号正确
(0183) for(i=0;i<128;i++) //接收128个字节数据
FD9E 2400 CLR R0
FD9F 2411 CLR R1
FDA0 8219 STD Y+1,R1
FDA1 8208 STD Y+0,R0
(0184) {
(0185) data[bufferPoint]= uart_waitchar();
FDA2 DF4E RCALL _uart_waitchar
FDA3 E084 LDI R24,4
FDA4 E091 LDI R25,1
FDA5 01F6 MOVW R30,R12
FDA6 0FE8 ADD R30,R24
FDA7 1FF9 ADC R31,R25
FDA8 8300 STD Z+0,R16
(0186) bufferPoint++;
FDA9 01C6 MOVW R24,R12
FDAA 9601 ADIW R24,1
FDAB 016C MOVW R12,R24
FDAC 8188 LDD R24,Y+0
FDAD 8199 LDD R25,Y+1
FDAE 9601 ADIW R24,1
FDAF 8399 STD Y+1,R25
FDB0 8388 STD Y+0,R24
FDB1 3880 CPI R24,0x80
FDB2 E0E0 LDI R30,0
FDB3 079E CPC R25,R30
FDB4 F36C BLT 0xFDA2
(0187) }
(0188) crc = (uart_waitchar()<<8);
FDB5 DF3B RCALL _uart_waitchar
FDB6 2EA0 MOV R10,R16
FDB7 24BB CLR R11
FDB8 2CBA MOV R11,R10
FDB9 24AA CLR R10
(0189) crc += uart_waitchar(); //接收2个字节的CRC效验字
FDBA DF36 RCALL _uart_waitchar
FDBB 2E20 MOV R2,R16
FDBC 2433 CLR R3
FDBD 0CA2 ADD R10,R2
FDBE 1CB3 ADC R11,R3
(0190) if(calcrc(&data[bufferPoint-128],128)==crc) //CRC/校验验证
FDBF E820 LDI R18,0x80
FDC0 E030 LDI R19,0
FDC1 E884 LDI R24,0x84
FDC2 E090 LDI R25,0
FDC3 0186 MOVW R16,R12
FDC4 0F08 ADD R16,R24
FDC5 1F19 ADC R17,R25
FDC6 DF35 RCALL _calcrc
FDC7 150A CP R16,R10
FDC8 051B CPC R17,R11
FDC9 F529 BNE 0xFDEF
(0191) { //正确接收128个字节数据
FDCA C01B RJMP 0xFDE6
(0192) while(bufferPoint >= SPM_PAGESIZE)
(0193) { //正确接受256个字节的数据
(0194) write_one_page(); //收到256字节写入一页Flash中
FDCB DED7 RCALL _write_one_page
(0195) address += SPM_PAGESIZE; //Flash/页加1
FDCC E040 LDI R20,0
FDCD E051 LDI R21,1
FDCE E060 LDI R22,0
FDCF E070 LDI R23,0
FDD0 90400102 LDS R4,0x102
FDD2 90500103 LDS R5,0x103
FDD4 90200100 LDS R2,0x100
FDD6 90300101 LDS R3,0x101
FDD8 0E24 ADD R2,R20
FDD9 1E35 ADC R3,R21
FDDA 1E46 ADC R4,R22
FDDB 1E57 ADC R5,R23
FDDC 92300101 STS 0x101,R3
FDDE 92200100 STS 0x100,R2
FDE0 92500103 STS 0x103,R5
FDE2 92400102 STS 0x102,R4
(0196) bufferPoint = 0;
FDE4 24CC CLR R12
FDE5 24DD CLR R13
FDE6 01C6 MOVW R24,R12
FDE7 3080 CPI R24,0
FDE8 E0E1 LDI R30,1
FDE9 079E CPC R25,R30
FDEA F704 BGE 0xFDCB
(0197) }
(0198) uart_putchar(XMODEM_ACK); //正确收到一个数据块
FDEB E006 LDI R16,6
FDEC DEF1 RCALL _uart_putchar
(0199) packNO++; //数据块编号加1
FDED 94E3 INC R14
(0200) }
FDEE C005 RJMP 0xFDF4
(0201) else
(0202) {
(0203) uart_putchar(XMODEM_NAK); //要求重发数据块
FDEF E105 LDI R16,0x15
FDF0 DEED RCALL _uart_putchar
(0204) }
(0205) }
FDF1 C002 RJMP 0xFDF4
(0206) else
(0207) {
(0208) uart_putchar(XMODEM_NAK); //要求重发数据块
FDF2 E105 LDI R16,0x15
FDF3 DEEA RCALL _uart_putchar
(0209) }
(0210) }while(uart_waitchar()!=XMODEM_EOT); //循环接收,直到全部发完
FDF4 DEFC RCALL _uart_waitchar
FDF5 3004 CPI R16,4
FDF6 F009 BEQ 0xFDF8
FDF7 CF9C RJMP 0xFD94
(0211) uart_putchar(XMODEM_ACK); //通知PC机全部收到
FDF8 E006 LDI R16,6
FDF9 DEE4 RCALL _uart_putchar
(0212)
(0213) if(bufferPoint) write_one_page(); //把剩余的数据写入Flash中
FDFA 20CC TST R12
FDFB F411 BNE 0xFDFE
FDFC 20DD TST R13
FDFD F009 BEQ 0xFDFF
FDFE DEA4 RCALL _write_one_page
(0214) quit(); //退出Bootloader程序,从0x0000处执行应用程序
FDFF DF27 RCALL _quit
(0215) }
FILE: <library>
FE00 9623 ADIW R28,3
FE01 9508 RET
push_arg4:
FE02 933A ST R19,-Y
FE03 932A ST R18,-Y
push_arg2:
FE04 931A ST R17,-Y
FE05 930A ST R16,-Y
FE06 9508 RET
pop_gset2:
FE07 E0E2 LDI R30,2
FE08 C004 RJMP pop
push_gset1:
FE09 935A ST R21,-Y
FE0A 934A ST R20,-Y
FE0B 9508 RET
pop_gset1:
FE0C E0E1 LDI R30,1
pop:
FE0D 9149 LD R20,Y+
FE0E 9159 LD R21,Y+
FE0F FDE0 SBRC R30,0
FE10 9508 RET
FE11 9169 LD R22,Y+
FE12 9179 LD R23,Y+
FE13 FDE1 SBRC R30,1
FE14 9508 RET
FE15 90A9 LD R10,Y+
FE16 90B9 LD R11,Y+
FE17 FDE2 SBRC R30,2
FE18 9508 RET
FE19 90C9 LD R12,Y+
FE1A 90D9 LD R13,Y+
FE1B FDE3 SBRC R30,3
FE1C 9508 RET
FE1D 90E9 LD R14,Y+
FE1E 90F9 LD R15,Y+
FE1F 9508 RET
push_gset2:
FE20 937A ST R23,-Y
FE21 936A ST R22,-Y
FE22 CFE6 RJMP push_gset1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -