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

📄 avrbootloader.lst

📁 ATmal mega88 芯片的bootload源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    1E34 E001      LDI	R16,1
    1E35 BF05      OUT	0x35,R16
    1E36 E002      LDI	R16,2
    1E37 BF05      OUT	0x35,R16
    1E38 EFCF      LDI	R28,0xFF
    1E39 E0D4      LDI	R29,4
    1E3A BFCD      OUT	0x3D,R28
    1E3B BFDE      OUT	0x3E,R29
    1E3C 51C0      SUBI	R28,0x10
    1E3D 40D0      SBCI	R29,0
    1E3E EA0A      LDI	R16,0xAA
    1E3F 8308      STD	Y+0,R16
    1E40 2400      CLR	R0
    1E41 E0E0      LDI	R30,0
    1E42 E0F1      LDI	R31,1
    1E43 E011      LDI	R17,1
    1E44 38E2      CPI	R30,0x82
    1E45 07F1      CPC	R31,R17
    1E46 F011      BEQ	0x1E49
    1E47 9201      ST	R0,Z+
    1E48 CFFB      RJMP	0x1E44
    1E49 8300      STD	Z+0,R16
    1E4A E6E8      LDI	R30,0x68
    1E4B E3FC      LDI	R31,0x3C
    1E4C E0A0      LDI	R26,0
    1E4D E0B1      LDI	R27,1
    1E4E E31C      LDI	R17,0x3C
    1E4F E000      LDI	R16,0
    1E50 BF0B      OUT	0x3B,R16
    1E51 36E8      CPI	R30,0x68
    1E52 07F1      CPC	R31,R17
    1E53 F021      BEQ	0x1E58
    1E54 95C8      LPM
    1E55 9631      ADIW	R30,1
    1E56 920D      ST	R0,X+
    1E57 CFF9      RJMP	0x1E51
    1E58 940E 1F3F CALL	_main
_exit:
    1E5A CFFF      RJMP	_exit
FILE: F:\程序\新建文~1\BootLoad_88可用\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  "iom88v.h"
(0073)   #define   PageByte 	 	 64 
(0074)   #define   AddressShift	 6
(0075) #endif
(0076) 
(0077) #if (ChipType == Atmega16)
(0078)   #include  "iom168v.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
    1E5B E201      LDI	R16,0x21
    1E5C D0C2      RCALL	_SendChar
    1E5D C018      RJMP	0x1E76
(0102)     while (1)
(0103)       {
(0104) 	//GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) 	//if (PageAddress == 0xffff) return;//退不出了:) 
(0106)         
(0107) 	if (GetPage())
    1E5E D019      RCALL	_GetPage
    1E5F 2300      TST	R16
    1E60 F099      BEQ	0x1E74
(0108) 	  { 
(0109) 	    if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
    1E61 9180 0100 LDS	R24,PageAddress
    1E63 9190 0101 LDS	R25,PageAddress+1
    1E65 3F8F      CPI	R24,0xFF
    1E66 EFEF      LDI	R30,0xFF
    1E67 079E      CPC	R25,R30
    1E68 F409      BNE	0x1E6A
    1E69 C00D      RJMP	0x1E77
(0110) 	  
(0111) 	    WriteFlash();
    1E6A D04C      RCALL	_WriteFlash
(0112) 	    if (CheckFlash()) SendChar('!');
    1E6B D07D      RCALL	_CheckFlash
    1E6C 2300      TST	R16
    1E6D F019      BEQ	0x1E71
    1E6E E201      LDI	R16,0x21
    1E6F D0AF      RCALL	_SendChar
    1E70 C005      RJMP	0x1E76
(0113) 	    else SendChar('@');
    1E71 E400      LDI	R16,0x40
    1E72 D0AC      RCALL	_SendChar
(0114) 	  }
    1E73 C002      RJMP	0x1E76
(0115) 	else SendChar('@');
    1E74 E400      LDI	R16,0x40
    1E75 D0A9      RCALL	_SendChar
    1E76 CFE7      RJMP	0x1E5E
    1E77 9508      RET
_GetPage:
  AddL                 --> R20
  AddH                 --> R14
  CheckSum             --> R12
  LocalCheckSum        --> R10
  i                    --> R20
    1E78 940E 1FB4 CALL	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;
    1E7A 24AA      CLR	R10
(0137)     unsigned char CheckSum = 0;
    1E7B 24CC      CLR	R12
(0138) 
(0139) 	AddH=RecChar();AddL=RecChar();
    1E7C D09B      RCALL	_RecChar
    1E7D 2EE0      MOV	R14,R16
    1E7E D099      RCALL	_RecChar
    1E7F 2F40      MOV	R20,R16
(0140) 	PageAddress=(AddH<<8)+AddL;
    1E80 2C3E      MOV	R3,R14
    1E81 2E24      MOV	R2,R20
    1E82 9230 0101 STS	PageAddress+1,R3
    1E84 9220 0100 STS	PageAddress,R2
(0141) 	if (PageAddress==0xffff) return 1;//exit..
    1E86 01C1      MOVW	R24,R2
    1E87 3F8F      CPI	R24,0xFF
    1E88 EFEF      LDI	R30,0xFF
    1E89 079E      CPC	R25,R30
    1E8A F411      BNE	0x1E8D
    1E8B E001      LDI	R16,1
    1E8C C028      RJMP	0x1EB5
(0142) 	PageAddress=PageAddress<<AddressShift;
    1E8D E027      LDI	R18,7
    1E8E E030      LDI	R19,0
    1E8F 9100 0100 LDS	R16,PageAddress
    1E91 9110 0101 LDS	R17,PageAddress+1
    1E93 940E 1FD5 CALL	lsl16
    1E95 9310 0101 STS	PageAddress+1,R17
    1E97 9300 0100 STS	PageAddress,R16
(0143) //	LocalCheckSum=AddH+AddL;//pei考虑Page的效验
(0144) 	
(0145)     for (i=0;i<PageByte;i++)
    1E99 2744      CLR	R20
    1E9A C010      RJMP	0x1EAB
(0146) 	{
(0147) 	PageBuffer[i]=RecChar();
    1E9B D07C      RCALL	_RecChar
    1E9C 2EE0      MOV	R14,R16
    1E9D E082      LDI	R24,2
    1E9E E091      LDI	R25,1
    1E9F 2FE4      MOV	R30,R20
    1EA0 27FF      CLR	R31
    1EA1 0FE8      ADD	R30,R24
    1EA2 1FF9      ADC	R31,R25
    1EA3 82E0      STD	Z+0,R14
(0148) 	LocalCheckSum += PageBuffer[i];
    1EA4 2FE4      MOV	R30,R20
    1EA5 27FF      CLR	R31
    1EA6 0FE8      ADD	R30,R24
    1EA7 1FF9      ADC	R31,R25
    1EA8 8020      LDD	R2,Z+0
    1EA9 0CA2      ADD	R10,R2
    1EAA 9543      INC	R20
    1EAB 3840      CPI	R20,0x80
    1EAC F370      BCS	0x1E9B
(0149)    	}
(0150) 		   
(0151)     CheckSum = RecChar(); 
    1EAD D06A      RCALL	_RecChar
    1EAE 2EE0      MOV	R14,R16
    1EAF 2CCE      MOV	R12,R14
(0152)     if (LocalCheckSum == CheckSum) return 1;
    1EB0 16A0      CP	R10,R16
    1EB1 F411      BNE	0x1EB4
    1EB2 E001      LDI	R16,1
    1EB3 C001      RJMP	0x1EB5
(0153)     else return 0;
    1EB4 2700      CLR	R16
    1EB5 940C 1FA9 JMP	pop_xgset30FC
_WriteFlash:
  TempInt              --> R10
  i                    --> R20
    1EB7 940E 1FBD CALL	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)
    1EB9 2744      CLR	R20
    1EBA 2755      CLR	R21
    1EBB C017      RJMP	0x1ED3
(0163)       {
(0164)    	TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
    1EBC E082      LDI	R24,2
    1EBD E091      LDI	R25,1
    1EBE 01FA      MOVW	R30,R20
    1EBF 9631      ADIW	R30,1
    1EC0 0FE8      ADD	R30,R24
    1EC1 1FF9      ADC	R31,R25
    1EC2 8020      LDD	R2,Z+0
    1EC3 2433      CLR	R3
    1EC4 2C32      MOV	R3,R2
    1EC5 2422      CLR	R2
    1EC6 01FA      MOVW	R30,R20
    1EC7 0FE8      ADD	R30,R24
    1EC8 1FF9      ADC	R31,R25
    1EC9 80A0      LDD	R10,Z+0
    1ECA 24BB      CLR	R11
    1ECB 0CA2      ADD	R10,R2
    1ECC 1CB3      ADC	R11,R3
(0165)    	fill_temp_buffer(TempInt,i);    //call asm routine.
    1ECD 019A      MOVW	R18,R20
    1ECE 0185      MOVW	R16,R10
    1ECF 940E 1F8A CALL	_fill_temp_buffer
    1ED1 5F4E      SUBI	R20,0xFE
    1ED2 4F5F      SBCI	R21,0xFF
    1ED3 3840      CPI	R20,0x80
    1ED4 E0E0      LDI	R30,0
    1ED5 075E      CPC	R21,R30
    1ED6 F328      BCS	0x1EBC
(0166)       }
(0167) 	
(0168)     write_page(PageAddress,0x03);       //擦除页
    1ED7 E023      LDI	R18,3
    1ED8 9100 0100 LDS	R16,PageAddress
    1EDA 9110 0101 LDS	R17,PageAddress+1
    1EDC 940E 1F84 CALL	_write_page
(0169)     write_page(PageAddress,0x05);       //写页数据
    1EDE E025      LDI	R18,5
    1EDF 9100 0100 LDS	R16,PageAddress
    1EE1 9110 0101 LDS	R17,PageAddress+1
    1EE3 940E 1F84 CALL	_write_page
(0170)    
(0171)     enableRWW();
    1EE5 940E 1F9E CALL	_enableRWW
    1EE7 940C 1FC2 JMP	pop_xgset300C
_CheckFlash:
  TempInt2             --> R12
  TempInt              --> R10
  i                    --> R20
    1EE9 940E 1FC7 CALL	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)
    1EEB 2744      CLR	R20
    1EEC C026      RJMP	0x1F13
(0183)       {
(0184) 	TempInt = read_program_memory(PageAddress + i,0x00);
    1EED 2722      CLR	R18
    1EEE 2E24      MOV	R2,R20
    1EEF 2433      CLR	R3
    1EF0 9100 0100 LDS	R16,PageAddress
    1EF2 9110 0101 LDS	R17,PageAddress+1
    1EF4 0D02      ADD	R16,R2
    1EF5 1D13      ADC	R17,R3
    1EF6 940E 1F97 CALL	_read_program_memory
    1EF8 0158      MOVW	R10,R16
(0185) 	TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
    1EF9 E083      LDI	R24,3
    1EFA E091      LDI	R25,1
    1EFB 2FE4      MOV	R30,R20
    1EFC 27FF      CLR	R31
    1EFD 0FE8      ADD	R30,R24
    1EFE 1FF9      ADC	R31,R25
    1EFF 8020      LDD	R2,Z+0
    1F00 2433      CLR	R3

⌨️ 快捷键说明

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