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

📄 avrbootloader.lst

📁 本源码为C语言环境的ATMAGE8的BootLoader开发程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
     C13 E001      LDI	R16,1
     C14 BF05      OUT	0x35,R16
     C15 E002      LDI	R16,2
     C16 BF05      OUT	0x35,R16
     C17 E5CF      LDI	R28,0x5F
     C18 E0D4      LDI	R29,4
     C19 BFCD      OUT	0x3D,R28
     C1A BFDE      OUT	0x3E,R29
     C1B 51C0      SUBI	R28,0x10
     C1C 40D0      SBCI	R29,0
     C1D EA0A      LDI	R16,0xAA
     C1E 8308      STD	Y+0,R16
     C1F 2400      CLR	R0
     C20 E6E0      LDI	R30,0x60
     C21 E0F0      LDI	R31,0
     C22 E010      LDI	R17,0
     C23 3AE2      CPI	R30,0xA2
     C24 07F1      CPC	R31,R17
     C25 F011      BEQ	0x0C28
     C26 9201      ST	R0,Z+
     C27 CFFB      RJMP	0x0C23
     C28 8300      STD	Z+0,R16
     C29 E2E6      LDI	R30,0x26
     C2A E1F8      LDI	R31,0x18
     C2B E6A0      LDI	R26,0x60
     C2C E0B0      LDI	R27,0
     C2D E118      LDI	R17,0x18
     C2E E000      LDI	R16,0
     C2F BF0B      OUT	0x3B,R16
     C30 32E6      CPI	R30,0x26
     C31 07F1      CPC	R31,R17
     C32 F021      BEQ	0x0C37
     C33 95C8      LPM
     C34 9631      ADIW	R30,1
     C35 920D      ST	R0,X+
     C36 CFF9      RJMP	0x0C30
     C37 D0E1      RCALL	_main
_exit:
     C38 CFFF      RJMP	_exit
FILE: F:\AVR常用函数\BootLooderMage8\BootLoad_1M\main.c
(0001) /******************************************************************************
(0002) Atmega8、16 BootLoad程序  
(0003) 日  期:2004年的最后一天
(0004) 肖  鹏  www.527dz.com  527dz@527dz.com
(0005) 
(0006) /*****************************************************************************/
(0007) 
(0008) //修改pei2005.6.24
(0009) //1.针对W0和W1的硬件进行修改,主要是使用晶振、修改Baud、关无线模块
(0010) //2.增加:用户区无程序时不跳出Boot循环
(0011) //3.修正Bug:原GetPageNumber()由于移位的原因,PageAddress!=0xffff,即FlashLoad()无法退出
(0012) //4.增加:Page地址比较重要,也要效验,添加到GetPage()中
(0013) 
(0014) #include <macros.h>
(0015) #include "assembly.h"
(0016) 
(0017) #define W0
(0018) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0019) //请根据目标板选择芯片型号
(0020) #ifdef W0
(0021)  #define  ChipType     Atmega8
(0022) #else       
(0023)  #define  ChipType     Atmega16
(0024) #endif       
(0025) //#define  ChipType     Atmega32       
(0026) //#define  ChipType     Atmega64       
(0027) //#define  ChipType     Atmega128       
(0028) //#define  ChipType     Atmega8535       
(0029) //*********************************************************
(0030) //选择BOOT区大小
(0031) //#define  BootSize     'a'    //128   
(0032) //#define  BootSize     'b'    //256
(0033) #define  BootSize       'c'    //512
(0034) //#define  BootSize     'd'    //1024
(0035) //#define  BootSize     'e'    //2048(不知道是否有2048字BOOT空间的芯片)
(0036) //选择BootLoad版本号
(0037) //#define  BootVer        'f'    //1.0版本
(0038) #define  BootVer      'g'    //1.1版本 pei
(0039) //#define  BootVer      'h'    //1.2版本
(0040) //#define  BootVer      'i'    //1.3版本
(0041) //#define  BootVer      'j'    //1.4版本
(0042) //#define  BootVer      'k'    //1.5版本
(0043) //#define  BootVer      'l'    //1.6版本
(0044) //#define  BootVer      'm'    //1.7版本
(0045) //#define  BootVer      'n'    //1.8版本
(0046) //#define  BootVer      'o'    //1.9版本
(0047) //#define  BootVer      'p'    //2.0版本(应该是最终版本了)
(0048) //**********************************************************
(0049) #define  Atmega8        0x30
(0050) #define  Atmega16       0x31
(0051) #define  Atmega32       0x32
(0052) #define  Atmega64       0x33
(0053) #define  Atmega128      0x34
(0054) #define  Atmega8535     0x35
(0055) //*****************************************************************************
(0056) //#define  InteClk                 //是否使用内部时钟
(0057) #define  OscAddress     0x1fff   //时钟校准值存储地址
(0058) //#define  OscAddress     0x3fff   //时钟校准值存储地址
(0059) //*****************************************************************************
(0060) //8时钟下的波特率设置
(0061) //#define  BAU  103    //4800
(0062) #define  BAU  51       //9600
(0063) //#define  BAU  34     //14400
(0064) //#define  BAU  25     //19200
(0065) //*****************************************************************************
(0066) 
(0067) //11.0592M pei
(0068) //#define BAU 35 //pei baud19200
(0069) //#define BAU 17 //pei baud38400
(0070) 
(0071) #if (ChipType == Atmega8)
(0072)   #include  "iom8v.h"
(0073)   #define   PageByte 	 	 64 
(0074)   #define   AddressShift	 6
(0075) #endif
(0076) 
(0077) #if (ChipType == Atmega16)
(0078)   #include  "iom16v.h"
(0079)   #define   PageByte 	 	 128    
(0080)   #define   AddressShift 	 7
(0081) #endif
(0082) 
(0083) void          FlashLoad        (void);
(0084) void          GetPageNumber    (void);
(0085) void          ExecCode         (void);
(0086) char          GetPage          (void);
(0087) void          WriteFlash       (void);
(0088) char          CheckFlash       (void);
(0089) void          SendChar         (unsigned char c);
(0090) void          delay            (void);                 //1ms延时函数
(0091) unsigned char RecChar          (void);
(0092) 
(0093) unsigned char PageBuffer[PageByte];
(0094) unsigned int  PageAddress;
(0095) 
(0096) /*****************************************************************************/
(0097) //Flash编程								                     
(0098) /*****************************************************************************/
(0099) void FlashLoad(void)
(0100)   {unsigned char AddH,AddL;
(0101)     SendChar('!');
_FlashLoad:
  AddL                 --> Y,+1
  AddH                 --> Y,+1
     C39 E201      LDI	R16,0x21
     C3A D0B5      RCALL	_SendChar
     C3B C018      RJMP	0x0C54
(0102)     while (1)
(0103)       {
(0104) 	//GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) 	//if (PageAddress == 0xffff) return;//退不出了:) 
(0106)         
(0107) 	if (GetPage())
     C3C D019      RCALL	_GetPage
     C3D 2300      TST	R16
     C3E F099      BEQ	0x0C52
(0108) 	  { 
(0109) 	    if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
     C3F 9180 0060 LDS	R24,PageAddress
     C41 9190 0061 LDS	R25,PageAddress+1
     C43 3F8F      CPI	R24,0xFF
     C44 EFEF      LDI	R30,0xFF
     C45 079E      CPC	R25,R30
     C46 F409      BNE	0x0C48
     C47 C00D      RJMP	0x0C55
(0110) 	  
(0111) 	    WriteFlash();
     C48 D04B      RCALL	_WriteFlash
(0112) 	    if (CheckFlash()) SendChar('!');
     C49 D076      RCALL	_CheckFlash
     C4A 2300      TST	R16
     C4B F019      BEQ	0x0C4F
     C4C E201      LDI	R16,0x21
     C4D D0A2      RCALL	_SendChar
     C4E C005      RJMP	0x0C54
(0113) 	    else SendChar('@');
     C4F E400      LDI	R16,0x40
     C50 D09F      RCALL	_SendChar
(0114) 	  }
     C51 C002      RJMP	0x0C54
(0115) 	else SendChar('@');
     C52 E400      LDI	R16,0x40
     C53 D09C      RCALL	_SendChar
     C54 CFE7      RJMP	0x0C3C
     C55 9508      RET
_GetPage:
  CheckSum             --> R12
  AddL                 --> R14
  AddH                 --> R20
  LocalCheckSum        --> R10
  i                    --> R20
     C56 D14B      RCALL	push_xgset30FC
(0116)       }
(0117)   }
(0118) 
(0119) /****************************************************************************
(0120) void GetPageNumber(void)
(0121)   {
(0122)     unsigned char PageAddressH;
(0123)     unsigned char PageAddressL;
(0124) 
(0125)     PageAddressH = RecChar();
(0126) 
(0127)     PageAddressL = RecChar();
(0128) 	
(0129) 	PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
(0130)   }
(0131) 
(0132) /*****************************************************************************/
(0133) char GetPage(void)
(0134)   {
(0135)     unsigned char i,AddH,AddL;
(0136)     unsigned char LocalCheckSum = 0;
     C57 24AA      CLR	R10
(0137)     unsigned char CheckSum = 0;
     C58 24CC      CLR	R12
(0138) 
(0139) 	AddH=RecChar();AddL=RecChar();
     C59 D092      RCALL	_RecChar
     C5A 2F40      MOV	R20,R16
     C5B D090      RCALL	_RecChar
     C5C 2EE0      MOV	R14,R16
(0140) 	PageAddress=(AddH<<8)+AddL;
     C5D 2E34      MOV	R3,R20
     C5E 2C2E      MOV	R2,R14
     C5F 9230 0061 STS	PageAddress+1,R3
     C61 9220 0060 STS	PageAddress,R2
(0141) 	if (PageAddress==0xffff) return 1;//exit..
     C63 01C1      MOVW	R24,R2
     C64 3F8F      CPI	R24,0xFF
     C65 EFEF      LDI	R30,0xFF
     C66 079E      CPC	R25,R30
     C67 F411      BNE	0x0C6A
     C68 E001      LDI	R16,1
     C69 C029      RJMP	0x0C93
(0142) 	PageAddress=PageAddress<<AddressShift;
     C6A E026      LDI	R18,6
     C6B E030      LDI	R19,0
     C6C 9100 0060 LDS	R16,PageAddress
     C6E 9110 0061 LDS	R17,PageAddress+1
     C70 D152      RCALL	lsl16
     C71 9310 0061 STS	PageAddress+1,R17
     C73 9300 0060 STS	PageAddress,R16
(0143) 	LocalCheckSum=AddH+AddL;//pei考虑Page的效验
     C75 2EA4      MOV	R10,R20
     C76 0CAE      ADD	R10,R14
(0144) 	
(0145)     for (i=0;i<PageByte;i++)
     C77 2744      CLR	R20
     C78 C010      RJMP	0x0C89
(0146) 	{
(0147) 	PageBuffer[i]=RecChar();
     C79 D072      RCALL	_RecChar
     C7A 2EE0      MOV	R14,R16
     C7B E682      LDI	R24,0x62
     C7C E090      LDI	R25,0
     C7D 2FE4      MOV	R30,R20
     C7E 27FF      CLR	R31
     C7F 0FE8      ADD	R30,R24
     C80 1FF9      ADC	R31,R25
     C81 82E0      STD	Z+0,R14
(0148) 	LocalCheckSum += PageBuffer[i];
     C82 2FE4      MOV	R30,R20
     C83 27FF      CLR	R31
     C84 0FE8      ADD	R30,R24
     C85 1FF9      ADC	R31,R25
     C86 8020      LDD	R2,Z+0
     C87 0CA2      ADD	R10,R2
     C88 9543      INC	R20
     C89 3440      CPI	R20,0x40
     C8A F370      BCS	0x0C79
(0149)    	}
(0150) 		   
(0151)     CheckSum = RecChar(); 
     C8B D060      RCALL	_RecChar
     C8C 2EE0      MOV	R14,R16
     C8D 2CCE      MOV	R12,R14
(0152)     if (LocalCheckSum == CheckSum) return 1;
     C8E 16A0      CP	R10,R16
     C8F F411      BNE	0x0C92
     C90 E001      LDI	R16,1
     C91 C001      RJMP	0x0C93
(0153)     else return 0;
     C92 2700      CLR	R16
     C93 C103      RJMP	pop_xgset30FC
_WriteFlash:
  TempInt              --> R10
  i                    --> R20
     C94 D116      RCALL	push_xgset300C
(0154)   }
(0155) 
(0156) /*****************************************************************************/
(0157) void WriteFlash(void)
(0158)   {
(0159)     unsigned int i;
(0160)     unsigned int TempInt;
(0161) 
(0162)     for (i=0;i<PageByte;i+=2)
     C95 2744      CLR	R20
     C96 2755      CLR	R21
     C97 C016      RJMP	0x0CAE
(0163)       {
(0164)    	TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
     C98 E682      LDI	R24,0x62
     C99 E090      LDI	R25,0
     C9A 01FA      MOVW	R30,R20
     C9B 9631      ADIW	R30,1
     C9C 0FE8      ADD	R30,R24
     C9D 1FF9      ADC	R31,R25
     C9E 8020      LDD	R2,Z+0
     C9F 2433      CLR	R3
     CA0 2C32      MOV	R3,R2
     CA1 2422      CLR	R2
     CA2 01FA      MOVW	R30,R20
     CA3 0FE8      ADD	R30,R24
     CA4 1FF9      ADC	R31,R25
     CA5 80A0      LDD	R10,Z+0
     CA6 24BB      CLR	R11
     CA7 0CA2      ADD	R10,R2
     CA8 1CB3      ADC	R11,R3
(0165)    	fill_temp_buffer(TempInt,i);    //call asm routine.
     CA9 019A      MOVW	R18,R20
     CAA 0185      MOVW	R16,R10
     CAB D0CC      RCALL	_fill_temp_buffer
     CAC 5F4E      SUBI	R20,0xFE
     CAD 4F5F      SBCI	R21,0xFF
     CAE 3440      CPI	R20,0x40
     CAF E0E0      LDI	R30,0
     CB0 075E      CPC	R21,R30
     CB1 F330      BCS	0x0C98
(0166)       }
(0167) 	
(0168)     write_page(PageAddress,0x03);       //擦除页
     CB2 E023      LDI	R18,3
     CB3 9100 0060 LDS	R16,PageAddress
     CB5 9110 0061 LDS	R17,PageAddress+1
     CB7 D0BA      RCALL	_write_page
(0169)     write_page(PageAddress,0x05);       //写页数据
     CB8 E025      LDI	R18,5
     CB9 9100 0060 LDS	R16,PageAddress
     CBB 9110 0061 LDS	R17,PageAddress+1
     CBD D0B4      RCALL	_write_page
(0170)    
(0171)     enableRWW();
     CBE D0CD      RCALL	_enableRWW
     CBF C0F0      RJMP	pop_xgset300C
_CheckFlash:
  TempInt2             --> R12
  TempInt              --> R10
  i                    --> R20
     CC0 D0F4      RCALL	push_xgset303C
(0172)   }
(0173) 
(0174) /*****************************************************************************/
(0175) 
(0176) char CheckFlash(void)
(0177)   {
(0178)     unsigned char i;							
(0179)     unsigned int TempInt;
(0180)     unsigned int TempInt2;
(0181) 
(0182)     for (i=0;i<PageByte;i+=2)
     CC1 2744      CLR	R20
     CC2 C025      RJMP	0x0CE8
(0183)       {
(0184) 	TempInt = read_program_memory(PageAddress + i,0x00);
     CC3 2722      CLR	R18
     CC4 2E24      MOV	R2,R20
     CC5 2433      CLR	R3
     CC6 9100 0060 LDS	R16,PageAddress
     CC8 9110 0061 LDS	R17,PageAddress+1
     CCA 0D02      ADD	R16,R2
     CCB 1D13      ADC	R17,R3
     CCC D0B8      RCALL	_read_program_memory
     CCD 0158      MOVW	R10,R16
(0185) 	TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
     CCE E683      LDI	R24,0x63
     CCF E090      LDI	R25,0
     CD0 2FE4      MOV	R30,R20
     CD1 27FF      CLR	R31
     CD2 0FE8      ADD	R30,R24
     CD3 1FF9      ADC	R31,R25
     CD4 8020      LDD	R2,Z+0
     CD5 2433      CLR	R3
     CD6 2C32      MOV	R3,R2
     CD7 2422      CLR	R2
     CD8 E682      LDI	R24,0x62
     CD9 E090      LDI	R25,0
     CDA 2FE4      MOV	R30,R20
     CDB 27FF      CLR	R31
     CDC 0FE8      ADD	R30,R24
     CDD 1FF9      ADC	R31,R25
     CDE 80C0      LDD	R12,Z+0
     CDF 24DD      CLR	R13
     CE0 0CC2      ADD	R12,R2
     CE1 1CD3      ADC	R13,R3
(0186) 	if (TempInt != TempInt2) return 0;
     CE2 150C      CP	R16,R12
     CE3 051D      CPC	R17,R13
     CE4 F011      BEQ	0x0CE7
     CE5 2700      CLR	R16
     CE6 C004      RJMP	0x0CEB
     CE7 5F4E      SUBI	R20,0xFE
     CE8 3440      CPI	R20,0x40
     CE9 F2C8      BCS	0x0CC3
(0187)       }
(0188)     return 1;
     CEA E001      LDI	R16,1
     CEB C0D0      RJMP	pop_xgset303C
(0189)   }
(0190) 
(0191) /*****************************************************************************/

⌨️ 快捷键说明

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