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

📄 main.lst

📁 Atmeag16 bootloader 测试程序 测试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
    00B0 2700      CLR	R16
    00B1 D0C8      RCALL	pop_gset3
    00B2 9508      RET
_WriteFlash:
  TempInt              --> R20
  i                    --> R22
    00B3 D0DF      RCALL	push_gset2
(0130)   }
(0131) 
(0132) /*****************************************************************************/
(0133) void WriteFlash(void)
(0134)   {
(0135)     unsigned int i;
(0136)     unsigned int TempInt;
(0137)     for (i=0;i<PageByte;i+=2)
    00B4 2766      CLR	R22
    00B5 2777      CLR	R23
    00B6 C01A      RJMP	0x00D1
(0138)       {
(0139)    	   TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
    00B7 E684      LDI	R24,0x64
    00B8 E090      LDI	R25,0
    00B9 2FE6      MOV	R30,R22
    00BA 2FF7      MOV	R31,R23
    00BB 9631      ADIW	R30,1
    00BC 0FE8      ADD	R30,R24
    00BD 1FF9      ADC	R31,R25
    00BE 8020      LDD	R2,Z+0
    00BF 2433      CLR	R3
    00C0 2C32      MOV	R3,R2
    00C1 2422      CLR	R2
    00C2 2FE6      MOV	R30,R22
    00C3 2FF7      MOV	R31,R23
    00C4 0FE8      ADD	R30,R24
    00C5 1FF9      ADC	R31,R25
    00C6 8140      LDD	R20,Z+0
    00C7 2755      CLR	R21
    00C8 0D42      ADD	R20,R2
    00C9 1D53      ADC	R21,R3
(0140)    	   fill_temp_buffer(TempInt,i);    //call asm routine.
    00CA 2F26      MOV	R18,R22
    00CB 2F37      MOV	R19,R23
    00CC 2F04      MOV	R16,R20
    00CD 2F15      MOV	R17,R21
    00CE DF57      RCALL	_fill_temp_buffer
    00CF 5F6E      SUBI	R22,0xFE
    00D0 4F7F      SBCI	R23,0xFF
    00D1 3860      CPI	R22,0x80
    00D2 E0E0      LDI	R30,0
    00D3 077E      CPC	R23,R30
    00D4 F310      BCS	0x00B7
(0141)       } 
(0142)     write_page(PageAddress,0x03);       //擦除页
    00D5 E023      LDI	R18,3
    00D6 91000060  LDS	R16,_PageAddress
    00D8 91100061  LDS	R17,_PageAddress+1
    00DA DF45      RCALL	_write_page
(0143)     write_page(PageAddress,0x05);       //写页数据
    00DB E025      LDI	R18,5
    00DC 91000060  LDS	R16,_PageAddress
    00DE 91100061  LDS	R17,_PageAddress+1
    00E0 DF3F      RCALL	_write_page
(0144)    
(0145)     enableRWW();
    00E1 DF58      RCALL	_enableRWW
(0146)   }
    00E2 D095      RCALL	pop_gset2
    00E3 9508      RET
_CheckFlash:
  TempInt2             --> R20
  TempInt              --> R22
  i                    --> R10
    00E4 D0B1      RCALL	push_gset3
(0147) 
(0148) /*****************************************************************************/
(0149) 
(0150) char CheckFlash(void)
(0151)   {
(0152)     unsigned char i;							
(0153)     unsigned int TempInt;
(0154)     unsigned int TempInt2;
(0155) 
(0156)     for (i=0;i<PageByte;i+=2)
    00E5 24AA      CLR	R10
    00E6 C028      RJMP	0x010F
(0157)       {
(0158) 	   TempInt = read_program_memory(PageAddress + i,0x00);
    00E7 2722      CLR	R18
    00E8 2C2A      MOV	R2,R10
    00E9 2433      CLR	R3
    00EA 91000060  LDS	R16,_PageAddress
    00EC 91100061  LDS	R17,_PageAddress+1
    00EE 0D02      ADD	R16,R2
    00EF 1D13      ADC	R17,R3
    00F0 DF42      RCALL	_read_program_memory
    00F1 2F60      MOV	R22,R16
    00F2 2F71      MOV	R23,R17
(0159) 	   TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
    00F3 E685      LDI	R24,0x65
    00F4 E090      LDI	R25,0
    00F5 2DEA      MOV	R30,R10
    00F6 27FF      CLR	R31
    00F7 0FE8      ADD	R30,R24
    00F8 1FF9      ADC	R31,R25
    00F9 8020      LDD	R2,Z+0
    00FA 2433      CLR	R3
    00FB 2C32      MOV	R3,R2
    00FC 2422      CLR	R2
    00FD E684      LDI	R24,0x64
    00FE E090      LDI	R25,0
    00FF 2DEA      MOV	R30,R10
    0100 27FF      CLR	R31
    0101 0FE8      ADD	R30,R24
    0102 1FF9      ADC	R31,R25
    0103 8140      LDD	R20,Z+0
    0104 2755      CLR	R21
    0105 0D42      ADD	R20,R2
    0106 1D53      ADC	R21,R3
(0160) 	   if (TempInt != TempInt2)
    0107 1704      CP	R16,R20
    0108 0715      CPC	R17,R21
    0109 F011      BEQ	0x010C
(0161) 	     return 0;
    010A 2700      CLR	R16
    010B C007      RJMP	0x0113
    010C 2D8A      MOV	R24,R10
    010D 5F8E      SUBI	R24,0xFE
    010E 2EA8      MOV	R10,R24
    010F 2D8A      MOV	R24,R10
    0110 3880      CPI	R24,0x80
    0111 F2A8      BCS	0x00E7
(0162)       } 
(0163)     return 1;
    0112 E001      LDI	R16,1
    0113 D066      RCALL	pop_gset3
    0114 9508      RET
(0164)   }
(0165) /*****************************************************************************/
(0166) /* Serial Port Code										                     */
(0167) /*****************************************************************************/
(0168) unsigned char IsChar(void)
(0169) {
(0170)    if(UCSRA & 0x80)
_IsChar:
    0115 9B5F      SBIS	0x0B,7
    0116 C002      RJMP	0x0119
(0171)      return 1;
    0117 E001      LDI	R16,1
    0118 C001      RJMP	0x011A
(0172)    else 
(0173)      return 0;	 
    0119 2700      CLR	R16
    011A 9508      RET
(0174) }
(0175) /*****************************************************************************/
(0176) /*  		字符输入函数 		 */	
(0177) unsigned char RecChar(void)
(0178)   {
(0179)     while(!(UCSRA & 0x80));
_RecChar:
    011B 9B5F      SBIS	0x0B,7
    011C CFFE      RJMP	_RecChar
(0180)     return UDR;
    011D B10C      IN	R16,0x0C
    011E 9508      RET
(0181)   }		
(0182) /*****************************************************************************/
(0183) void SendChar(unsigned char c)
(0184)   { 	 
(0185)     while (!(UCSRA&(1<<UDRE)));
_SendChar:
  c                    --> R16
    011F 9B5D      SBIS	0x0B,5
    0120 CFFE      RJMP	_SendChar
(0186)     UDR=c;
    0121 B90C      OUT	0x0C,R16
(0187)   }
    0122 9508      RET
(0188) void delay(void)  
(0189)   {
(0190)     unsigned int i;
(0191)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
    0123 2700      CLR	R16
    0124 2711      CLR	R17
    0125 C002      RJMP	0x0128
    0126 5F0F      SUBI	R16,0xFF
    0127 4F1F      SBCI	R17,0xFF
    0128 3F0A      CPI	R16,0xFA
    0129 EFEF      LDI	R30,0xFF
    012A 071E      CPC	R17,R30
    012B F3D0      BCS	0x0126
(0192)   }
    012C 9508      RET
(0193) 
(0194) /*****************************************************************************/
(0195) void ExecCode(void)
(0196)   {
(0197) #ifdef RAMPZ_FLAG 
(0198)     RAMPZ = 0;
(0199) #endif
(0200)     INTVECREG=0x01;           //中断向量表移位允许
_ExecCode:
    012D E081      LDI	R24,1
    012E BF8B      OUT	0x3B,R24
(0201)     INTVECREG=0x00;           //中断向量指向应用程序区
    012F 2422      CLR	R2
    0130 BE2B      OUT	0x3B,R2
(0202)     asm("jmp 0x0000");              
    0131 940C0000  JMP	__text_start
(0203)   }
    0133 9508      RET
(0204) 		
(0205) void main(void)
(0206)   {
(0207)     unsigned char BootFlag;
(0208)     
(0209) #ifdef InteClk                //如果使用内部时钟,读取时钟校准值
(0210)        OSCCAL=read_flash(OscAddress);
_main:
  BootFlag             --> R20
    0134 EF0F      LDI	R16,0xFF
    0135 E11F      LDI	R17,0x1F
    0136 DEF7      RCALL	_read_flash
    0137 BF01      OUT	0x31,R16
(0211) #endif
(0212)  
(0213)     UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
    0138 E886      LDI	R24,0x86
    0139 BD80      OUT	0x20,R24
(0214)     UCSRB = (1<<RXEN)|(1<<TXEN);       //允许串口发送和接收
    013A E188      LDI	R24,0x18
    013B B98A      OUT	0x0A,R24
(0215)     UBRR = BAU;
    013C E187      LDI	R24,0x17
    013D B989      OUT	0x09,R24
(0216) 
(0217)  
(0218)     SendChar('>');              //通知PC机,BOOT下载准备就绪
    013E E30E      LDI	R16,0x3E
    013F DFDF      RCALL	_SendChar
(0219)     delay();                    //延时等待PC机响应
    0140 DFE2      RCALL	_delay
(0220) 	delay();
    0141 DFE1      RCALL	_delay
(0221) 	delay();
    0142 DFE0      RCALL	_delay
(0222) 	delay();
    0143 DFDF      RCALL	_delay
(0223) 	delay();
    0144 DFDE      RCALL	_delay
(0224) 	delay();
    0145 DFDD      RCALL	_delay
(0225) 	delay();
    0146 DFDC      RCALL	_delay
(0226) 	delay();
    0147 DFDB      RCALL	_delay
(0227) 	
(0228)     BootFlag=UDR;             
    0148 B14C      IN	R20,0x0C
(0229)     if (BootFlag == '<') 
    0149 334C      CPI	R20,0x3C
    014A F531      BNE	0x0171
(0230)       {
(0231) 	   SendChar(ChipType);
    014B E301      LDI	R16,0x31
    014C DFD2      RCALL	_SendChar
(0232) 	   while (RecChar()!='N');
    014D DFCD      RCALL	_RecChar
    014E 340E      CPI	R16,0x4E
    014F F7E9      BNE	0x014D
(0233)          SendChar(BootSize);
    0150 E604      LDI	R16,0x64
    0151 DFCD      RCALL	_SendChar
(0234) 	   while (RecChar()!='N');	 
    0152 DFC8      RCALL	_RecChar
    0153 340E      CPI	R16,0x4E
    0154 F7E9      BNE	0x0152
(0235)          SendChar(BootVer);
    0155 E606      LDI	R16,0x66
    0156 DFC8      RCALL	_SendChar
    0157 C018      RJMP	0x0170
(0236)        while (1)
(0237) 	   {
(0238) 	     switch (RecChar())
    0158 DFC2      RCALL	_RecChar
    0159 2F40      MOV	R20,R16
    015A 2755      CLR	R21
    015B 3445      CPI	R20,0x45
    015C E0E0      LDI	R30,0
    015D 075E      CPC	R21,R30
    015E F059      BEQ	0x016A
    015F 3445      CPI	R20,0x45
    0160 E0E0      LDI	R30,0
    0161 075E      CPC	R21,R30
    0162 F06C      BLT	0x0170
    0163 3547      CPI	R20,0x57
    0164 E0E0      LDI	R30,0
    0165 075E      CPC	R21,R30
    0166 F009      BEQ	0x0168
    0167 C008      RJMP	0x0170
(0239) 	       {
(0240) 	         case 'W': FlashLoad(); break;
    0168 DEDC      RCALL	_FlashLoad
    0169 C006      RJMP	0x0170
(0241) 	         case 'E': { 
(0242) 	         	     SendChar('E');  //通知PC机,进入运用程序区
    016A E405      LDI	R16,0x45
    016B DFB3      RCALL	_SendChar
(0243) 					 while (RecChar()!='N');
    016C DFAE      RCALL	_RecChar
    016D 340E      CPI	R16,0x4E
    016E F7E9      BNE	0x016C
(0244) 	         	     ExecCode();  
    016F DFBD      RCALL	_ExecCode
    0170 CFE7      RJMP	0x0158
(0245) 	         	   } break;
(0246) 	         default : break;
(0247) 	       }
(0248) 	   }
(0249)       }
(0250)     SendChar('E');  //通知PC机,进入运用程序区
    0171 E405      LDI	R16,0x45
    0172 DFAC      RCALL	_SendChar
(0251) 	//while (RecChar()!='N');
(0252)     delay();
    0173 DFAF      RCALL	_delay
(0253) 	delay();
    0174 DFAE      RCALL	_delay
(0254) 	delay();
    0175 DFAD      RCALL	_delay
(0255) 	delay();
    0176 DFAC      RCALL	_delay
(0256)     ExecCode();
(0257)   }
FILE: <library>
    0177 CFB5      RJMP	_ExecCode
pop_gset2:
    0178 E0E2      LDI	R30,2
    0179 C006      RJMP	pop
pop_gset3:
    017A E0E4      LDI	R30,4
    017B C004      RJMP	pop
push_gset1:
    017C 935A      ST	R21,-Y
    017D 934A      ST	R20,-Y
    017E 9508      RET
pop_gset1:
    017F E0E1      LDI	R30,1
pop:
    0180 9149      LD	R20,Y+
    0181 9159      LD	R21,Y+
    0182 FDE0      SBRC	R30,0
    0183 9508      RET
    0184 9169      LD	R22,Y+
    0185 9179      LD	R23,Y+
    0186 FDE1      SBRC	R30,1
    0187 9508      RET
    0188 90A9      LD	R10,Y+
    0189 90B9      LD	R11,Y+
    018A FDE2      SBRC	R30,2
    018B 9508      RET
    018C 90C9      LD	R12,Y+
    018D 90D9      LD	R13,Y+
    018E FDE3      SBRC	R30,3
    018F 9508      RET
    0190 90E9      LD	R14,Y+
    0191 90F9      LD	R15,Y+
    0192 9508      RET
push_gset2:
    0193 937A      ST	R23,-Y
    0194 936A      ST	R22,-Y
    0195 CFE6      RJMP	push_gset1
push_gset3:
    0196 92BA      ST	R11,-Y
    0197 92AA      ST	R10,-Y
    0198 CFFA      RJMP	push_gset2
lsl16:
    0199 2322      TST	R18
    019A F021      BEQ	0x019F
    019B 0F00      LSL	R16
    019C 1F11      ROL	R17
    019D 952A      DEC	R18
    019E CFFA      RJMP	lsl16
    019F 9508      RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -