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

📄 avrboot_m8_16.lst

📁 AVR的BOOT原代码 AVR的BOOT原代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    1E2A E001      LDI	R16,1
    1E2B BF05      OUT	0x35,R16
    1E2C E002      LDI	R16,2
    1E2D BF05      OUT	0x35,R16
    1E2E E5CF      LDI	R28,0x5F
    1E2F E0D4      LDI	R29,4
    1E30 BFCD      OUT	0x3D,R28
    1E31 BFDE      OUT	0x3E,R29
    1E32 54C0      SUBI	R28,0x40
    1E33 40D0      SBCI	R29,0
    1E34 EA0A      LDI	R16,0xAA
    1E35 8308      STD	Y+0,R16
    1E36 2400      CLR	R0
    1E37 E6E0      LDI	R30,0x60
    1E38 E0F0      LDI	R31,0
    1E39 E010      LDI	R17,0
    1E3A 3EE2      CPI	R30,0xE2
    1E3B 07F1      CPC	R31,R17
    1E3C F011      BEQ	0x1E3F
    1E3D 9201      ST	R0,Z+
    1E3E CFFB      RJMP	0x1E3A
    1E3F 8300      STD	Z+0,R16
    1E40 E5E4      LDI	R30,0x54
    1E41 E3FC      LDI	R31,0x3C
    1E42 E6A0      LDI	R26,0x60
    1E43 E0B0      LDI	R27,0
    1E44 E31C      LDI	R17,0x3C
    1E45 35E4      CPI	R30,0x54
    1E46 07F1      CPC	R31,R17
    1E47 F021      BEQ	0x1E4C
    1E48 95C8      LPM
    1E49 9631      ADIW	R30,1
    1E4A 920D      ST	R0,X+
    1E4B CFF9      RJMP	0x1E45
    1E4C D0D3      RCALL	_main
_exit:
    1E4D CFFF      RJMP	_exit
FILE: E:\icc\peter\BootLoad\main.c
(0001) /******************************************************************************
(0002) Atmega8、16 BootLoad程序  
(0003) 日  期:2004年的最后一天
(0004) 肖  鹏  www.527dz.com  527dz@527dz.com
(0005) 
(0006) /*****************************************************************************/
(0007) #include <macros.h>
(0008) #include "assembly.h"
(0009) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0010) //请根据目标板选择芯片型号
(0011) //#define  ChipType     Atmega8       
(0012) #define  ChipType     Atmega16       
(0013) //#define  ChipType     Atmega32       
(0014) //#define  ChipType     Atmega64       
(0015) //#define  ChipType     Atmega128       
(0016) //#define  ChipType     Atmega8535       
(0017) //*********************************************************
(0018) //选择BOOT区大小
(0019) //#define  BootSize     'a'    //128   
(0020) //#define  BootSize     'b'    //256
(0021) #define  BootSize       'c'    //512
(0022) //#define  BootSize     'd'    //1024
(0023) //#define  BootSize     'e'    //2048(不知道是否有2048字BOOT空间的芯片)
(0024) //选择BootLoad版本号
(0025) #define  BootVer        'f'    //1.0版本
(0026) //#define  BootVer      'g'    //1.1版本
(0027) //#define  BootVer      'h'    //1.2版本
(0028) //#define  BootVer      'i'    //1.3版本
(0029) //#define  BootVer      'j'    //1.4版本
(0030) //#define  BootVer      'k'    //1.5版本
(0031) //#define  BootVer      'l'    //1.6版本
(0032) //#define  BootVer      'm'    //1.7版本
(0033) //#define  BootVer      'n'    //1.8版本
(0034) //#define  BootVer      'o'    //1.9版本
(0035) //#define  BootVer      'p'    //2.0版本(应该是最终版本了)
(0036) //**********************************************************
(0037) #define  Atmega8        0x30
(0038) #define  Atmega16       0x31
(0039) #define  Atmega32       0x32
(0040) #define  Atmega64       0x33
(0041) #define  Atmega128      0x34
(0042) #define  Atmega8535     0x35
(0043) //*****************************************************************************
(0044) #define  InteClk                 //是否使用内部时钟
(0045) #define  OscAddress     0x1fff   //时钟校准值存储地址
(0046) //#define  OscAddress     0x3fff   //时钟校准值存储地址
(0047) //*****************************************************************************
(0048) //8时钟下的波特率设置
(0049) //#define  BAU  103    //4800
(0050) #define  BAU  51       //9600
(0051) //#define  BAU  34     //14400
(0052) //#define  BAU  25     //19200
(0053) //*****************************************************************************
(0054) #if (ChipType == Atmega8)
(0055)   #include  "iom8v.h"
(0056)   #define   PageByte 	 	 64 
(0057)   #define   AddressShift	 6
(0058) #endif
(0059) 
(0060) #if (ChipType == Atmega16)
(0061)   #include  "iom16v.h"
(0062)   #define   PageByte 	 	 128    
(0063)   #define   AddressShift 	 7
(0064) #endif
(0065) 
(0066) void          FlashLoad        (void);
(0067) void          GetPageNumber    (void);
(0068) void          ExecCode         (void);
(0069) char          GetPage          (void);
(0070) void          WriteFlash       (void);
(0071) char          CheckFlash       (void);
(0072) void          SendChar         (unsigned char c);
(0073) void          delay            (void);                 //1ms延时函数
(0074) unsigned char RecChar          (void);
(0075) 
(0076) unsigned char PageBuffer[PageByte];
(0077) unsigned int  PageAddress;
(0078) 
(0079) /*****************************************************************************/
(0080) //Flash编程								                     
(0081) /*****************************************************************************/
(0082) void FlashLoad(void)
(0083)   {
(0084)     SendChar('!');
_FlashLoad:
    1E4E E201      LDI	R16,0x21
    1E4F D0BB      RCALL	_SendChar
    1E50 C019      RJMP	0x1E6A
(0085)     while (1)
(0086)       {
(0087) 	GetPageNumber();
    1E51 D01A      RCALL	_GetPageNumber
(0088) 
(0089) 	if (PageAddress == 0xffff) return;
    1E52 91800060  LDS	R24,_PageAddress
    1E54 91900061  LDS	R25,_PageAddress+1
    1E56 3F8F      CPI	R24,0xFF
    1E57 EFEF      LDI	R30,0xFF
    1E58 079E      CPC	R25,R30
    1E59 F409      BNE	0x1E5B
    1E5A C010      RJMP	0x1E6B
(0090)         
(0091) 	if (GetPage())
    1E5B D023      RCALL	_GetPage
    1E5C 2300      TST	R16
    1E5D F051      BEQ	0x1E68
(0092) 	  {
(0093) 	    WriteFlash();
    1E5E D042      RCALL	_WriteFlash
(0094) 	    if (CheckFlash()) 
    1E5F D074      RCALL	_CheckFlash
    1E60 2300      TST	R16
    1E61 F019      BEQ	0x1E65
(0095) 		  SendChar('!');
    1E62 E201      LDI	R16,0x21
    1E63 D0A7      RCALL	_SendChar
    1E64 C005      RJMP	0x1E6A
(0096) 	    else 
(0097) 		  SendChar('@');
    1E65 E400      LDI	R16,0x40
    1E66 D0A4      RCALL	_SendChar
(0098) 	  }
    1E67 C002      RJMP	0x1E6A
(0099) 	else SendChar('@');
    1E68 E400      LDI	R16,0x40
    1E69 D0A1      RCALL	_SendChar
    1E6A CFE6      RJMP	0x1E51
(0100)       }
(0101)   }
    1E6B 9508      RET
_GetPageNumber:
  PageAddressL         --> R20
  PageAddressH         --> R22
    1E6C 940E1FAD  CALL	push_gset2
(0102) 
(0103) /*****************************************************************************/
(0104) void GetPageNumber(void)
(0105)   {
(0106)     unsigned char PageAddressH;
(0107)     unsigned char PageAddressL;
(0108) 
(0109)     PageAddressH = RecChar();
    1E6E D098      RCALL	_RecChar
    1E6F 2F60      MOV	R22,R16
(0110) 
(0111)     PageAddressL = RecChar();
    1E70 D096      RCALL	_RecChar
    1E71 2F40      MOV	R20,R16
(0112) 
(0113)     PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
    1E72 2F16      MOV	R17,R22
    1E73 2F04      MOV	R16,R20
    1E74 E027      LDI	R18,7
    1E75 E030      LDI	R19,0
    1E76 940E1FB5  CALL	lsl16
    1E78 93100061  STS	_PageAddress+1,R17
    1E7A 93000060  STS	_PageAddress,R16
(0114)   }
    1E7C 940E1F90  CALL	pop_gset2
    1E7E 9508      RET
_GetPage:
  CheckSum             --> R20
  LocalCheckSum        --> R22
  i                    --> R10
    1E7F 940E1FB1  CALL	push_gset3
(0115) 
(0116) /*****************************************************************************/
(0117) char GetPage(void)
(0118)   {
(0119)     unsigned char i;
(0120)     unsigned char LocalCheckSum = 0;
    1E81 2766      CLR	R22
(0121)     unsigned char CheckSum = 0;
    1E82 2744      CLR	R20
(0122) 
(0123)     for (i=0;i<PageByte;i++)
    1E83 24AA      CLR	R10
    1E84 C00F      RJMP	0x1E94
(0124) 	{
(0125) 	PageBuffer[i]=RecChar();
    1E85 D081      RCALL	_RecChar
    1E86 E682      LDI	R24,0x62
    1E87 E090      LDI	R25,0
    1E88 2DEA      MOV	R30,R10
    1E89 27FF      CLR	R31
    1E8A 0FE8      ADD	R30,R24
    1E8B 1FF9      ADC	R31,R25
    1E8C 8300      STD	Z+0,R16
(0126) 	LocalCheckSum += PageBuffer[i];
    1E8D 2DEA      MOV	R30,R10
    1E8E 27FF      CLR	R31
    1E8F 0FE8      ADD	R30,R24
    1E90 1FF9      ADC	R31,R25
    1E91 8020      LDD	R2,Z+0
    1E92 0D62      ADD	R22,R2
    1E93 94A3      INC	R10
    1E94 2D8A      MOV	R24,R10
    1E95 3880      CPI	R24,0x80
    1E96 F370      BCS	0x1E85
(0127)    	}
(0128) 		   
(0129)     CheckSum = RecChar(); 
    1E97 D06F      RCALL	_RecChar
    1E98 2F40      MOV	R20,R16
(0130)     if (LocalCheckSum == CheckSum) return 1;
    1E99 1760      CP	R22,R16
    1E9A F411      BNE	0x1E9D
    1E9B E001      LDI	R16,1
    1E9C C001      RJMP	0x1E9E
(0131)     else return 0;
    1E9D 2700      CLR	R16
    1E9E 940E1F93  CALL	pop_gset3
    1EA0 9508      RET
_WriteFlash:
  TempInt              --> R20
  i                    --> R22
    1EA1 940E1FAD  CALL	push_gset2
(0132)   }
(0133) 
(0134) /*****************************************************************************/
(0135) void WriteFlash(void)
(0136)   {
(0137)     unsigned int i;
(0138)     unsigned int TempInt;
(0139) 
(0140)     for (i=0;i<PageByte;i+=2)
    1EA3 2766      CLR	R22
    1EA4 2777      CLR	R23
    1EA5 C017      RJMP	0x1EBD
(0141)       {
(0142)    	TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
    1EA6 E682      LDI	R24,0x62
    1EA7 E090      LDI	R25,0
    1EA8 01FB      MOVW	R30,R22
    1EA9 9631      ADIW	R30,1
    1EAA 0FE8      ADD	R30,R24
    1EAB 1FF9      ADC	R31,R25
    1EAC 8020      LDD	R2,Z+0
    1EAD 2433      CLR	R3
    1EAE 2C32      MOV	R3,R2
    1EAF 2422      CLR	R2
    1EB0 01FB      MOVW	R30,R22
    1EB1 0FE8      ADD	R30,R24
    1EB2 1FF9      ADC	R31,R25
    1EB3 8140      LDD	R20,Z+0
    1EB4 2755      CLR	R21
    1EB5 0D42      ADD	R20,R2
    1EB6 1D53      ADC	R21,R3
(0143)    	fill_temp_buffer(TempInt,i);    //call asm routine.
    1EB7 019B      MOVW	R18,R22
    1EB8 018A      MOVW	R16,R20
    1EB9 940E1F71  CALL	_fill_temp_buffer
    1EBB 5F6E      SUBI	R22,0xFE
    1EBC 4F7F      SBCI	R23,0xFF
    1EBD 3860      CPI	R22,0x80
    1EBE E0E0      LDI	R30,0
    1EBF 077E      CPC	R23,R30
    1EC0 F328      BCS	0x1EA6
(0144)       }
(0145) 	
(0146)     write_page(PageAddress,0x03);       //擦除页
    1EC1 E023      LDI	R18,3
    1EC2 91000060  LDS	R16,_PageAddress
    1EC4 91100061  LDS	R17,_PageAddress+1
    1EC6 940E1F6B  CALL	_write_page
(0147)     write_page(PageAddress,0x05);       //写页数据
    1EC8 E025      LDI	R18,5
    1EC9 91000060  LDS	R16,_PageAddress
    1ECB 91100061  LDS	R17,_PageAddress+1
    1ECD 940E1F6B  CALL	_write_page
(0148)    
(0149)     enableRWW();
    1ECF 940E1F85  CALL	_enableRWW
(0150)   }
    1ED1 940E1F90  CALL	pop_gset2
    1ED3 9508      RET
_CheckFlash:
  TempInt2             --> R20
  TempInt              --> R22
  i                    --> R10
    1ED4 940E1FB1  CALL	push_gset3
(0151) 
(0152) /*****************************************************************************/
(0153) 
(0154) char CheckFlash(void)
(0155)   {
(0156)     unsigned char i;							
(0157)     unsigned int TempInt;
(0158)     unsigned int TempInt2;
(0159) 
(0160)     for (i=0;i<PageByte;i+=2)
    1ED6 24AA      CLR	R10
    1ED7 C028      RJMP	0x1F00
(0161)       {
(0162) 	TempInt = read_program_memory(PageAddress + i,0x00);
    1ED8 2722      CLR	R18
    1ED9 2C2A      MOV	R2,R10
    1EDA 2433      CLR	R3
    1EDB 91000060  LDS	R16,_PageAddress
    1EDD 91100061  LDS	R17,_PageAddress+1
    1EDF 0D02      ADD	R16,R2
    1EE0 1D13      ADC	R17,R3
    1EE1 940E1F7E  CALL	_read_program_memory
    1EE3 01B8      MOVW	R22,R16
(0163) 	TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
    1EE4 E683      LDI	R24,0x63
    1EE5 E090      LDI	R25,0
    1EE6 2DEA      MOV	R30,R10
    1EE7 27FF      CLR	R31
    1EE8 0FE8      ADD	R30,R24
    1EE9 1FF9      ADC	R31,R25
    1EEA 8020      LDD	R2,Z+0
    1EEB 2433      CLR	R3
    1EEC 2C32      MOV	R3,R2
    1EED 2422      CLR	R2
    1EEE E682      LDI	R24,0x62
    1EEF E090      LDI	R25,0
    1EF0 2DEA      MOV	R30,R10
    1EF1 27FF      CLR	R31
    1EF2 0FE8      ADD	R30,R24
    1EF3 1FF9      ADC	R31,R25
    1EF4 8140      LDD	R20,Z+0
    1EF5 2755      CLR	R21
    1EF6 0D42      ADD	R20,R2

⌨️ 快捷键说明

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