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

📄 hhh.lst

📁 avr bootloader 上位机源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
    FD27 2DEA      MOV	R30,R10
    FD28 27FF      CLR	R31
    FD29 0FE8      ADD	R30,R24
    FD2A 1FF9      ADC	R31,R25
    FD2B 8020      LDD	R2,Z+0
    FD2C 2433      CLR	R3
    FD2D 2C32      MOV	R3,R2
    FD2E 2422      CLR	R2
    FD2F E084      LDI	R24,4
    FD30 E091      LDI	R25,1
    FD31 2DEA      MOV	R30,R10
    FD32 27FF      CLR	R31
    FD33 0FE8      ADD	R30,R24
    FD34 1FF9      ADC	R31,R25
    FD35 8140      LDD	R20,Z+0
    FD36 2755      CLR	R21
    FD37 0D42      ADD	R20,R2
    FD38 1D53      ADC	R21,R3
(0221) 	   if (TempInt != TempInt2)
    FD39 1704      CP	R16,R20
    FD3A 0715      CPC	R17,R21
    FD3B F011      BEQ	0xFD3E
(0222) 	     return 0;
    FD3C 2700      CLR	R16
    FD3D C007      RJMP	0xFD45
    FD3E 2D8A      MOV	R24,R10
    FD3F 5F8E      SUBI	R24,0xFE
    FD40 2EA8      MOV	R10,R24
    FD41 2D8A      MOV	R24,R10
    FD42 3080      CPI	R24,0
    FD43 F2AC      BLT	0xFD19
(0223)       } 
(0224)     return 1;
    FD44 E001      LDI	R16,1
    FD45 940EFDE4  CALL	pop_gset3
    FD47 9508      RET
(0225)   }
(0226) /*****************************************************************************/
(0227) /* Serial Port Code										                     */
(0228) /*****************************************************************************/
(0229) unsigned char IsChar(void)
(0230) {
(0231) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)
(0232)    if(UCSRA & 0x80)
(0233) #endif
(0234) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0235)    if(UCSR1A & 0x80)
_IsChar:
    FD48 9020009B  LDS	R2,0x9B
    FD4A FE27      SBRS	R2,7
    FD4B C002      RJMP	0xFD4E
(0236) #endif    
(0237)      return 1;
    FD4C E001      LDI	R16,1
    FD4D C001      RJMP	0xFD4F
(0238)    else 
(0239)      return 0;	 
    FD4E 2700      CLR	R16
    FD4F 9508      RET
(0240) }
(0241) /*****************************************************************************/
(0242) /*  		字符输入函数 		 */	
(0243) unsigned char RecChar(void)
(0244)   {
(0245) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)  
(0246)      while(!(UCSRA & 0x80));
(0247)      return UDR;
(0248) #endif
(0249) #if (ChipType == Atmega64)||(ChipType == Atmega128)	
(0250)      while(!(UCSR1A & 0x80));
_RecChar:
    FD50 9020009B  LDS	R2,0x9B
    FD52 FE27      SBRS	R2,7
    FD53 CFFC      RJMP	_RecChar
(0251)      return UDR1;
    FD54 9100009C  LDS	R16,0x9C
    FD56 9508      RET
(0252) #endif 
(0253)   }		
(0254) /*****************************************************************************/
(0255) void SendChar(unsigned char c)
(0256)   {
(0257) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)  	 
(0258)     while (!(UCSRA&(1<<UDRE)));
(0259)     UDR=c;
(0260) #endif
(0261) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0262)     while (!(UCSR1A&(1<<UDRE1)));
_SendChar:
  c                    --> R16
    FD57 9020009B  LDS	R2,0x9B
    FD59 FE25      SBRS	R2,5
    FD5A CFFC      RJMP	_SendChar
(0263)     UDR1=c;
    FD5B 9300009C  STS	0x9C,R16
(0264) #endif	
(0265)   }
    FD5D 9508      RET
(0266) void delay(void)  
(0267)   {
(0268)     unsigned int i;
(0269)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
    FD5E 2700      CLR	R16
    FD5F 2711      CLR	R17
    FD60 C002      RJMP	0xFD63
    FD61 5F0F      SUBI	R16,0xFF
    FD62 4F1F      SBCI	R17,0xFF
    FD63 3F0A      CPI	R16,0xFA
    FD64 EFEF      LDI	R30,0xFF
    FD65 071E      CPC	R17,R30
    FD66 F3D0      BCS	0xFD61
(0270)   }
    FD67 9508      RET
(0271) 
(0272) /*****************************************************************************/
(0273) void ExecCode(void)
(0274)   {
(0275) #ifdef RAMPZ_FLAG 
(0276)     RAMPZ = 0;
_ExecCode:
    FD68 2422      CLR	R2
    FD69 BE2B      OUT	0x3B,R2
(0277) #endif
(0278)     INTVECREG=0x01;           //中断向量表移位允许
    FD6A E081      LDI	R24,1
    FD6B BF85      OUT	0x35,R24
(0279)     INTVECREG=0x00;           //中断向量指向应用程序区
    FD6C BE25      OUT	0x35,R2
(0280)     asm("jmp 0x0000");              
    FD6D 940C0000  JMP	0x0
(0281)   }
    FD6F 9508      RET
(0282) 		
(0283) void main(void)
(0284)   {
(0285)     unsigned char BootFlag;
(0286)     
(0287) #ifdef InteClk                //如果使用内部时钟,读取时钟校准值
(0288)        OSCCAL=read_flash(OscAddress);
_main:
  BootFlag             --> R20
    FD70 EF0F      LDI	R16,0xFF
    FD71 E11F      LDI	R17,0x1F
    FD72 940EFDCB  CALL	_read_flash
    FD74 9300006F  STS	0x6F,R16
(0289) #endif
(0290) 
(0291) #if (ChipType == Atmega8)||(ChipType == Atmega16)||(ChipType == Atmega32)    
(0292)     UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
(0293)     UCSRB = (1<<RXEN)|(1<<TXEN);       //允许串口发送和接收
(0294)     UBRR = BAU;
(0295) #endif	
(0296) 
(0297) #if (ChipType == Atmega64)||(ChipType == Atmega128)
(0298) //------------------使用串口1为Boot口-----------------    
(0299)     //UCSR1C=(1<<URSEL1)|(1<<UCSZ11)|(1<<UCSZ10); //8位数据+1位停止
(0300) 	UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//|(1<<USBS1);
    FD76 E086      LDI	R24,6
    FD77 9380009D  STS	0x9D,R24
(0301)     UCSR1B = (1<<RXEN1)|(1<<TXEN1);       //允许串口发送和接收
    FD79 E188      LDI	R24,0x18
    FD7A 9380009A  STS	0x9A,R24
(0302) 	UBRR1L=((fosc/16/baud1)-1)%256;
    FD7C E08C      LDI	R24,0xC
    FD7D 93800099  STS	0x99,R24
(0303)     UBRR1H=((fosc/16/baud1)-1)/256;
    FD7F 2422      CLR	R2
    FD80 92200098  STS	0x98,R2
(0304) #endif   
(0305)     SendChar('>');              //通知PC机,BOOT下载准备就绪
    FD82 E30E      LDI	R16,0x3E
    FD83 DFD3      RCALL	_SendChar
(0306)     delay();                    //延时等待PC机响应
    FD84 DFD9      RCALL	_delay
(0307) 	delay();
    FD85 DFD8      RCALL	_delay
(0308) 	delay();
    FD86 DFD7      RCALL	_delay
(0309) 	delay();
    FD87 DFD6      RCALL	_delay
(0310) 	delay();
    FD88 DFD5      RCALL	_delay
(0311) 	delay();
    FD89 DFD4      RCALL	_delay
(0312) 	delay();
    FD8A DFD3      RCALL	_delay
(0313) 	delay();
    FD8B DFD2      RCALL	_delay
(0314)     BootFlag=UDR1;
    FD8C 9140009C  LDS	R20,0x9C
(0315)     if (BootFlag == '<') 
    FD8E 334C      CPI	R20,0x3C
    FD8F F531      BNE	0xFDB6
(0316)       {
(0317) 	   SendChar(ChipType);
    FD90 E304      LDI	R16,0x34
    FD91 DFC5      RCALL	_SendChar
(0318) 	   while (RecChar()!='N');
    FD92 DFBD      RCALL	_RecChar
    FD93 340E      CPI	R16,0x4E
    FD94 F7E9      BNE	0xFD92
(0319)          SendChar(BootSize);
    FD95 E604      LDI	R16,0x64
    FD96 DFC0      RCALL	_SendChar
(0320) 	   while (RecChar()!='N');	 
    FD97 DFB8      RCALL	_RecChar
    FD98 340E      CPI	R16,0x4E
    FD99 F7E9      BNE	0xFD97
(0321)          SendChar(BootVer);
    FD9A E606      LDI	R16,0x66
    FD9B DFBB      RCALL	_SendChar
    FD9C C018      RJMP	0xFDB5
(0322)        while (1)
(0323) 	   {
(0324) 	     switch (RecChar())
    FD9D DFB2      RCALL	_RecChar
    FD9E 2F40      MOV	R20,R16
    FD9F 2755      CLR	R21
    FDA0 3445      CPI	R20,0x45
    FDA1 E0E0      LDI	R30,0
    FDA2 075E      CPC	R21,R30
    FDA3 F059      BEQ	0xFDAF
    FDA4 3445      CPI	R20,0x45
    FDA5 E0E0      LDI	R30,0
    FDA6 075E      CPC	R21,R30
    FDA7 F06C      BLT	0xFDB5
    FDA8 3547      CPI	R20,0x57
    FDA9 E0E0      LDI	R30,0
    FDAA 075E      CPC	R21,R30
    FDAB F009      BEQ	0xFDAD
    FDAC C008      RJMP	0xFDB5
(0325) 	       {
(0326) 	         case 'W': FlashLoad(); break;
    FDAD DEBE      RCALL	_FlashLoad
    FDAE C006      RJMP	0xFDB5
(0327) 	         case 'E': { 
(0328) 	         	     SendChar('E');  //通知PC机,进入运用程序区
    FDAF E405      LDI	R16,0x45
    FDB0 DFA6      RCALL	_SendChar
(0329) 					 while (RecChar()!='N');
    FDB1 DF9E      RCALL	_RecChar
    FDB2 340E      CPI	R16,0x4E
    FDB3 F7E9      BNE	0xFDB1
(0330) 	         	     ExecCode();  
    FDB4 DFB3      RCALL	_ExecCode
    FDB5 CFE7      RJMP	0xFD9D
(0331) 	         	   } break;
(0332) 	         default : break;
(0333) 	       }
(0334) 	   }
(0335)       }
(0336)     SendChar('E');  //通知PC机,进入运用程序区
    FDB6 E405      LDI	R16,0x45
    FDB7 DF9F      RCALL	_SendChar
(0337) 	//while (RecChar()!='N');
(0338)     delay();
    FDB8 DFA5      RCALL	_delay
(0339) 	delay();
    FDB9 DFA4      RCALL	_delay
(0340) 	delay();
    FDBA DFA3      RCALL	_delay
(0341) 	delay();
    FDBB DFA2      RCALL	_delay
(0342)     ExecCode();
(0343)   }
    FDBC CFAB      RJMP	_ExecCode
FILE: E:\icc\peterf\BootLoad\assembly.s
(0001) 		.text
(0002) ;*********************************************************
(0003) ; Place a 1 for the processor you want use
(0004) ;*********************************************************
(0005) 
(0006) MEGATYPE8   =  0
(0007) MEGATYPE16  =  0
(0008) MEGATYPE32  =  0
(0009) MEGATYPE64  =  0
(0010) MEGATYPE128 =  1
(0011) MEGATYPE162 =  0
(0012) MEGATYPE169 =  0
(0013) MEGATYPE8515 = 0
(0014) MEGATYPE8535 = 0
(0015) MEGATYPE2313 = 0
(0016) 
(0017) ;*********************************************************
(0018) ;*********************************************************
(0019) ;*********************************************************
(0020) ;*********************************************************
(0021) ; DO NOT CHANGE ANYTHING BELOW THIS LINE !!!!!!!
(0022) ;*********************************************************
(0023) ;*********************************************************
(0024) ;*********************************************************
(0025) ;*********************************************************
(0026) 
(0027) .if MEGATYPE64 | MEGATYPE128
(0028)     SPMCR = 0x68     ;RWW区忙标志,读RWW区允许,允许写程序存储区
(0029) .else
(0030)     SPMCR = 0x57
(0031) .endif
(0032) 
(0033) ;-----------------------------------------  
(0034) 
(0035) ; void write_page (unsigned int adr, unsigned char function);
(0036) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0037) _write_page::
(0038)     XCALL __WAIT_SPMEN__
_write_page:
    FDBD D01F      RCALL	0xFDDD
(0039)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    FDBE 01F8      MOVW	R30,R16
(0040)     STS     SPMCR, R18      ;argument 2 decides function
    FDBF 93200068  STS	0x68,R18
(0041)     SPM                     ;perform pagewrite
    FDC1 95E8      SPM
(0042)     RET
    FDC2 9508      RET
(0043) 
(0044) ;-----------------------------------------
(0045) 
(0046) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0047) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0048) _fill_temp_buffer::
(0049)     XCALL __WAIT_SPMEN__
_fill_temp_buffer:
    FDC3 D019      RCALL	0xFDDD
(0050)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    FDC4 01F9      MOVW	R30,R18
(0051)     movw    r0, r16         ;move data to reg 0 and 1
    FDC5 0108      MOVW	R0,R16
(0052)     LDI     R19, 0x01
    FDC6 E031      LDI	R19,1
(0053)     STS     SPMCR, R19
    FDC7 93300068  STS	0x68,R19
(0054)     SPM                     ;Store program memory
    FDC9 95E8      SPM
(0055)     RET      
    FDCA 9508      RET
(0056) 	
(0057) ;-----------------------------------------	
(0058) 
(0059) ;unsigned char read_flash(unsigned int add);
(0060) _read_flash::
(0061)     mov r31,r17
_read_flash:
    FDCB 2FF1      MOV	R31,R17
(0062)     mov r30,r16
    FDCC 2FE0      MOV	R30,R16
(0063)     lpm r16,z
    FDCD 9104      LPM	R16,0(Z)
(0064)     clr r17
    FDCE 2711      CLR	R17
(0065)     ret	
    FDCF 9508      RET
(0066) 		
(0067) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0068) _read_program_memory::
(0069)     movw    r30, r16        ;move adress to z pointer
_read_program_memory:
    FDD0 01F8      MOVW	R30,R16
(0070)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    FDD1 FD20      SBRC	R18,0
(0071)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    FDD2 93200068  STS	0x68,R18
(0072)     LPM     r16, Z+
    FDD4 9105      LPM	R16,Z+
(0073)     LPM     r17, Z
    FDD5 9114      LPM	R17,0(Z)
(0074)     RET
    FDD6 9508      RET
(0075) 	
(0076) ;-----------------------------------------
(0077)         
(0078) _enableRWW::
(0079) 	XCALL __WAIT_SPMEN__
_enableRWW:
    FDD7 D005      RCALL	0xFDDD
(0080)     LDI R27,0x11
    FDD8 E1B1      LDI	R27,0x11
(0081)     STS SPMCR,R27
    FDD9 93B00068  STS	0x68,R27
(0082)     SPM
    FDDB 95E8      SPM
(0083)     RET   
    FDDC 9508      RET
(0084) 	
(0085) ;-----------------------------------------           
(0086) 
(0087) __WAIT_SPMEN__:
(0088)     LDS     R27,SPMCR       ; load SPMCR to R27
    FDDD 91B00068  LDS	R27,0x68
(0089)     SBRC    R27,0           ; check SPMEN flag
    FDDF FDB0      SBRC	R27,0
(0090)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
    FDE0 CFFC      RJMP	0xFDDD
(0091)     RET
FILE: <library>
    FDE1 9508      RET
pop_gset2:
    FDE2 E0E2      LDI	R30,2
    FDE3 C006      RJMP	pop
pop_gset3:
    FDE4 E0E4      LDI	R30,4
    FDE5 C004      RJMP	pop
push_gset1:
    FDE6 935A      ST	R21,-Y
    FDE7 934A      ST	R20,-Y
    FDE8 9508      RET
pop_gset1:
    FDE9 E0E1      LDI	R30,1
pop:
    FDEA 9149      LD	R20,Y+
    FDEB 9159      LD	R21,Y+
    FDEC FDE0      SBRC	R30,0
    FDED 9508      RET
    FDEE 9169      LD	R22,Y+
    FDEF 9179      LD	R23,Y+
    FDF0 FDE1      SBRC	R30,1
    FDF1 9508      RET
    FDF2 90A9      LD	R10,Y+
    FDF3 90B9      LD	R11,Y+
    FDF4 FDE2      SBRC	R30,2
    FDF5 9508      RET
    FDF6 90C9      LD	R12,Y+
    FDF7 90D9      LD	R13,Y+
    FDF8 FDE3      SBRC	R30,3
    FDF9 9508      RET
    FDFA 90E9      LD	R14,Y+
    FDFB 90F9      LD	R15,Y+
    FDFC 9508      RET
push_gset2:
    FDFD 937A      ST	R23,-Y
    FDFE 936A      ST	R22,-Y
    FDFF CFE6      RJMP	push_gset1
push_gset3:
    FE00 92BA      ST	R11,-Y
    FE01 92AA      ST	R10,-Y
    FE02 CFFA      RJMP	push_gset2

⌨️ 快捷键说明

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