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

📄 main.lst

📁 Atmeag16 bootloader 测试程序 测试通过
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0000 CFFF      RJMP	__text_start
    0001 E0D2      LDI	R29,2
    0002 BFCD      OUT	0x3D,R28
    0003 BFDE      OUT	0x3E,R29
    0004 51C0      SUBI	R28,0x10
    0005 40D0      SBCI	R29,0
    0006 EA0A      LDI	R16,0xAA
    0007 8308      STD	Y+0,R16
    0008 2400      CLR	R0
    0009 E6E0      LDI	R30,0x60
    000A E0F0      LDI	R31,0
    000B E010      LDI	R17,0
    000C 3EE4      CPI	R30,0xE4
    000D 07F1      CPC	R31,R17
    000E F011      BEQ	0x0011
    000F 9201      ST	R0,Z+
    0010 CFFB      RJMP	0x000C
    0011 8300      STD	Z+0,R16
    0012 E0E0      LDI	R30,0
    0013 E0F0      LDI	R31,0
    0014 E6A0      LDI	R26,0x60
    0015 E0B0      LDI	R27,0
    0016 E010      LDI	R17,0
    0017 30E0      CPI	R30,0
    0018 07F1      CPC	R31,R17
    0019 F021      BEQ	0x001E
    001A 95C8      LPM
    001B 9631      ADIW	R30,1
    001C 920D      ST	R0,X+
    001D CFF9      RJMP	0x0017
    001E D115      RCALL	_main
_exit:
    001F CFFF      RJMP	_exit
FILE: C:\DOCUME~1\zhuji\桌面\AVR_BO~1.2\assembly.s
(0001) 	.text
(0002) 
(0003) ;*********************************************************
(0004) ;*********************************************************
(0005) ;*********************************************************
(0006) ;*********************************************************
(0007) ; DO NOT CHANGE ANYTHING BELOW THIS LINE !!!!!!!
(0008) ;*********************************************************
(0009) ;*********************************************************
(0010) ;*********************************************************
(0011) ;*********************************************************
(0012) 
(0013) 
(0014)     SPMCR = 0x57
(0015) 
(0016) 
(0017) ;-----------------------------------------  
(0018) 
(0019) ; void write_page (unsigned int adr, unsigned char function);
(0020) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0021) _write_page::
(0022)     XCALL __WAIT_SPMEN__
_write_page:
    0020 D01F      RCALL	0x0040
(0023)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    0021 01F8      MOVW	R30,R16
(0024)     STS     SPMCR, R18      ;argument 2 decides function
    0022 93200057  STS	0x57,R18
(0025)     SPM                     ;perform pagewrite
    0024 95E8      SPM
(0026)     RET
    0025 9508      RET
(0027) 
(0028) ;-----------------------------------------
(0029) 
(0030) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0031) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0032) _fill_temp_buffer::
(0033)     XCALL __WAIT_SPMEN__
_fill_temp_buffer:
    0026 D019      RCALL	0x0040
(0034)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    0027 01F9      MOVW	R30,R18
(0035)     movw    r0, r16         ;move data to reg 0 and 1
    0028 0108      MOVW	R0,R16
(0036)     LDI     R19, 0x01
    0029 E031      LDI	R19,1
(0037)     STS     SPMCR, R19
    002A 93300057  STS	0x57,R19
(0038)     SPM                     ;Store program memory
    002C 95E8      SPM
(0039)     RET      
    002D 9508      RET
(0040) 	
(0041) ;-----------------------------------------	
(0042) 
(0043) ;unsigned char read_flash(unsigned int add);
(0044) _read_flash::
(0045)     mov r31,r17
_read_flash:
    002E 2FF1      MOV	R31,R17
(0046)     mov r30,r16
    002F 2FE0      MOV	R30,R16
(0047)     lpm r16,z
    0030 9104      LPM	R16,0(Z)
(0048)     clr r17
    0031 2711      CLR	R17
(0049)     ret	
    0032 9508      RET
(0050) 		
(0051) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0052) _read_program_memory::
(0053)     movw    r30, r16        ;move adress to z pointer
_read_program_memory:
    0033 01F8      MOVW	R30,R16
(0054)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    0034 FD20      SBRC	R18,0
(0055)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    0035 93200057  STS	0x57,R18
(0056)     LPM     r16, Z+
    0037 9105      LPM	R16,Z+
(0057)     LPM     r17, Z
    0038 9114      LPM	R17,0(Z)
(0058)     RET
    0039 9508      RET
(0059) 	
(0060) ;-----------------------------------------
(0061)         
(0062) _enableRWW::
(0063) 	XCALL __WAIT_SPMEN__
_enableRWW:
    003A D005      RCALL	0x0040
(0064)     LDI R27,0x11
    003B E1B1      LDI	R27,0x11
(0065)     STS SPMCR,R27
    003C 93B00057  STS	0x57,R27
(0066)     SPM
    003E 95E8      SPM
(0067)     RET   
    003F 9508      RET
(0068) 	
(0069) ;-----------------------------------------           
(0070) 
(0071) __WAIT_SPMEN__:
(0072)     LDS     R27,SPMCR       ; load SPMCR to R27
    0040 91B00057  LDS	R27,0x57
(0073)     SBRC    R27,0           ; check SPMEN flag
    0042 FDB0      SBRC	R27,0
(0074)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
    0043 CFFC      RJMP	0x0040
(0075)     RET
    0044 9508      RET
FILE: C:\DOCUME~1\zhuji\桌面\AVR_BO~1.2\main.c
(0001) #include <macros.h>
(0002) #include "assembly.h"
(0003)  
(0004) #define  ChipType     Atmega16       
(0005)       
(0006) //*********************************************************
(0007) //选择BOOT区大小  此必须与ICC options中的选项相对应
(0008) //#define  BootSize     'a'    //128   
(0009) //#define  BootSize     'b'    //256
(0010) //#define  BootSize     'c'    //512
(0011) #define    BootSize       'd'    //1024
(0012) //选择BootLoad版本号
(0013) #define  BootVer        'f'    //1.0版本
(0014) 
(0015) //**********************************************************
(0016) 
(0017) #define  Atmega16       0x31
(0018) 
(0019) //*****************************************************************************
(0020) #define  InteClk                 //是否使用内部时钟
(0021) #define  OscAddress     0x1fff   //时钟校准值存储地址
(0022) 
(0023) //*****************************************************************************
(0024) //7.3728M时钟下的波特率为19200的设置,此设置可根据ICC生成,选对芯片,时钟,波特率既可
(0025) //由此语句调用UBRR = BAU;
(0026) #define  BAU  23    // 7.3728M 19200
(0027) //#define  BAU  191 // 7.3728M 2400
(0028) //#define  BAU  95  // 7.3728M 4800
(0029) //#define  BAU  47  // 7.3728M 9600
(0030) //#define  BAU  31  // 7.3728M 14400
(0031) //#define  BAU  23  // 7.3728M 19200
(0032) //#define  BAU  15  // 7.3728M 28800
(0033) 
(0034) //#define  BAU  38  // 12M 19200
(0035) 
(0036) //*****************************************************************************
(0037) 
(0038) #include  <iom16v.h>
(0039) #define   PageByte 	 	 128    
(0040) #define   AddressShift 	 7
(0041) #define	INTVECREG	 	 GICR
(0042) 
(0043) 
(0044) void          FlashLoad        (void);
(0045) void          GetPageNumber    (void);
(0046) void          ExecCode         (void);
(0047) char          GetPage          (void);
(0048) void          WriteFlash       (void);
(0049) char          CheckFlash       (void);
(0050) unsigned char IsChar           (void);
(0051) void          SendChar         (unsigned char c);
(0052) void          delay            (void);                 //1ms延时函数
(0053) unsigned char RecChar          (void);
(0054) 
(0055) unsigned char PageBuffer[PageByte];
(0056) unsigned int  RealPageAddress;
(0057) unsigned int  PageAddress;
(0058) 
(0059) /*****************************************************************************/
(0060) //Flash编程								                     
(0061) /*****************************************************************************/
(0062) void FlashLoad(void)
(0063)   {
(0064)     SendChar('!');
_FlashLoad:
    0045 E201      LDI	R16,0x21
    0046 D0D8      RCALL	_SendChar
    0047 C019      RJMP	0x0061
(0065)     while (1)
(0066)     {
(0067) 	 GetPageNumber();
    0048 D01A      RCALL	_GetPageNumber
(0068) 
(0069) 	 if (RealPageAddress == 0xffff) 
    0049 91800062  LDS	R24,_RealPageAddress
    004B 91900063  LDS	R25,_RealPageAddress+1
    004D 3F8F      CPI	R24,0xFF
    004E EFEF      LDI	R30,0xFF
    004F 079E      CPC	R25,R30
    0050 F409      BNE	0x0052
(0070) 	   return;
    0051 C010      RJMP	0x0062
(0071)         
(0072) 	 if (GetPage())
    0052 D026      RCALL	_GetPage
    0053 2300      TST	R16
    0054 F051      BEQ	0x005F
(0073) 	  {
(0074) 		WriteFlash();
    0055 D05D      RCALL	_WriteFlash
(0075) 	    if (CheckFlash()) 
    0056 D08D      RCALL	_CheckFlash
    0057 2300      TST	R16
    0058 F019      BEQ	0x005C
(0076) 		  SendChar('!');
    0059 E201      LDI	R16,0x21
    005A D0C4      RCALL	_SendChar
    005B C005      RJMP	0x0061
(0077) 	    else 
(0078) 		  SendChar('@');
    005C E400      LDI	R16,0x40
    005D D0C1      RCALL	_SendChar
(0079) 	  }
    005E C002      RJMP	0x0061
(0080) 	 else 
(0081) 	   SendChar('@');
    005F E400      LDI	R16,0x40
    0060 D0BE      RCALL	_SendChar
    0061 CFE6      RJMP	0x0048
(0082)     }
(0083)   }
    0062 9508      RET
_GetPageNumber:
  PageAddressL         --> R20
  PageAddressH         --> R22
    0063 D12F      RCALL	push_gset2
(0084) 
(0085) /*****************************************************************************/
(0086) void GetPageNumber(void)
(0087)   {
(0088)     unsigned char PageAddressH;
(0089)     unsigned char PageAddressL;
(0090) 
(0091)     PageAddressH = RecChar();
    0064 D0B6      RCALL	_RecChar
    0065 2F60      MOV	R22,R16
(0092) 
(0093)     PageAddressL = RecChar();
    0066 D0B4      RCALL	_RecChar
    0067 2F40      MOV	R20,R16
(0094) 
(0095)     RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
    0068 2E36      MOV	R3,R22
    0069 2E24      MOV	R2,R20
    006A 92300063  STS	_RealPageAddress+1,R3
    006C 92200062  STS	_RealPageAddress,R2
(0096) 	PageAddress=RealPageAddress<<AddressShift;
    006E E027      LDI	R18,7
    006F E030      LDI	R19,0
    0070 2D02      MOV	R16,R2
    0071 2D13      MOV	R17,R3
    0072 D126      RCALL	lsl16
    0073 93100061  STS	_PageAddress+1,R17
    0075 93000060  STS	_PageAddress,R16
(0097) #ifdef RAMPZ_FLAG
(0098)     if (PageAddressH) 
(0099) 	   RAMPZ = 1; 
(0100)     else 
(0101) 	   RAMPZ = 0;
(0102) #endif	
(0103)   }
    0077 D100      RCALL	pop_gset2
    0078 9508      RET
_GetPage:
  CheckSum             --> R20
  LocalCheckSum        --> R22
  i                    --> R10
    0079 D11C      RCALL	push_gset3
(0104) 
(0105) /*****************************************************************************/
(0106) char GetPage(void)
(0107)   {
(0108)     unsigned char i;
(0109)     unsigned char LocalCheckSum = 0;
    007A 2766      CLR	R22
(0110)     unsigned char CheckSum = 0;
    007B 2744      CLR	R20
(0111) 
(0112)     for (i=0;i<PageByte/2;i++)
    007C 24AA      CLR	R10
    007D C012      RJMP	0x0090
(0113) 	{
(0114) 	 while(!IsChar());
    007E D096      RCALL	_IsChar
    007F 2300      TST	R16
    0080 F3E9      BEQ	0x007E
(0115) 	 PageBuffer[i]=RecChar();
    0081 D099      RCALL	_RecChar
    0082 E684      LDI	R24,0x64
    0083 E090      LDI	R25,0
    0084 2DEA      MOV	R30,R10
    0085 27FF      CLR	R31
    0086 0FE8      ADD	R30,R24
    0087 1FF9      ADC	R31,R25
    0088 8300      STD	Z+0,R16
(0116) 	 LocalCheckSum ^= PageBuffer[i];
    0089 2DEA      MOV	R30,R10
    008A 27FF      CLR	R31
    008B 0FE8      ADD	R30,R24
    008C 1FF9      ADC	R31,R25
    008D 8020      LDD	R2,Z+0
    008E 2562      EOR	R22,R2
    008F 94A3      INC	R10
    0090 2D8A      MOV	R24,R10
    0091 3480      CPI	R24,0x40
    0092 F358      BCS	0x007E
(0117)    	}
(0118) 	for (i=0;i<PageByte/2;i++)
    0093 24AA      CLR	R10
    0094 C012      RJMP	0x00A7
(0119) 	{
(0120) 	 while(!IsChar());
    0095 D07F      RCALL	_IsChar
    0096 2300      TST	R16
    0097 F3E9      BEQ	0x0095
(0121) 	 PageBuffer[i+PageByte/2]=RecChar();
    0098 D082      RCALL	_RecChar
    0099 EA84      LDI	R24,0xA4
    009A E090      LDI	R25,0
    009B 2DEA      MOV	R30,R10
    009C 27FF      CLR	R31
    009D 0FE8      ADD	R30,R24
    009E 1FF9      ADC	R31,R25
    009F 8300      STD	Z+0,R16
(0122) 	 LocalCheckSum ^= PageBuffer[i+PageByte/2];
    00A0 2DEA      MOV	R30,R10
    00A1 27FF      CLR	R31
    00A2 0FE8      ADD	R30,R24
    00A3 1FF9      ADC	R31,R25
    00A4 8020      LDD	R2,Z+0
    00A5 2562      EOR	R22,R2
    00A6 94A3      INC	R10
    00A7 2D8A      MOV	R24,R10
    00A8 3480      CPI	R24,0x40
    00A9 F358      BCS	0x0095
(0123)    	}	   
(0124)     CheckSum = RecChar(); 
    00AA D070      RCALL	_RecChar
    00AB 2F40      MOV	R20,R16
(0125) 	
(0126)     if (LocalCheckSum == CheckSum) 
    00AC 1760      CP	R22,R16
    00AD F411      BNE	0x00B0
(0127) 	  return 1;
    00AE E001      LDI	R16,1
    00AF C001      RJMP	0x00B1
(0128)     else 
(0129) 	  return 0;

⌨️ 快捷键说明

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