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

📄 bootloader.lst

📁 Atmega系列单片机 BootLoader程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -