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

📄 hhh.lst

📁 avr bootloader 上位机源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    FC46 E001      LDI	R16,1
    FC47 BF05      OUT	0x35,R16
    FC48 E002      LDI	R16,2
    FC49 BF05      OUT	0x35,R16
    FC4A EFCF      LDI	R28,0xFF
    FC4B E1D0      LDI	R29,0x10
    FC4C BFCD      OUT	0x3D,R28
    FC4D BFDE      OUT	0x3E,R29
    FC4E 52C0      SUBI	R28,0x20
    FC4F 40D0      SBCI	R29,0
    FC50 EA0A      LDI	R16,0xAA
    FC51 8308      STD	Y+0,R16
    FC52 2400      CLR	R0
    FC53 E0E0      LDI	R30,0
    FC54 E0F1      LDI	R31,1
    FC55 E012      LDI	R17,2
    FC56 30E4      CPI	R30,4
    FC57 07F1      CPC	R31,R17
    FC58 F011      BEQ	0xFC5B
    FC59 9201      ST	R0,Z+
    FC5A CFFB      RJMP	0xFC56
    FC5B 8300      STD	Z+0,R16
    FC5C E8EC      LDI	R30,0x8C
    FC5D EFF8      LDI	R31,0xF8
    FC5E E0A0      LDI	R26,0
    FC5F E0B1      LDI	R27,1
    FC60 EF18      LDI	R17,0xF8
    FC61 E001      LDI	R16,1
    FC62 BF0B      OUT	0x3B,R16
    FC63 38EC      CPI	R30,0x8C
    FC64 07F1      CPC	R31,R17
    FC65 F021      BEQ	0xFC6A
    FC66 95D8      ELPM
    FC67 9631      ADIW	R30,1
    FC68 920D      ST	R0,X+
    FC69 CFF9      RJMP	0xFC63
    FC6A D105      RCALL	_main
_exit:
    FC6B CFFF      RJMP	_exit
FILE: E:\icc\peterf\BootLoad\main.c
(0001) /******************************************************************************
(0002) Atmega系列单片机 BootLoad程序  
(0003) 日  期:2004年的最后一天
(0004) 肖  鹏  www.527dz.com  527dz@527dz.com
(0005) 
(0006) /*****************************************************************************/
(0007) #include <macros.h>
(0008) #include "assembly.h"
(0009) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0010) #define  fosc  8000000   //晶振频率
(0011) #define  baud1 38400     //波特率
(0012) //请根据目标板选择芯片型号
(0013) //#define  ChipType     Atmega8       
(0014) //#define  ChipType     Atmega16       
(0015) //#define  ChipType     Atmega32       
(0016) //#define  ChipType     Atmega64       
(0017) #define  ChipType     Atmega128
(0018) //#define  ChipType     Atmega8515       
(0019) //#define  ChipType     Atmega8535       
(0020) //*********************************************************
(0021) //选择BOOT区大小
(0022) //#define  BootSize     'a'    //128   
(0023) //#define  BootSize     'b'    //256
(0024) //#define  BootSize       'c'    //512
(0025) #define  BootSize     'd'    //1024
(0026) //#define  BootSize     'e'    //2048(不知道是否有2048字BOOT空间的芯片)
(0027) //选择BootLoad版本号
(0028) #define  BootVer        'f'    //1.0版本
(0029) //#define  BootVer      'g'    //1.1版本
(0030) //#define  BootVer      'h'    //1.2版本
(0031) //#define  BootVer      'i'    //1.3版本
(0032) //#define  BootVer      'j'    //1.4版本
(0033) //#define  BootVer      'k'    //1.5版本
(0034) //#define  BootVer      'l'    //1.6版本
(0035) //#define  BootVer      'm'    //1.7版本
(0036) //#define  BootVer      'n'    //1.8版本
(0037) //#define  BootVer      'o'    //1.9版本
(0038) //#define  BootVer      'p'    //2.0版本(应该是最终版本了)
(0039) //**********************************************************
(0040) #define  Atmega8        0x30
(0041) #define  Atmega16       0x31
(0042) #define  Atmega32       0x32
(0043) #define  Atmega64       0x33
(0044) #define  Atmega128      0x34
(0045) #define  Atmega8515     0x35
(0046) #define  Atmega8535     0x36
(0047) //*****************************************************************************
(0048) #define  InteClk                 //是否使用内部时钟
(0049) #define  OscAddress     0x1fff   //时钟校准值存储地址
(0050) //#define  OscAddress     0x3fff   //时钟校准值存储地址
(0051) //*****************************************************************************
(0052) //8时钟下的波特率设置
(0053) //#define  BAU  103    //4800
(0054) //#define  BAU  51       //9600
(0055) //#define  BAU  34     //14400
(0056) #define  BAU  25     //19200
(0057) //*****************************************************************************
(0058) #if (ChipType == Atmega8)
(0059)   #include  "iom8v.h"
(0060)   #define   PageByte 	 	 64 
(0061)   #define   AddressShift	 6
(0062)   #define	INTVECREG	 	 GICR  
(0063) #endif
(0064) 
(0065) #if (ChipType == Atmega16)
(0066)   #include  "iom16v.h"
(0067)   #define   PageByte 	 	 128    
(0068)   #define   AddressShift 	 7
(0069)   #define	INTVECREG	 	 GICR
(0070) #endif
(0071) 
(0072) #if (ChipType == Atmega32)
(0073)   #include  "iom32v.h"
(0074)   #define   PageByte 	 	 128    
(0075)   #define   AddressShift 	 7
(0076)   #define	INTVECREG	 	 GICR
(0077) #endif
(0078) 
(0079) #if (ChipType == Atmega64)
(0080)   #include  "iom64v.h"
(0081)   #define   PageByte 	 	 256    
(0082)   #define   AddressShift 	 8
(0083)   #define	INTVECREG	 	 MCUCR
(0084) #endif
(0085) 
(0086) #if (ChipType == Atmega128)
(0087)   #include  "iom128v.h"
(0088)   #define   PageByte 	 	 256    
(0089)   #define   AddressShift 	 8
(0090)   #define	INTVECREG	 	 MCUCR
(0091)   #define   RAMPZ_FLAG
(0092) #endif
(0093) 
(0094) #if (ChipType == Atmega8515)
(0095)   #include  "iom8515v.h"
(0096)   #define   PageByte 	 	 64    
(0097)   #define   AddressShift 	 6
(0098)   #define	INTVECREG	 	 GICR
(0099) #endif
(0100) 
(0101) void          FlashLoad        (void);
(0102) void          GetPageNumber    (void);
(0103) void          ExecCode         (void);
(0104) char          GetPage          (void);
(0105) void          WriteFlash       (void);
(0106) char          CheckFlash       (void);
(0107) unsigned char IsChar           (void);
(0108) void          SendChar         (unsigned char c);
(0109) void          delay            (void);                 //1ms延时函数
(0110) unsigned char RecChar          (void);
(0111) 
(0112) unsigned char PageBuffer[PageByte];
(0113) unsigned int  RealPageAddress;
(0114) unsigned int  PageAddress;
(0115) 
(0116) /*****************************************************************************/
(0117) //Flash编程								                     
(0118) /*****************************************************************************/
(0119) void FlashLoad(void)
(0120)   {
(0121)     SendChar('!');
_FlashLoad:
    FC6C E201      LDI	R16,0x21
    FC6D D0E9      RCALL	_SendChar
    FC6E C019      RJMP	0xFC88
(0122)     while (1)
(0123)     {
(0124) 	 GetPageNumber();
    FC6F D01A      RCALL	_GetPageNumber
(0125) 
(0126) 	 if (RealPageAddress == 0xffff) 
    FC70 91800102  LDS	R24,_RealPageAddress
    FC72 91900103  LDS	R25,_RealPageAddress+1
    FC74 3F8F      CPI	R24,0xFF
    FC75 EFEF      LDI	R30,0xFF
    FC76 079E      CPC	R25,R30
    FC77 F409      BNE	0xFC79
(0127) 	   return;
    FC78 C010      RJMP	0xFC89
(0128)         
(0129) 	 if (GetPage())
    FC79 D02C      RCALL	_GetPage
    FC7A 2300      TST	R16
    FC7B F051      BEQ	0xFC86
(0130) 	  {
(0131) 		WriteFlash();
    FC7C D065      RCALL	_WriteFlash
(0132) 	    if (CheckFlash()) 
    FC7D D097      RCALL	_CheckFlash
    FC7E 2300      TST	R16
    FC7F F019      BEQ	0xFC83
(0133) 		  SendChar('!');
    FC80 E201      LDI	R16,0x21
    FC81 D0D5      RCALL	_SendChar
    FC82 C005      RJMP	0xFC88
(0134) 	    else 
(0135) 		  SendChar('@');
    FC83 E400      LDI	R16,0x40
    FC84 D0D2      RCALL	_SendChar
(0136) 	  }
    FC85 C002      RJMP	0xFC88
(0137) 	 else 
(0138) 	   SendChar('@');
    FC86 E400      LDI	R16,0x40
    FC87 D0CF      RCALL	_SendChar
    FC88 CFE6      RJMP	0xFC6F
(0139)     }
(0140)   }
    FC89 9508      RET
_GetPageNumber:
  PageAddressL         --> R22
  PageAddressH         --> R20
    FC8A 940EFDFD  CALL	push_gset2
(0141) 
(0142) /*****************************************************************************/
(0143) void GetPageNumber(void)
(0144)   {
(0145)     unsigned char PageAddressH;
(0146)     unsigned char PageAddressL;
(0147) 
(0148)     PageAddressH = RecChar();
    FC8C D0C3      RCALL	_RecChar
    FC8D 2F40      MOV	R20,R16
(0149) 
(0150)     PageAddressL = RecChar();
    FC8E D0C1      RCALL	_RecChar
    FC8F 2F60      MOV	R22,R16
(0151) 
(0152)     RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
    FC90 2E34      MOV	R3,R20
    FC91 2E26      MOV	R2,R22
    FC92 92300103  STS	_RealPageAddress+1,R3
    FC94 92200102  STS	_RealPageAddress,R2
(0153) 	PageAddress=RealPageAddress<<AddressShift;
    FC96 2C32      MOV	R3,R2
    FC97 2422      CLR	R2
    FC98 92300101  STS	_PageAddress+1,R3
    FC9A 92200100  STS	_PageAddress,R2
(0154) #ifdef RAMPZ_FLAG
(0155)     if (PageAddressH) 
    FC9C 2344      TST	R20
    FC9D F019      BEQ	0xFCA1
(0156) 	   RAMPZ = 1; 
    FC9E E081      LDI	R24,1
    FC9F BF8B      OUT	0x3B,R24
    FCA0 C002      RJMP	0xFCA3
(0157)     else 
(0158) 	   RAMPZ = 0;
    FCA1 2422      CLR	R2
    FCA2 BE2B      OUT	0x3B,R2
(0159) #endif	
(0160) 	//SendChar(RealPageAddress>>8);
(0161) 	//SendChar(RealPageAddress);
(0162) 	//SendChar(PageAddress>>8);
(0163) 	//SendChar(PageAddress);
(0164)   }
    FCA3 940EFDE2  CALL	pop_gset2
    FCA5 9508      RET
_GetPage:
  CheckSum             --> R20
  LocalCheckSum        --> R22
  i                    --> R10
    FCA6 940EFE00  CALL	push_gset3
(0165) 
(0166) /*****************************************************************************/
(0167) char GetPage(void)
(0168)   {
(0169)     unsigned char i;
(0170)     unsigned char LocalCheckSum = 0;
    FCA8 2766      CLR	R22
(0171)     unsigned char CheckSum = 0;
    FCA9 2744      CLR	R20
(0172) 
(0173)     for (i=0;i<PageByte/2;i++)
    FCAA 24AA      CLR	R10
    FCAB C012      RJMP	0xFCBE
(0174) 	{
(0175) 	 while(!IsChar());
    FCAC D09B      RCALL	_IsChar
    FCAD 2300      TST	R16
    FCAE F3E9      BEQ	0xFCAC
(0176) 	 PageBuffer[i]=RecChar();
    FCAF D0A0      RCALL	_RecChar
    FCB0 E084      LDI	R24,4
    FCB1 E091      LDI	R25,1
    FCB2 2DEA      MOV	R30,R10
    FCB3 27FF      CLR	R31
    FCB4 0FE8      ADD	R30,R24
    FCB5 1FF9      ADC	R31,R25
    FCB6 8300      STD	Z+0,R16
(0177) 	 LocalCheckSum ^= PageBuffer[i];
    FCB7 2DEA      MOV	R30,R10
    FCB8 27FF      CLR	R31
    FCB9 0FE8      ADD	R30,R24
    FCBA 1FF9      ADC	R31,R25
    FCBB 8020      LDD	R2,Z+0
    FCBC 2562      EOR	R22,R2
    FCBD 94A3      INC	R10
    FCBE 2D8A      MOV	R24,R10
    FCBF 3880      CPI	R24,0x80
    FCC0 F358      BCS	0xFCAC
(0178)    	}
(0179) 	for (i=0;i<PageByte/2;i++)
    FCC1 24AA      CLR	R10
    FCC2 C012      RJMP	0xFCD5
(0180) 	{
(0181) 	 while(!IsChar());
    FCC3 D084      RCALL	_IsChar
    FCC4 2300      TST	R16
    FCC5 F3E9      BEQ	0xFCC3
(0182) 	 PageBuffer[i+PageByte/2]=RecChar();
    FCC6 D089      RCALL	_RecChar
    FCC7 E884      LDI	R24,0x84
    FCC8 E091      LDI	R25,1
    FCC9 2DEA      MOV	R30,R10
    FCCA 27FF      CLR	R31
    FCCB 0FE8      ADD	R30,R24
    FCCC 1FF9      ADC	R31,R25
    FCCD 8300      STD	Z+0,R16
(0183) 	 LocalCheckSum ^= PageBuffer[i+PageByte/2];
    FCCE 2DEA      MOV	R30,R10
    FCCF 27FF      CLR	R31
    FCD0 0FE8      ADD	R30,R24
    FCD1 1FF9      ADC	R31,R25
    FCD2 8020      LDD	R2,Z+0
    FCD3 2562      EOR	R22,R2
    FCD4 94A3      INC	R10
    FCD5 2D8A      MOV	R24,R10
    FCD6 3880      CPI	R24,0x80
    FCD7 F358      BCS	0xFCC3
(0184)    	}	   
(0185)     CheckSum = RecChar(); 
    FCD8 D077      RCALL	_RecChar
    FCD9 2F40      MOV	R20,R16
(0186) 	
(0187)     if (LocalCheckSum == CheckSum) 
    FCDA 1760      CP	R22,R16
    FCDB F411      BNE	0xFCDE
(0188) 	  return 1;
    FCDC E001      LDI	R16,1
    FCDD C001      RJMP	0xFCDF
(0189)     else 
(0190) 	  return 0;
    FCDE 2700      CLR	R16
    FCDF 940EFDE4  CALL	pop_gset3
    FCE1 9508      RET
_WriteFlash:
  TempInt              --> R20
  i                    --> R22
    FCE2 940EFDFD  CALL	push_gset2
(0191)   }
(0192) 
(0193) /*****************************************************************************/
(0194) void WriteFlash(void)
(0195)   {
(0196)     unsigned int i;
(0197)     unsigned int TempInt;
(0198)     for (i=0;i<PageByte;i+=2)
    FCE4 2766      CLR	R22
    FCE5 2777      CLR	R23
    FCE6 C017      RJMP	0xFCFE
(0199)       {
(0200)    	   TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
    FCE7 E084      LDI	R24,4
    FCE8 E091      LDI	R25,1
    FCE9 01FB      MOVW	R30,R22
    FCEA 9631      ADIW	R30,1
    FCEB 0FE8      ADD	R30,R24
    FCEC 1FF9      ADC	R31,R25
    FCED 8020      LDD	R2,Z+0
    FCEE 2433      CLR	R3
    FCEF 2C32      MOV	R3,R2
    FCF0 2422      CLR	R2
    FCF1 01FB      MOVW	R30,R22
    FCF2 0FE8      ADD	R30,R24
    FCF3 1FF9      ADC	R31,R25
    FCF4 8140      LDD	R20,Z+0
    FCF5 2755      CLR	R21
    FCF6 0D42      ADD	R20,R2
    FCF7 1D53      ADC	R21,R3
(0201)    	   fill_temp_buffer(TempInt,i);    //call asm routine.
    FCF8 019B      MOVW	R18,R22
    FCF9 018A      MOVW	R16,R20
    FCFA 940EFDC3  CALL	_fill_temp_buffer
    FCFC 5F6E      SUBI	R22,0xFE
    FCFD 4F7F      SBCI	R23,0xFF
    FCFE 3060      CPI	R22,0
    FCFF E0E1      LDI	R30,1
    FD00 077E      CPC	R23,R30
    FD01 F328      BCS	0xFCE7
(0202)       } 
(0203)     write_page(PageAddress,0x03);       //擦除页
    FD02 E023      LDI	R18,3
    FD03 91000100  LDS	R16,_PageAddress
    FD05 91100101  LDS	R17,_PageAddress+1
    FD07 940EFDBD  CALL	_write_page
(0204)     write_page(PageAddress,0x05);       //写页数据
    FD09 E025      LDI	R18,5
    FD0A 91000100  LDS	R16,_PageAddress
    FD0C 91100101  LDS	R17,_PageAddress+1
    FD0E 940EFDBD  CALL	_write_page
(0205)    
(0206)     enableRWW();
    FD10 940EFDD7  CALL	_enableRWW
(0207)   }
    FD12 940EFDE2  CALL	pop_gset2
    FD14 9508      RET
_CheckFlash:
  TempInt2             --> R20
  TempInt              --> R22
  i                    --> R10
    FD15 940EFE00  CALL	push_gset3
(0208) 
(0209) /*****************************************************************************/
(0210) 
(0211) char CheckFlash(void)
(0212)   {
(0213)     unsigned char i;							
(0214)     unsigned int TempInt;
(0215)     unsigned int TempInt2;
(0216) 
(0217)     for (i=0;i<PageByte;i+=2)
    FD17 24AA      CLR	R10
    FD18 C028      RJMP	0xFD41
(0218)       {
(0219) 	   TempInt = read_program_memory(PageAddress + i,0x00);
    FD19 2722      CLR	R18
    FD1A 2C2A      MOV	R2,R10
    FD1B 2433      CLR	R3
    FD1C 91000100  LDS	R16,_PageAddress
    FD1E 91100101  LDS	R17,_PageAddress+1
    FD20 0D02      ADD	R16,R2
    FD21 1D13      ADC	R17,R3
    FD22 940EFDD0  CALL	_read_program_memory
    FD24 01B8      MOVW	R22,R16
(0220) 	   TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
    FD25 E085      LDI	R24,5
    FD26 E091      LDI	R25,1

⌨️ 快捷键说明

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