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

📄 self.lst

📁 一个AVR单片机BOOTLOADER的例子
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0E01 E5CF      LDI	R28,0x5F
    0E02 E0D4      LDI	R29,4
    0E03 BFCD      OUT	P3D,R28
    0E04 BFDE      OUT	P3E,R29
    0E05 51C0      SUBI	R28,0x10
    0E06 40D0      SBCI	R29,0
    0E07 EA0A      LDI	R16,0xAA
    0E08 8308      STD	R16,0+Y
    0E09 2400      CLR	R0
    0E0A E6E0      LDI	R30,0x60
    0E0B E0F0      LDI	R31,0
    0E0C E010      LDI	R17,0
    0E0D 36E0      CPI	R30,0x60
    0E0E 07F1      CPC	R31,R17
    0E0F F011      BEQ	0x0E12
    0E10 9201      ST	R0,Z+
    0E11 CFFB      RJMP	0x0E0D
    0E12 8300      STD	R16,0+Z
    0E13 E0E2      LDI	R30,2
    0E14 E1FC      LDI	R31,0x1C
    0E15 E6A0      LDI	R26,0x60
    0E16 E0B0      LDI	R27,0
    0E17 E11C      LDI	R17,0x1C
    0E18 30E2      CPI	R30,2
    0E19 07F1      CPC	R31,R17
    0E1A F021      BEQ	0x0E1F
    0E1B 95C8      LPM
    0E1C 9631      ADIW	R30,1
    0E1D 920D      ST	R0,X+
    0E1E CFF9      RJMP	0x0E18
    0E1F D0FC      RCALL	_main
_exit:
    0E20 CFFF      RJMP	_exit
FILE: C:\mega8\boot\main.c
(0001) /*******************************************/
(0002) /*            广州天河双龙电子公司         */
(0003) /*            http://www.sl.com.cn         */
(0004) /*           BOOT引导IAP应用演示程序       */
(0005) /*             作者:ntzwq@wx88.net         */
(0006) /*                2002年5月11日            */
(0007) /*   目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
(0008) /*******************************************/
(0009) #include "self.h"
(0010) #include "assembly.h"
(0011) #include<iom8v.h>
(0012) #define fosc 8000000 //晶振8MHZ
(0013) #define baud 19200	 //波特率
(0014) extern unsigned char read_flash(unsigned int add);
(0015) /*  		字符输出函数 		 */
(0016) void sendchar(unsigned char c)
(0017) 	{	 
(0018)      while (!(UCSRA&(1<<UDRE)));
_sendchar:
  c                    --> R16
    0E21 9B5D      SBIS	P0B,5
    0E22 CFFE      RJMP	_sendchar
(0019) 	 UDR=c;    
    0E23 B90C      OUT	P0C,R16
(0020) 	}
    0E24 9508      RET
(0021) /*  		字符输入函数 		 */	
(0022) unsigned char recchar(void)
(0023)   	{
(0024) 	 while(!(UCSRA& (1<<RXC)));
_recchar:
    0E25 9B5F      SBIS	P0B,7
    0E26 CFFE      RJMP	_recchar
(0025)      return UDR;
    0E27 B10C      IN	R16,P0C
    0E28 9508      RET
(0026) 	}		
(0027) /*			UART初始化				*/	
(0028) void uart_init(void)
(0029) {
(0030)  OSCCAL=read_flash(0x1f20);//对内部RC OSC调整
_uart_init:
    0E29 E200      LDI	R16,0x20
    0E2A E11F      LDI	R17,0x1F
    0E2B D12C      RCALL	_read_flash
    0E2C BF01      OUT	P31,R16
(0031)  UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
    0E2D E188      LDI	R24,0x18
    0E2E B98A      OUT	P0A,R24
(0032)  UBRRL=(fosc/16/(baud+1))%256;
    0E2F E18A      LDI	R24,0x1A
    0E30 B989      OUT	P09,R24
(0033)  UBRRH=(fosc/16/(baud+1))/256;
    0E31 2422      CLR	R2
    0E32 BC20      OUT	P20,R2
(0034)  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    0E33 E886      LDI	R24,0x86
    0E34 BD80      OUT	P20,R24
(0035) }
    0E35 9508      RET
_iap:
  intval               --> R10
  data                 --> R14
  ldata                --> R12
  address              --> R22
  val                  --> R20
    0E36 D146      RCALL	push_gset5
(0036) void iap(void)
(0037) {
(0038)     unsigned int intval,address,data;
(0039)     unsigned char val, ldata;
(0040)      for(;;)                           
(0041)       {
(0042)        val=recchar();         
    0E37 DFED      RCALL	_recchar
    0E38 2F40      MOV	R20,R16
(0043)        if(val=='a')                    //Autoincrement?
    0E39 3601      CPI	R16,0x61
    0E3A F419      BNE	0x0E3E
(0044)           { 
(0045) 		   sendchar('Y');				    //Autoincrement is quicker
    0E3B E509      LDI	R16,0x59
    0E3C DFE4      RCALL	_sendchar
(0046) 		  }
    0E3D CFF9      RJMP	0x0E37
(0047)        else if(val=='A')                   //write address 
    0E3E 3441      CPI	R20,0x41
    0E3F F461      BNE	0x0E4C
(0048)           {
(0049)            address=recchar();                //read address 8 MSB
    0E40 DFE4      RCALL	_recchar
    0E41 2F60      MOV	R22,R16
    0E42 2777      CLR	R23
(0050)            address=(address<<8)|recchar();
    0E43 DFE1      RCALL	_recchar
    0E44 2E36      MOV	R3,R22
    0E45 2E20      MOV	R2,R16
    0E46 01B1      MOVW	R22,R2
(0051)            address=address<<1;               //convert from word address to byte address
    0E47 0F66      LSL	R22
    0E48 1F77      ROL	R23
(0052)            sendchar('\r');
    0E49 E00D      LDI	R16,0xD
    0E4A DFD6      RCALL	_sendchar
(0053)           }
    0E4B CFEB      RJMP	0x0E37
(0054)         else if(val=='c')                   //Write program memory, low byte
    0E4C 3643      CPI	R20,0x63
    0E4D F429      BNE	0x0E53
(0055)           {       
(0056)            ldata=recchar();
    0E4E DFD6      RCALL	_recchar
    0E4F 2EC0      MOV	R12,R16
(0057)            sendchar('\r');
    0E50 E00D      LDI	R16,0xD
    0E51 DFCF      RCALL	_sendchar
(0058)           }
    0E52 CFE4      RJMP	0x0E37
(0059)         else if(val== 'C')                  //Write program memory, high byte 
    0E53 3443      CPI	R20,0x43
    0E54 F489      BNE	0x0E66
(0060)           {
(0061)            data=ldata|(recchar()<<8);
    0E55 DFCF      RCALL	_recchar
    0E56 2E20      MOV	R2,R16
    0E57 2433      CLR	R3
    0E58 2C32      MOV	R3,R2
    0E59 2422      CLR	R2
    0E5A 2CEC      MOV	R14,R12
    0E5B 24FF      CLR	R15
    0E5C 28E2      OR	R14,R2
    0E5D 28F3      OR	R15,R3
(0062)            fill_temp_buffer(data,(address)); //call asm routine. 
    0E5E 019B      MOVW	R18,R22
    0E5F 0187      MOVW	R16,R14
    0E60 D0D6      RCALL	_fill_temp_buffer
(0063)            address+=2;  
    0E61 5F6E      SUBI	R22,0xFE
    0E62 4F7F      SBCI	R23,0xFF
(0064)            sendchar('\r');
    0E63 E00D      LDI	R16,0xD
    0E64 DFBC      RCALL	_sendchar
(0065)           }        
    0E65 CFD1      RJMP	0x0E37
(0066)          else if(val=='e')                   //Chip erase 
    0E66 3645      CPI	R20,0x65
    0E67 F479      BNE	0x0E77
(0067)           {
(0068)            for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
    0E68 2766      CLR	R22
    0E69 2777      CLR	R23
    0E6A C005      RJMP	0x0E70
(0069)              {
(0070)               write_page(address,0x03);       //Perform page erase
    0E6B E023      LDI	R18,3
    0E6C 018B      MOVW	R16,R22
    0E6D D0BF      RCALL	_write_page
    0E6E 5C60      SUBI	R22,0xC0
    0E6F 4F7F      SBCI	R23,0xFF
    0E70 3060      CPI	R22,0
    0E71 E1EC      LDI	R30,0x1C
    0E72 077E      CPC	R23,R30
    0E73 F3B8      BCS	0x0E6B
(0071)              }
(0072)            sendchar('\r');        
    0E74 E00D      LDI	R16,0xD
    0E75 DFAB      RCALL	_sendchar
(0073)           }
    0E76 CFC0      RJMP	0x0E37
(0074)          else if(val=='l')                   // write lockbits 
    0E77 364C      CPI	R20,0x6C
    0E78 F429      BNE	0x0E7E
(0075)           {
(0076)            write_lock_bits(recchar());
    0E79 DFAB      RCALL	_recchar
    0E7A D0D3      RCALL	_write_lock_bits
(0077)            sendchar('\r');
    0E7B E00D      LDI	R16,0xD
    0E7C DFA4      RCALL	_sendchar
(0078)           }       
    0E7D CFB9      RJMP	0x0E37
(0079)          else if(val== 'm')                  // write page
    0E7E 364D      CPI	R20,0x6D
    0E7F F431      BNE	0x0E86
(0080)           {
(0081)            write_page((address),0x05);       
    0E80 E025      LDI	R18,5
    0E81 018B      MOVW	R16,R22
    0E82 D0AA      RCALL	_write_page
(0082)            sendchar('\r');
    0E83 E00D      LDI	R16,0xD
    0E84 DF9C      RCALL	_sendchar
(0083)           }        
    0E85 CFB1      RJMP	0x0E37
(0084)          else if((val=='P')||(val=='L'))     // Enter programming mode 
    0E86 3540      CPI	R20,0x50
    0E87 F011      BEQ	0x0E8A
    0E88 344C      CPI	R20,0x4C
    0E89 F419      BNE	0x0E8D
(0085)           {
(0086)            sendchar('\r');
    0E8A E00D      LDI	R16,0xD
    0E8B DF95      RCALL	_sendchar
(0087)           }
    0E8C CFAA      RJMP	0x0E37
(0088)          else if (val=='p')
    0E8D 3740      CPI	R20,0x70
    0E8E F419      BNE	0x0E92
(0089)           {
(0090)            sendchar('S');
    0E8F E503      LDI	R16,0x53
    0E90 DF90      RCALL	_sendchar
(0091)           }              
    0E91 CFA5      RJMP	0x0E37
(0092)          else if(val=='R')                   //Read program memory 
    0E92 3542      CPI	R20,0x52
    0E93 F4B9      BNE	0x0EAB
(0093)           {
(0094) 		   if (address>=APP_END)
    0E94 3060      CPI	R22,0
    0E95 E1EC      LDI	R30,0x1C
    0E96 077E      CPC	R23,R30
    0E97 F038      BCS	0x0E9F
(0095) 		     {
(0096) 			  sendchar(0xff);
    0E98 EF0F      LDI	R16,0xFF
    0E99 DF87      RCALL	_sendchar
(0097) 			  sendchar(0xff);
    0E9A EF0F      LDI	R16,0xFF
    0E9B DF85      RCALL	_sendchar
(0098) 			  address+=2;
    0E9C 5F6E      SUBI	R22,0xFE
    0E9D 4F7F      SBCI	R23,0xFF
(0099) 			 }
    0E9E CF98      RJMP	0x0E37
(0100) 		   else
(0101) 		     {           
(0102)               intval=read_program_memory(address,0x00);
    0E9F 2722      CLR	R18
    0EA0 018B      MOVW	R16,R22
    0EA1 D09D      RCALL	_read_program_memory
    0EA2 0158      MOVW	R10,R16
(0103)               sendchar((char)(intval>>8));      //send MSB  
    0EA3 2F01      MOV	R16,R17
    0EA4 2711      CLR	R17
    0EA5 DF7B      RCALL	_sendchar
(0104)               sendchar((char)intval);           //send LSB
    0EA6 2D0A      MOV	R16,R10
    0EA7 DF79      RCALL	_sendchar
(0105)               address+=2;
    0EA8 5F6E      SUBI	R22,0xFE
    0EA9 4F7F      SBCI	R23,0xFF
(0106) 		     }  
(0107)           }        
    0EAA CF8C      RJMP	0x0E37
(0108)          else if (val == 'D')
    0EAB 3444      CPI	R20,0x44
    0EAC F481      BNE	0x0EBD
(0109)           {
(0110)            EEARL = address;
    0EAD BB6E      OUT	P1E,R22
(0111)            EEARH = (address >> 8);
    0EAE 011B      MOVW	R2,R22
    0EAF 2C23      MOV	R2,R3
    0EB0 2433      CLR	R3
    0EB1 BA2F      OUT	P1F,R2
(0112)            address++;
    0EB2 5F6F      SUBI	R22,0xFF
    0EB3 4F7F      SBCI	R23,0xFF
(0113)            EEDR = recchar();
    0EB4 DF70      RCALL	_recchar
    0EB5 BB0D      OUT	P1D,R16
(0114)            EECR |= (1<<EEMWE);
    0EB6 9AE2      SBI	P1C,2
(0115)            EECR |= (1<<EEWE);
    0EB7 9AE1      SBI	P1C,1
(0116)            while (EECR & (1<<EEWE))
    0EB8 99E1      SBIC	P1C,1
    0EB9 CFFE      RJMP	0x0EB8
(0117)               ;
(0118)            sendchar('\r');
    0EBA E00D      LDI	R16,0xD
    0EBB DF65      RCALL	_sendchar
(0119)            }
    0EBC CF7A      RJMP	0x0E37
(0120)           else if (val == 'd')
    0EBD 3644      CPI	R20,0x64
    0EBE F459      BNE	0x0ECA
(0121)            {
(0122)             EEARL = address;
    0EBF BB6E      OUT	P1E,R22
(0123)             EEARH = (address >> 8);
    0EC0 011B      MOVW	R2,R22
    0EC1 2C23      MOV	R2,R3
    0EC2 2433      CLR	R3
    0EC3 BA2F      OUT	P1F,R2
(0124)             address++;
    0EC4 5F6F      SUBI	R22,0xFF
    0EC5 4F7F      SBCI	R23,0xFF
(0125)             EECR |= (1<<EERE);
    0EC6 9AE0      SBI	P1C,0
(0126)             sendchar(EEDR);
    0EC7 B30D      IN	R16,P1D
    0EC8 DF58      RCALL	_sendchar
(0127)            }       

⌨️ 快捷键说明

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