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

📄 avrbootloader.lst

📁 ATmal mega88 芯片的bootload源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    1F01 2C32      MOV	R3,R2
    1F02 2422      CLR	R2
    1F03 E082      LDI	R24,2
    1F04 E091      LDI	R25,1
    1F05 2FE4      MOV	R30,R20
    1F06 27FF      CLR	R31
    1F07 0FE8      ADD	R30,R24
    1F08 1FF9      ADC	R31,R25
    1F09 80C0      LDD	R12,Z+0
    1F0A 24DD      CLR	R13
    1F0B 0CC2      ADD	R12,R2
    1F0C 1CD3      ADC	R13,R3
(0186) 	if (TempInt != TempInt2) return 0;
    1F0D 150C      CP	R16,R12
    1F0E 051D      CPC	R17,R13
    1F0F F011      BEQ	0x1F12
    1F10 2700      CLR	R16
    1F11 C004      RJMP	0x1F16
    1F12 5F4E      SUBI	R20,0xFE
    1F13 3840      CPI	R20,0x80
    1F14 F2C0      BCS	0x1EED
(0187)       }
(0188)     return 1;
    1F15 E001      LDI	R16,1
    1F16 940C 1FCE JMP	pop_xgset303C
(0189)   }
(0190) 
(0191) /*****************************************************************************/
(0192) /*  		字符输入函数 		 */	
(0193) unsigned char RecChar(void)
(0194)   {
(0195)      while(!(UCSR0A & 0x80));
_RecChar:
    1F18 9020 00C0 LDS	R2,0x00C0
    1F1A FE27      SBRS	R2,7
    1F1B CFFC      RJMP	_RecChar
(0196)      return UDR0;
    1F1C 9100 00C6 LDS	R16,0x00C6
    1F1E 9508      RET
(0197)   }		
(0198) /*****************************************************************************/
(0199) void SendChar(unsigned char c)
(0200)   {	 
(0201)     while (!(UCSR0A&(1<<UDRE0)));
_SendChar:
  c                    --> R16
    1F1F 9020 00C0 LDS	R2,0x00C0
    1F21 FE25      SBRS	R2,5
    1F22 CFFC      RJMP	_SendChar
(0202)     UDR0=c;
    1F23 9300 00C6 STS	0x00C6,R16
    1F25 9508      RET
(0203)   }
(0204) void delay(void)  
(0205)   {
(0206)     unsigned int i;
(0207)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
    1F26 2700      CLR	R16
    1F27 2711      CLR	R17
    1F28 C002      RJMP	0x1F2B
    1F29 5F0F      SUBI	R16,0xFF
    1F2A 4F1F      SBCI	R17,0xFF
    1F2B EF8A      LDI	R24,0xFA
    1F2C EF9F      LDI	R25,0xFF
    1F2D E0A0      LDI	R26,0
    1F2E E0B0      LDI	R27,0
    1F2F 0118      MOVW	R2,R16
    1F30 2444      CLR	R4
    1F31 2455      CLR	R5
    1F32 1628      CP	R2,R24
    1F33 0639      CPC	R3,R25
    1F34 064A      CPC	R4,R26
    1F35 065B      CPC	R5,R27
    1F36 F394      BLT	0x1F29
    1F37 9508      RET
(0208)   }
(0209) 
(0210) /*****************************************************************************/
(0211) void ExecCode(void)
(0212)   {
(0213)     MCUCR=(1<<IVCE);      //中断向量表移位允许
_ExecCode:
    1F38 E081      LDI	R24,1
    1F39 BF85      OUT	0x35,R24
(0214)     MCUCR=0X00;           //中断向量指向应用程序区
    1F3A 2422      CLR	R2
    1F3B BE25      OUT	0x35,R2
(0215)     asm("jmp 0x0000");              
    1F3C 940C 0000 JMP	0x0000
    1F3E 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
(0231)  	DDRB  = 0xFF;//bit1=output
(0232)  	PORTC = 0x21;//0x20;//rfrst=1,not reset! 
(0233)  	DDRC  = 0x7F;
(0234)  	PORTD = 0x0C;
(0235)  	DDRD  = 0xF0;
(0236) #else
(0237) #endif
(0238)     
(0239)     UCSR0C=(1<<UCSZ01)|(1<<UCSZ00); //8位数据+1位停止(1<<URSEL)|
_main:
  iTry                 --> R20
  TempInt              --> R22
  BootFlag             --> R22
    1F3F E086      LDI	R24,6
    1F40 9380 00C2 STS	0x00C2,R24
(0240)     UCSR0B = (1<<RXEN0)|(1<<TXEN0);       //允许串口发送和接收
    1F42 E188      LDI	R24,0x18
    1F43 9380 00C1 STS	0x00C1,R24
(0241)     UBRR0 = BAU;
    1F45 E383      LDI	R24,0x33
    1F46 E090      LDI	R25,0
    1F47 9390 00C5 STS	0x00C5,R25
    1F49 9380 00C4 STS	0x00C4,R24
(0242) 
(0243) 	iTry=20;
    1F4B E144      LDI	R20,0x14
(0244) STARTBOOT://pei未下载程序时重复等待
(0245) #ifdef W0	
(0246)     PORTC=PORTC^0x03;//指示灯闪烁
(0247) #endif
(0248) 	
(0249)     SendChar('>');              //通知PC机,BOOT下载准备就绪
    1F4C E30E      LDI	R16,0x3E
    1F4D DFD1      RCALL	_SendChar
(0250)     delay();                    //延时等待PC机响应
    1F4E DFD7      RCALL	_delay
(0251)     BootFlag=UDR0;
    1F4F 9160 00C6 LDS	R22,0x00C6
(0252)     if (BootFlag == '<') 
    1F51 336C      CPI	R22,0x3C
    1F52 F4E9      BNE	0x1F70
(0253)       {
(0254) 	     SendChar(ChipType);   //芯片版本信息
    1F53 E301      LDI	R16,0x31
    1F54 DFCA      RCALL	_SendChar
(0255)          SendChar(BootSize);
    1F55 E603      LDI	R16,0x63
    1F56 DFC8      RCALL	_SendChar
(0256)          SendChar(BootVer);
    1F57 E607      LDI	R16,0x67
    1F58 DFC6      RCALL	_SendChar
    1F59 C015      RJMP	0x1F6F
(0257)          while (1)
(0258) 	   {
(0259) 	     switch (RecChar())
    1F5A DFBD      RCALL	_RecChar
    1F5B 2F60      MOV	R22,R16
    1F5C 2777      CLR	R23
    1F5D 3465      CPI	R22,0x45
    1F5E E0E0      LDI	R30,0
    1F5F 077E      CPC	R23,R30
    1F60 F059      BEQ	0x1F6C
    1F61 3465      CPI	R22,0x45
    1F62 E0E0      LDI	R30,0
    1F63 077E      CPC	R23,R30
    1F64 F054      BLT	0x1F6F
    1F65 3567      CPI	R22,0x57
    1F66 E0E0      LDI	R30,0
    1F67 077E      CPC	R23,R30
    1F68 F009      BEQ	0x1F6A
    1F69 C005      RJMP	0x1F6F
(0260) 	       {
(0261) 	         case 'W': FlashLoad();
    1F6A DEF0      RCALL	_FlashLoad
(0262) 			 	   break;
    1F6B C003      RJMP	0x1F6F
(0263) 	         case 'E': { 
(0264) 	         	     SendChar('E');  //通知PC机,进入运用程序区
    1F6C E405      LDI	R16,0x45
    1F6D DFB1      RCALL	_SendChar
(0265) 	         	     ExecCode();  
    1F6E DFC9      RCALL	_ExecCode
    1F6F CFEA      RJMP	0x1F5A
(0266) 	         	   } break;
(0267) 	         default : break;
(0268) 	       }
(0269) 	   }
(0270)       }
(0271)     SendChar('E');  
    1F70 E405      LDI	R16,0x45
    1F71 DFAD      RCALL	_SendChar
(0272) 	
(0273) 	TempInt = read_program_memory(0,0);//pei
    1F72 2722      CLR	R18
    1F73 2700      CLR	R16
    1F74 2711      CLR	R17
    1F75 940E 1F97 CALL	_read_program_memory
    1F77 01B8      MOVW	R22,R16
(0274) 	if (TempInt==0xFFFF) goto STARTBOOT;
    1F78 3F0F      CPI	R16,0xFF
    1F79 EFEF      LDI	R30,0xFF
    1F7A 071E      CPC	R17,R30
    1F7B F409      BNE	0x1F7D
    1F7C CFCF      RJMP	0x1F4C
(0275) 	  else{ iTry--;
    1F7D 954A      DEC	R20
(0276) 	        if (iTry>0) goto STARTBOOT;}
    1F7E E080      LDI	R24,0
    1F7F 1784      CP	R24,R20
    1F80 F408      BCC	0x1F82
    1F81 CFCA      RJMP	0x1F4C
(0277) 	
(0278)     ExecCode();//执行用户区程序
    1F82 DFB5      RCALL	_ExecCode
    1F83 9508      RET
FILE: F:\程序\新建文~1\BootLoad_88可用\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:
    1F84 D01F      RCALL	0x1FA4
(0009)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    1F85 01F8      MOVW	R30,R16
(0010)     STS     SPMCR, R18      ;argument 2 decides function
    1F86 9320 0057 STS	0x0057,R18
(0011)     SPM                     ;perform pagewrite
    1F88 95E8      SPM
(0012)     RET
    1F89 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:
    1F8A D019      RCALL	0x1FA4
(0020)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    1F8B 01F9      MOVW	R30,R18
(0021)     movw    r0, r16         ;move data to reg 0 and 1
    1F8C 0108      MOVW	R0,R16
(0022)     LDI     R19, 0x01
    1F8D E031      LDI	R19,1
(0023)     STS     SPMCR, R19
    1F8E 9330 0057 STS	0x0057,R19
(0024)     SPM                     ;Store program memory
    1F90 95E8      SPM
(0025)     RET      
    1F91 9508      RET
(0026) 	
(0027) ;-----------------------------------------	
(0028) 
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031)     mov r31,r17
_read_flash:
    1F92 2FF1      MOV	R31,R17
(0032)     mov r30,r16
    1F93 2FE0      MOV	R30,R16
(0033)     lpm r16,z
    1F94 9104      LPM	R16,87(Z)
(0034)     clr r17
    1F95 2711      CLR	R17
(0035)     ret	
    1F96 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:
    1F97 01F8      MOVW	R30,R16
(0040)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    1F98 FD20      SBRC	R18,0
(0041)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    1F99 9320 0057 STS	0x0057,R18
(0042)     LPM     r16, Z+
    1F9B 9105      LPM	R16,Z+
(0043)     LPM     r17, Z
    1F9C 9114      LPM	R17,87(Z)
(0044)     RET
    1F9D 9508      RET
(0045) 	
(0046) ;-----------------------------------------
(0047)         
(0048) _enableRWW::
(0049) 	XCALL __WAIT_SPMEN__
_enableRWW:
    1F9E D005      RCALL	0x1FA4
(0050)     LDI R27,0x11
    1F9F E1B1      LDI	R27,0x11
(0051)     STS SPMCR,R27
    1FA0 93B0 0057 STS	0x0057,R27
(0052)     SPM
    1FA2 95E8      SPM
(0053)     RET   
    1FA3 9508      RET
(0054) 	
(0055) ;-----------------------------------------           
(0056) 
(0057) __WAIT_SPMEN__:
(0058)     LDS     R27,SPMCR       ; load SPMCR to R27
    1FA4 91B0 0057 LDS	R27,0x0057
(0059)     SBRC    R27,0           ; check SPMEN flag
    1FA6 FDB0      SBRC	R27,0
(0060)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
    1FA7 CFFC      RJMP	0x1FA4
(0061)     RET
FILE: <library>
    1FA8 9508      RET
pop_xgset30FC:
    1FA9 90A9      LD	R10,Y+
    1FAA 90B9      LD	R11,Y+
    1FAB 90C9      LD	R12,Y+
    1FAC 90D9      LD	R13,Y+
    1FAD 90E9      LD	R14,Y+
    1FAE 90F9      LD	R15,Y+
    1FAF 9149      LD	R20,Y+
    1FB0 9159      LD	R21,Y+
    1FB1 9508      RET
push_xgsetF0FC:
    1FB2 937A      ST	R23,-Y
    1FB3 936A      ST	R22,-Y
push_xgset30FC:
    1FB4 935A      ST	R21,-Y
    1FB5 934A      ST	R20,-Y
push_xgset00FC:
    1FB6 92FA      ST	R15,-Y
    1FB7 92EA      ST	R14,-Y
push_xgset003C:
    1FB8 92DA      ST	R13,-Y
    1FB9 92CA      ST	R12,-Y
    1FBA 92BA      ST	R11,-Y
    1FBB 92AA      ST	R10,-Y
    1FBC 9508      RET
push_xgset300C:
    1FBD 935A      ST	R21,-Y
    1FBE 934A      ST	R20,-Y
    1FBF 92BA      ST	R11,-Y
    1FC0 92AA      ST	R10,-Y
    1FC1 9508      RET
pop_xgset300C:
    1FC2 90A9      LD	R10,Y+
    1FC3 90B9      LD	R11,Y+
    1FC4 9149      LD	R20,Y+
    1FC5 9159      LD	R21,Y+
    1FC6 9508      RET
push_xgset303C:
    1FC7 935A      ST	R21,-Y
    1FC8 934A      ST	R20,-Y
    1FC9 92DA      ST	R13,-Y
    1FCA 92CA      ST	R12,-Y
    1FCB 92BA      ST	R11,-Y
    1FCC 92AA      ST	R10,-Y
    1FCD 9508      RET
pop_xgset303C:
    1FCE 90A9      LD	R10,Y+
    1FCF 90B9      LD	R11,Y+
    1FD0 90C9      LD	R12,Y+
    1FD1 90D9      LD	R13,Y+
    1FD2 9149      LD	R20,Y+
    1FD3 9159      LD	R21,Y+
    1FD4 9508      RET
lsl16:
    1FD5 2322      TST	R18
    1FD6 F021      BEQ	0x1FDB
    1FD7 0F00      LSL	R16
    1FD8 1F11      ROL	R17
    1FD9 952A      DEC	R18
    1FDA CFFA      RJMP	lsl16
    1FDB 9508      RET

⌨️ 快捷键说明

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