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

📄 avrbootloader.lst

📁 BootLoad_Pei&Ecirc &Ccedil ICC&micro &Auml &Ocirc &acute &acute ú&Acirc &euml &pound &not MegaLoad
💻 LST
📖 第 1 页 / 共 2 页
字号:
    0ED6 E682      LDI	R24,0x62
    0ED7 E090      LDI	R25,0
    0ED8 2DEA      MOV	R30,R10
    0ED9 27FF      CLR	R31
    0EDA 0FE8      ADD	R30,R24
    0EDB 1FF9      ADC	R31,R25
    0EDC 8140      LDD	R20,Z+0
    0EDD 2755      CLR	R21
    0EDE 0D42      ADD	R20,R2
    0EDF 1D53      ADC	R21,R3
(0186) 	if (TempInt != TempInt2) return 0;
    0EE0 1704      CP	R16,R20
    0EE1 0715      CPC	R17,R21
    0EE2 F011      BEQ	0x0EE5
    0EE3 2700      CLR	R16
    0EE4 C007      RJMP	0x0EEC
    0EE5 2D8A      MOV	R24,R10
    0EE6 5F8E      SUBI	R24,0xFE
    0EE7 2EA8      MOV	R10,R24
    0EE8 2D8A      MOV	R24,R10
    0EE9 3480      CPI	R24,0x40
    0EEA F2B0      BCS	0x0EC1
(0187)       }
(0188)     return 1;
    0EEB E001      LDI	R16,1
    0EEC D090      RCALL	pop_gset3
    0EED 9508      RET
(0189)   }
(0190) 
(0191) /*****************************************************************************/
(0192) /*  		字符输入函数 		 */	
(0193) unsigned char RecChar(void)
(0194)   {
(0195)      while(!(UCSRA & 0x80));
_RecChar:
    0EEE 9B5F      SBIS	0x0B,7
    0EEF CFFE      RJMP	_RecChar
(0196)      return UDR;
    0EF0 B10C      IN	R16,0x0C
    0EF1 9508      RET
(0197)   }		
(0198) /*****************************************************************************/
(0199) void SendChar(unsigned char c)
(0200)   {	 
(0201)     while (!(UCSRA&(1<<UDRE)));
_SendChar:
  c                    --> R16
    0EF2 9B5D      SBIS	0x0B,5
    0EF3 CFFE      RJMP	_SendChar
(0202)     UDR=c;
    0EF4 B90C      OUT	0x0C,R16
    0EF5 9508      RET
(0203)   }
(0204) void delay(void)  
(0205)   {
(0206)     unsigned int i;
(0207)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
    0EF6 2700      CLR	R16
    0EF7 2711      CLR	R17
    0EF8 C002      RJMP	0x0EFB
    0EF9 5F0F      SUBI	R16,0xFF
    0EFA 4F1F      SBCI	R17,0xFF
    0EFB 3F0A      CPI	R16,0xFA
    0EFC EFEF      LDI	R30,0xFF
    0EFD 071E      CPC	R17,R30
    0EFE F3D0      BCS	0x0EF9
    0EFF 9508      RET
(0208)   }
(0209) 
(0210) /*****************************************************************************/
(0211) void ExecCode(void)
(0212)   {
(0213)     GICR=0X01;           //中断向量表移位允许
_ExecCode:
    0F00 E081      LDI	R24,1
    0F01 BF8B      OUT	0x3B,R24
(0214)     GICR=0X00;           //中断向量指向应用程序区
    0F02 2422      CLR	R2
    0F03 BE2B      OUT	0x3B,R2
(0215)     asm("jmp 0x0000");              
    0F04 940C0000  JMP	0x0
    0F06 9508      RET
(0216)   }
(0217) 		
(0218) void main(void)
(0219)   {
(0220)     unsigned char BootFlag;
(0221)     unsigned int TempInt;
(0222) 	char iTry;
(0223) 	
(0224)     #ifdef InteClk                //如果使用内部时钟,读取时钟校准值
(0225)        OSCCAL=read_flash(OscAddress);
(0226)     #endif
(0227) 
(0228) #ifdef W0	
(0229)  //pei 拷贝W0的PortInit
(0230)  	PORTB = 0x0F;//rfslp,fs123=1
_main:
  iTry                 --> R20
  TempInt              --> R10
  BootFlag             --> R22
    0F07 E08F      LDI	R24,0xF
    0F08 BB88      OUT	0x18,R24
(0231)  	DDRB  = 0xFF;//bit1=output
    0F09 EF8F      LDI	R24,0xFF
    0F0A BB87      OUT	0x17,R24
(0232)  	PORTC = 0x21;//0x20;//rfrst=1,not reset! 
    0F0B E281      LDI	R24,0x21
    0F0C BB85      OUT	0x15,R24
(0233)  	DDRC  = 0x7F;
    0F0D E78F      LDI	R24,0x7F
    0F0E BB84      OUT	0x14,R24
(0234)  	PORTD = 0x0C;
    0F0F E08C      LDI	R24,0xC
    0F10 BB82      OUT	0x12,R24
(0235)  	DDRD  = 0xF0;
    0F11 EF80      LDI	R24,0xF0
    0F12 BB81      OUT	0x11,R24
(0236) #else
(0237) #endif
(0238)     
(0239)     UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
    0F13 E886      LDI	R24,0x86
    0F14 BD80      OUT	0x20,R24
(0240)     UCSRB = (1<<RXEN)|(1<<TXEN);       //允许串口发送和接收
    0F15 E188      LDI	R24,0x18
    0F16 B98A      OUT	0x0A,R24
(0241)     UBRR = BAU;
    0F17 E283      LDI	R24,0x23
    0F18 B989      OUT	0x09,R24
(0242) 
(0243) 	iTry=20;
    0F19 E144      LDI	R20,0x14
(0244) STARTBOOT://pei未下载程序时重复等待
(0245) #ifdef W0	
(0246)     PORTC=PORTC^0x03;//指示灯闪烁
    0F1A E083      LDI	R24,3
    0F1B B225      IN	R2,0x15
    0F1C 2628      EOR	R2,R24
    0F1D BA25      OUT	0x15,R2
(0247) #endif
(0248) 	
(0249)     SendChar('>');              //通知PC机,BOOT下载准备就绪
    0F1E E30E      LDI	R16,0x3E
    0F1F DFD2      RCALL	_SendChar
(0250)     delay();                    //延时等待PC机响应
    0F20 DFD5      RCALL	_delay
(0251)     BootFlag=UDR;
    0F21 B16C      IN	R22,0x0C
(0252)     if (BootFlag == '<') 
    0F22 336C      CPI	R22,0x3C
    0F23 F4F9      BNE	0x0F43
(0253)       {
(0254) 	     SendChar(ChipType);   //芯片版本信息
    0F24 E300      LDI	R16,0x30
    0F25 DFCC      RCALL	_SendChar
(0255)          SendChar(BootSize);
    0F26 E603      LDI	R16,0x63
    0F27 DFCA      RCALL	_SendChar
(0256)          SendChar(BootVer);
    0F28 E607      LDI	R16,0x67
    0F29 DFC8      RCALL	_SendChar
    0F2A C017      RJMP	0x0F42
(0257)          while (1)
(0258) 	   {
(0259) 	     switch (RecChar())
    0F2B DFC2      RCALL	_RecChar
    0F2C 2EC0      MOV	R12,R16
    0F2D 24DD      CLR	R13
    0F2E 01C6      MOVW	R24,R12
    0F2F 3485      CPI	R24,0x45
    0F30 E0E0      LDI	R30,0
    0F31 079E      CPC	R25,R30
    0F32 F061      BEQ	0x0F3F
    0F33 3485      CPI	R24,0x45
    0F34 E0E0      LDI	R30,0
    0F35 079E      CPC	R25,R30
    0F36 F05C      BLT	0x0F42
    0F37 01C6      MOVW	R24,R12
    0F38 3587      CPI	R24,0x57
    0F39 E0E0      LDI	R30,0
    0F3A 079E      CPC	R25,R30
    0F3B F009      BEQ	0x0F3D
    0F3C C005      RJMP	0x0F42
(0260) 	       {
(0261) 	         case 'W': FlashLoad();
    0F3D DEF9      RCALL	_FlashLoad
(0262) 			 	   break;
    0F3E C003      RJMP	0x0F42
(0263) 	         case 'E': { 
(0264) 	         	     SendChar('E');  //通知PC机,进入运用程序区
    0F3F E405      LDI	R16,0x45
    0F40 DFB1      RCALL	_SendChar
(0265) 	         	     ExecCode();  
    0F41 DFBE      RCALL	_ExecCode
    0F42 CFE8      RJMP	0x0F2B
(0266) 	         	   } break;
(0267) 	         default : break;
(0268) 	       }
(0269) 	   }
(0270)       }
(0271)     SendChar('E');  
    0F43 E405      LDI	R16,0x45
    0F44 DFAD      RCALL	_SendChar
(0272) 	
(0273) 	TempInt = read_program_memory(0,0);//pei
    0F45 2722      CLR	R18
    0F46 2700      CLR	R16
    0F47 2711      CLR	R17
    0F48 D020      RCALL	_read_program_memory
    0F49 0158      MOVW	R10,R16
(0274) 	if (TempInt==0xFFFF) goto STARTBOOT;
    0F4A 3F0F      CPI	R16,0xFF
    0F4B EFEF      LDI	R30,0xFF
    0F4C 071E      CPC	R17,R30
    0F4D F409      BNE	0x0F4F
    0F4E CFCB      RJMP	0x0F1A
(0275) 	  else{ iTry--;
    0F4F 954A      DEC	R20
(0276) 	        if (iTry>0) goto STARTBOOT;}
    0F50 2422      CLR	R2
    0F51 1624      CP	R2,R20
    0F52 F408      BCC	0x0F54
    0F53 CFC6      RJMP	0x0F1A
(0277) 	
(0278)     ExecCode();//执行用户区程序
    0F54 DFAB      RCALL	_ExecCode
    0F55 9508      RET
FILE: D:\IccAvr\Pei\BootLoad_Pei\assembly.s
(0001) 		.text
(0002) 		
(0003) SPMCR = 0x57   ;RWW区忙标志,读RWW区允许,允许写程序存储区
(0004) 
(0005) ; void write_page (unsigned int adr, unsigned char function);
(0006) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0007) _write_page::
(0008)     XCALL __WAIT_SPMEN__
_write_page:
    0F56 D01F      RCALL	0x0F76
(0009)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    0F57 01F8      MOVW	R30,R16
(0010)     STS     SPMCR, R18      ;argument 2 decides function
    0F58 93200057  STS	0x57,R18
(0011)     SPM                     ;perform pagewrite
    0F5A 95E8      SPM
(0012)     RET
    0F5B 9508      RET
(0013) 
(0014) ;-----------------------------------------
(0015) 
(0016) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0017) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0018) _fill_temp_buffer::
(0019)     XCALL __WAIT_SPMEN__
_fill_temp_buffer:
    0F5C D019      RCALL	0x0F76
(0020)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    0F5D 01F9      MOVW	R30,R18
(0021)     movw    r0, r16         ;move data to reg 0 and 1
    0F5E 0108      MOVW	R0,R16
(0022)     LDI     R19, 0x01
    0F5F E031      LDI	R19,1
(0023)     STS     SPMCR, R19
    0F60 93300057  STS	0x57,R19
(0024)     SPM                     ;Store program memory
    0F62 95E8      SPM
(0025)     RET      
    0F63 9508      RET
(0026) 	
(0027) ;-----------------------------------------	
(0028) 
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031)     mov r31,r17
_read_flash:
    0F64 2FF1      MOV	R31,R17
(0032)     mov r30,r16
    0F65 2FE0      MOV	R30,R16
(0033)     lpm r16,z
    0F66 9104      LPM	R16,0(Z)
(0034)     clr r17
    0F67 2711      CLR	R17
(0035)     ret	
    0F68 9508      RET
(0036) 		
(0037) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0038) _read_program_memory::
(0039)     movw    r30, r16        ;move adress to z pointer
_read_program_memory:
    0F69 01F8      MOVW	R30,R16
(0040)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    0F6A FD20      SBRC	R18,0
(0041)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    0F6B 93200057  STS	0x57,R18
(0042)     LPM     r16, Z+
    0F6D 9105      LPM	R16,Z+
(0043)     LPM     r17, Z
    0F6E 9114      LPM	R17,0(Z)
(0044)     RET
    0F6F 9508      RET
(0045) 	
(0046) ;-----------------------------------------
(0047)         
(0048) _enableRWW::
(0049) 	XCALL __WAIT_SPMEN__
_enableRWW:
    0F70 D005      RCALL	0x0F76
(0050)     LDI R27,0x11
    0F71 E1B1      LDI	R27,0x11
(0051)     STS SPMCR,R27
    0F72 93B00057  STS	0x57,R27
(0052)     SPM
    0F74 95E8      SPM
(0053)     RET   
    0F75 9508      RET
(0054) 	
(0055) ;-----------------------------------------           
(0056) 
(0057) __WAIT_SPMEN__:
(0058)     LDS     R27,SPMCR       ; load SPMCR to R27
    0F76 91B00057  LDS	R27,0x57
(0059)     SBRC    R27,0           ; check SPMEN flag
    0F78 FDB0      SBRC	R27,0
(0060)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
    0F79 CFFC      RJMP	0x0F76
(0061)     RET
FILE: <library>
    0F7A 9508      RET
pop_gset2:
    0F7B E0E2      LDI	R30,2
    0F7C C010      RJMP	pop
pop_gset3:
    0F7D E0E4      LDI	R30,4
    0F7E C00E      RJMP	pop
pop_gset4:
    0F7F E0E8      LDI	R30,0x8
    0F80 C00C      RJMP	pop
push_gset5:
    0F81 92FA      ST	R15,-Y
    0F82 92EA      ST	R14,-Y
push_gset4:
    0F83 92DA      ST	R13,-Y
    0F84 92CA      ST	R12,-Y
push_gset3:
    0F85 92BA      ST	R11,-Y
    0F86 92AA      ST	R10,-Y
push_gset2:
    0F87 937A      ST	R23,-Y
    0F88 936A      ST	R22,-Y
push_gset1:
    0F89 935A      ST	R21,-Y
    0F8A 934A      ST	R20,-Y
    0F8B 9508      RET
pop_gset1:
    0F8C E0E1      LDI	R30,1
pop:
    0F8D 9149      LD	R20,Y+
    0F8E 9159      LD	R21,Y+
    0F8F FDE0      SBRC	R30,0
    0F90 9508      RET
    0F91 9169      LD	R22,Y+
    0F92 9179      LD	R23,Y+
    0F93 FDE1      SBRC	R30,1
    0F94 9508      RET
    0F95 90A9      LD	R10,Y+
    0F96 90B9      LD	R11,Y+
    0F97 FDE2      SBRC	R30,2
    0F98 9508      RET
    0F99 90C9      LD	R12,Y+
    0F9A 90D9      LD	R13,Y+
    0F9B FDE3      SBRC	R30,3
    0F9C 9508      RET
    0F9D 90E9      LD	R14,Y+
    0F9E 90F9      LD	R15,Y+
    0F9F 9508      RET
lsl16:
    0FA0 2322      TST	R18
    0FA1 F021      BEQ	0x0FA6
    0FA2 0F00      LSL	R16
    0FA3 1F11      ROL	R17
    0FA4 952A      DEC	R18
    0FA5 CFFA      RJMP	lsl16
    0FA6 9508      RET

⌨️ 快捷键说明

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