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

📄 avrbootloader.lst

📁 本源码为C语言环境的ATMAGE8的BootLoader开发程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
     E13 E001      LDI	R16,1
     E14 BF05      OUT	0x35,R16
     E15 E002      LDI	R16,2
     E16 BF05      OUT	0x35,R16
     E17 E5CF      LDI	R28,0x5F
     E18 E0D4      LDI	R29,4
     E19 BFCD      OUT	0x3D,R28
     E1A BFDE      OUT	0x3E,R29
     E1B 51C0      SUBI	R28,0x10
     E1C 40D0      SBCI	R29,0
     E1D EA0A      LDI	R16,0xAA
     E1E 8308      STD	Y+0,R16
     E1F 2400      CLR	R0
     E20 E6E0      LDI	R30,0x60
     E21 E0F0      LDI	R31,0
     E22 E010      LDI	R17,0
     E23 3AE2      CPI	R30,0xA2
     E24 07F1      CPC	R31,R17
     E25 F011      BEQ	0x0E28
     E26 9201      ST	R0,Z+
     E27 CFFB      RJMP	0x0E23
     E28 8300      STD	Z+0,R16
     E29 E2E6      LDI	R30,0x26
     E2A E1FC      LDI	R31,0x1C
     E2B E6A0      LDI	R26,0x60
     E2C E0B0      LDI	R27,0
     E2D E11C      LDI	R17,0x1C
     E2E E000      LDI	R16,0
     E2F BF0B      OUT	0x3B,R16
     E30 32E6      CPI	R30,0x26
     E31 07F1      CPC	R31,R17
     E32 F021      BEQ	0x0E37
     E33 95C8      LPM
     E34 9631      ADIW	R30,1
     E35 920D      ST	R0,X+
     E36 CFF9      RJMP	0x0E30
     E37 D0D5      RCALL	_main
_exit:
     E38 CFFF      RJMP	_exit
FILE: F:\AVR常用函数\BootLooderMage8\BootLoad_8M\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
     E39 E201      LDI	R16,0x21
     E3A D0B5      RCALL	_SendChar
     E3B C018      RJMP	0x0E54
(0102)     while (1)
(0103)       {
(0104) 	//GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) 	//if (PageAddress == 0xffff) return;//退不出了:) 
(0106)         
(0107) 	if (GetPage())
     E3C D019      RCALL	_GetPage
     E3D 2300      TST	R16
     E3E F099      BEQ	0x0E52
(0108) 	  { 
(0109) 	    if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
     E3F 9180 0060 LDS	R24,PageAddress
     E41 9190 0061 LDS	R25,PageAddress+1
     E43 3F8F      CPI	R24,0xFF
     E44 EFEF      LDI	R30,0xFF
     E45 079E      CPC	R25,R30
     E46 F409      BNE	0x0E48
     E47 C00D      RJMP	0x0E55
(0110) 	  
(0111) 	    WriteFlash();
     E48 D04B      RCALL	_WriteFlash
(0112) 	    if (CheckFlash()) SendChar('!');
     E49 D076      RCALL	_CheckFlash
     E4A 2300      TST	R16
     E4B F019      BEQ	0x0E4F
     E4C E201      LDI	R16,0x21
     E4D D0A2      RCALL	_SendChar
     E4E C005      RJMP	0x0E54
(0113) 	    else SendChar('@');
     E4F E400      LDI	R16,0x40
     E50 D09F      RCALL	_SendChar
(0114) 	  }
     E51 C002      RJMP	0x0E54
(0115) 	else SendChar('@');
     E52 E400      LDI	R16,0x40
     E53 D09C      RCALL	_SendChar
     E54 CFE7      RJMP	0x0E3C
     E55 9508      RET
_GetPage:
  CheckSum             --> R12
  AddL                 --> R14
  AddH                 --> R20
  LocalCheckSum        --> R10
  i                    --> R20
     E56 D136      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;
     E57 24AA      CLR	R10
(0137)     unsigned char CheckSum = 0;
     E58 24CC      CLR	R12
(0138) 
(0139) 	AddH=RecChar();AddL=RecChar();
     E59 D092      RCALL	_RecChar
     E5A 2F40      MOV	R20,R16
     E5B D090      RCALL	_RecChar
     E5C 2EE0      MOV	R14,R16
(0140) 	PageAddress=(AddH<<8)+AddL;
     E5D 2E34      MOV	R3,R20
     E5E 2C2E      MOV	R2,R14
     E5F 9230 0061 STS	PageAddress+1,R3
     E61 9220 0060 STS	PageAddress,R2
(0141) 	if (PageAddress==0xffff) return 1;//exit..
     E63 01C1      MOVW	R24,R2
     E64 3F8F      CPI	R24,0xFF
     E65 EFEF      LDI	R30,0xFF
     E66 079E      CPC	R25,R30
     E67 F411      BNE	0x0E6A
     E68 E001      LDI	R16,1
     E69 C029      RJMP	0x0E93
(0142) 	PageAddress=PageAddress<<AddressShift;
     E6A E026      LDI	R18,6
     E6B E030      LDI	R19,0
     E6C 9100 0060 LDS	R16,PageAddress
     E6E 9110 0061 LDS	R17,PageAddress+1
     E70 D13D      RCALL	lsl16
     E71 9310 0061 STS	PageAddress+1,R17
     E73 9300 0060 STS	PageAddress,R16
(0143) 	LocalCheckSum=AddH+AddL;//pei考虑Page的效验
     E75 2EA4      MOV	R10,R20
     E76 0CAE      ADD	R10,R14
(0144) 	
(0145)     for (i=0;i<PageByte;i++)
     E77 2744      CLR	R20
     E78 C010      RJMP	0x0E89
(0146) 	{
(0147) 	PageBuffer[i]=RecChar();
     E79 D072      RCALL	_RecChar
     E7A 2EE0      MOV	R14,R16
     E7B E682      LDI	R24,0x62
     E7C E090      LDI	R25,0
     E7D 2FE4      MOV	R30,R20
     E7E 27FF      CLR	R31
     E7F 0FE8      ADD	R30,R24
     E80 1FF9      ADC	R31,R25
     E81 82E0      STD	Z+0,R14
(0148) 	LocalCheckSum += PageBuffer[i];
     E82 2FE4      MOV	R30,R20
     E83 27FF      CLR	R31
     E84 0FE8      ADD	R30,R24
     E85 1FF9      ADC	R31,R25
     E86 8020      LDD	R2,Z+0
     E87 0CA2      ADD	R10,R2
     E88 9543      INC	R20
     E89 3440      CPI	R20,0x40
     E8A F370      BCS	0x0E79
(0149)    	}
(0150) 		   
(0151)     CheckSum = RecChar(); 
     E8B D060      RCALL	_RecChar
     E8C 2EE0      MOV	R14,R16
     E8D 2CCE      MOV	R12,R14
(0152)     if (LocalCheckSum == CheckSum) return 1;
     E8E 16A0      CP	R10,R16
     E8F F411      BNE	0x0E92
     E90 E001      LDI	R16,1
     E91 C001      RJMP	0x0E93
(0153)     else return 0;
     E92 2700      CLR	R16
     E93 C0EE      RJMP	pop_xgset30FC
_WriteFlash:
  TempInt              --> R10
  i                    --> R20
     E94 D101      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)
     E95 2744      CLR	R20
     E96 2755      CLR	R21
     E97 C016      RJMP	0x0EAE
(0163)       {
(0164)    	TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
     E98 E682      LDI	R24,0x62
     E99 E090      LDI	R25,0
     E9A 01FA      MOVW	R30,R20
     E9B 9631      ADIW	R30,1
     E9C 0FE8      ADD	R30,R24
     E9D 1FF9      ADC	R31,R25
     E9E 8020      LDD	R2,Z+0
     E9F 2433      CLR	R3
     EA0 2C32      MOV	R3,R2
     EA1 2422      CLR	R2
     EA2 01FA      MOVW	R30,R20
     EA3 0FE8      ADD	R30,R24
     EA4 1FF9      ADC	R31,R25
     EA5 80A0      LDD	R10,Z+0
     EA6 24BB      CLR	R11
     EA7 0CA2      ADD	R10,R2
     EA8 1CB3      ADC	R11,R3
(0165)    	fill_temp_buffer(TempInt,i);    //call asm routine.
     EA9 019A      MOVW	R18,R20
     EAA 0185      MOVW	R16,R10
     EAB D0B7      RCALL	_fill_temp_buffer
     EAC 5F4E      SUBI	R20,0xFE
     EAD 4F5F      SBCI	R21,0xFF
     EAE 3440      CPI	R20,0x40
     EAF E0E0      LDI	R30,0
     EB0 075E      CPC	R21,R30
     EB1 F330      BCS	0x0E98
(0166)       }
(0167) 	
(0168)     write_page(PageAddress,0x03);       //擦除页
     EB2 E023      LDI	R18,3
     EB3 9100 0060 LDS	R16,PageAddress
     EB5 9110 0061 LDS	R17,PageAddress+1
     EB7 D0A5      RCALL	_write_page
(0169)     write_page(PageAddress,0x05);       //写页数据
     EB8 E025      LDI	R18,5
     EB9 9100 0060 LDS	R16,PageAddress
     EBB 9110 0061 LDS	R17,PageAddress+1
     EBD D09F      RCALL	_write_page
(0170)    
(0171)     enableRWW();
     EBE D0B8      RCALL	_enableRWW
     EBF C0DB      RJMP	pop_xgset300C
_CheckFlash:
  TempInt2             --> R12
  TempInt              --> R10
  i                    --> R20
     EC0 D0DF      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)
     EC1 2744      CLR	R20
     EC2 C025      RJMP	0x0EE8
(0183)       {
(0184) 	TempInt = read_program_memory(PageAddress + i,0x00);
     EC3 2722      CLR	R18
     EC4 2E24      MOV	R2,R20
     EC5 2433      CLR	R3
     EC6 9100 0060 LDS	R16,PageAddress
     EC8 9110 0061 LDS	R17,PageAddress+1
     ECA 0D02      ADD	R16,R2
     ECB 1D13      ADC	R17,R3
     ECC D0A3      RCALL	_read_program_memory
     ECD 0158      MOVW	R10,R16
(0185) 	TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
     ECE E683      LDI	R24,0x63
     ECF E090      LDI	R25,0
     ED0 2FE4      MOV	R30,R20
     ED1 27FF      CLR	R31
     ED2 0FE8      ADD	R30,R24
     ED3 1FF9      ADC	R31,R25
     ED4 8020      LDD	R2,Z+0
     ED5 2433      CLR	R3
     ED6 2C32      MOV	R3,R2
     ED7 2422      CLR	R2
     ED8 E682      LDI	R24,0x62
     ED9 E090      LDI	R25,0
     EDA 2FE4      MOV	R30,R20
     EDB 27FF      CLR	R31
     EDC 0FE8      ADD	R30,R24

⌨️ 快捷键说明

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