⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atmega128iap.lst

📁 atmega128在线升级程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -