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

📄 avrbootloader.lst

📁 本源码为C语言环境的ATMAGE8的BootLoader开发程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
     EDD 1FF9      ADC	R31,R25
     EDE 80C0      LDD	R12,Z+0
     EDF 24DD      CLR	R13
     EE0 0CC2      ADD	R12,R2
     EE1 1CD3      ADC	R13,R3
(0186) 	if (TempInt != TempInt2) return 0;
     EE2 150C      CP	R16,R12
     EE3 051D      CPC	R17,R13
     EE4 F011      BEQ	0x0EE7
     EE5 2700      CLR	R16
     EE6 C004      RJMP	0x0EEB
     EE7 5F4E      SUBI	R20,0xFE
     EE8 3440      CPI	R20,0x40
     EE9 F2C8      BCS	0x0EC3
(0187)       }
(0188)     return 1;
     EEA E001      LDI	R16,1
     EEB C0BB      RJMP	pop_xgset303C
(0189)   }
(0190) 
(0191) /*****************************************************************************/
(0192) /*  		字符输入函数 		 */	
(0193) unsigned char RecChar(void)
(0194)   {
(0195)      while(!(UCSRA & 0x80));
_RecChar:
     EEC 9B5F      SBIS	0x0B,7
     EED CFFE      RJMP	_RecChar
(0196)      return UDR;
     EEE B10C      IN	R16,0x0C
     EEF 9508      RET
(0197)   }		
(0198) /*****************************************************************************/
(0199) void SendChar(unsigned char c)
(0200)   {	 
(0201)     while (!(UCSRA&(1<<UDRE)));
_SendChar:
  c                    --> R16
     EF0 9B5D      SBIS	0x0B,5
     EF1 CFFE      RJMP	_SendChar
(0202)     UDR=c;
     EF2 B90C      OUT	0x0C,R16
     EF3 9508      RET
(0203)   }
(0204) void delay(void)  
(0205)   {
(0206)     unsigned int i;
(0207)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
     EF4 2700      CLR	R16
     EF5 2711      CLR	R17
     EF6 C002      RJMP	0x0EF9
     EF7 5F0F      SUBI	R16,0xFF
     EF8 4F1F      SBCI	R17,0xFF
     EF9 EF8A      LDI	R24,0xFA
     EFA EF9F      LDI	R25,0xFF
     EFB E0A0      LDI	R26,0
     EFC E0B0      LDI	R27,0
     EFD 0118      MOVW	R2,R16
     EFE 2444      CLR	R4
     EFF 2455      CLR	R5
     F00 1628      CP	R2,R24
     F01 0639      CPC	R3,R25
     F02 064A      CPC	R4,R26
     F03 065B      CPC	R5,R27
     F04 F394      BLT	0x0EF7
     F05 9508      RET
(0208)   }
(0209) 
(0210) /*****************************************************************************/
(0211) void ExecCode(void)
(0212)   {
(0213)     GICR=0X01;           //中断向量表移位允许
_ExecCode:
     F06 E081      LDI	R24,1
     F07 BF8B      OUT	0x3B,R24
(0214)     GICR=0X00;           //中断向量指向应用程序区
     F08 2422      CLR	R2
     F09 BE2B      OUT	0x3B,R2
(0215)     asm("jmp 0x0000");              
     F0A 940C 0000 JMP	0x0000
     F0C 9508      RET
(0216)   }	
(0217) void main(void)
(0218)   {
(0219)     unsigned char BootFlag;
(0220)     unsigned int TempInt;
(0221) 	char iTry;
(0222) 	CLI();
_main:
  iTry                 --> R20
  TempInt              --> R22
  BootFlag             --> R22
     F0D 94F8      BCLR	7
(0223)     #ifdef InteClk                //如果使用内部时钟,读取时钟校准值
(0224)        OSCCAL=read_flash(OscAddress);
(0225)     #endif
(0226) 
(0227) #ifdef W0	
(0228)  //pei 拷贝W0的PortInit
(0229)  	PORTB = 0x0F;//rfslp,fs123=1
     F0E E08F      LDI	R24,0xF
     F0F BB88      OUT	0x18,R24
(0230)  	DDRB  = 0xFF;//bit1=output
     F10 EF8F      LDI	R24,0xFF
     F11 BB87      OUT	0x17,R24
(0231)  	PORTC = 0x21;//0x20;//rfrst=1,not reset! 
     F12 E281      LDI	R24,0x21
     F13 BB85      OUT	0x15,R24
(0232)  	DDRC  = 0x7F;
     F14 E78F      LDI	R24,0x7F
     F15 BB84      OUT	0x14,R24
(0233)  	PORTD = 0x0C;
     F16 E08C      LDI	R24,0xC
     F17 BB82      OUT	0x12,R24
(0234)  	DDRD  = 0xF0;
     F18 EF80      LDI	R24,0xF0
     F19 BB81      OUT	0x11,R24
(0235) #else
(0236) #endif
(0237)     
(0238)     UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
     F1A E886      LDI	R24,0x86
     F1B BD80      OUT	0x20,R24
(0239)     UCSRB = (1<<RXEN)|(1<<TXEN);       //允许串口发送和接收
     F1C E188      LDI	R24,0x18
     F1D B98A      OUT	0x0A,R24
(0240)     UBRR = BAU;
     F1E E383      LDI	R24,0x33
     F1F B989      OUT	0x09,R24
(0241) 
(0242) 	iTry=20;
     F20 E144      LDI	R20,0x14
(0243) STARTBOOT://pei未下载程序时重复等待
(0244) #ifdef W0	
(0245)     PORTC=PORTC^0x03;//指示灯闪烁
     F21 E083      LDI	R24,3
     F22 B225      IN	R2,0x15
     F23 2628      EOR	R2,R24
     F24 BA25      OUT	0x15,R2
(0246) #endif
(0247)  	 delay();                    //延时等待PC机响应
     F25 DFCE      RCALL	_delay
(0248)      SendChar('>');              //通知PC机,BOOT下载准备就绪
     F26 E30E      LDI	R16,0x3E
     F27 DFC8      RCALL	_SendChar
(0249)      delay();                    //延时等待PC机响应
     F28 DFCB      RCALL	_delay
(0250)      BootFlag=UDR;
     F29 B16C      IN	R22,0x0C
(0251) 
(0252)     if (BootFlag == '<') 
     F2A 336C      CPI	R22,0x3C
     F2B F4E9      BNE	0x0F49
(0253)       {
(0254) 	     SendChar(ChipType);   //芯片版本信息
     F2C E300      LDI	R16,0x30
     F2D DFC2      RCALL	_SendChar
(0255)          SendChar(BootSize);
     F2E E603      LDI	R16,0x63
     F2F DFC0      RCALL	_SendChar
(0256)          SendChar(BootVer);
     F30 E607      LDI	R16,0x67
     F31 DFBE      RCALL	_SendChar
     F32 C015      RJMP	0x0F48
(0257)          while (1)
(0258) 	   {
(0259) 	     switch (RecChar())
     F33 DFB8      RCALL	_RecChar
     F34 2F60      MOV	R22,R16
     F35 2777      CLR	R23
     F36 3465      CPI	R22,0x45
     F37 E0E0      LDI	R30,0
     F38 077E      CPC	R23,R30
     F39 F059      BEQ	0x0F45
     F3A 3465      CPI	R22,0x45
     F3B E0E0      LDI	R30,0
     F3C 077E      CPC	R23,R30
     F3D F054      BLT	0x0F48
     F3E 3567      CPI	R22,0x57
     F3F E0E0      LDI	R30,0
     F40 077E      CPC	R23,R30
     F41 F009      BEQ	0x0F43
     F42 C005      RJMP	0x0F48
(0260) 	       {
(0261) 	         case 'W': FlashLoad();
     F43 DEF5      RCALL	_FlashLoad
(0262) 			 	   break;
     F44 C003      RJMP	0x0F48
(0263) 	         case 'E': { 
(0264) 	         	     SendChar('E');  //通知PC机,进入运用程序区
     F45 E405      LDI	R16,0x45
     F46 DFA9      RCALL	_SendChar
(0265) 	         	     ExecCode();  
     F47 DFBE      RCALL	_ExecCode
     F48 CFEA      RJMP	0x0F33
(0266) 	         	   } break;
(0267) 	         default : break;
(0268) 	       }
(0269) 	   }
(0270)       }
(0271)     SendChar('E');  
     F49 E405      LDI	R16,0x45
     F4A DFA5      RCALL	_SendChar
(0272) 	
(0273) 	TempInt = read_program_memory(0,0);//pei
     F4B 2722      CLR	R18
     F4C 2700      CLR	R16
     F4D 2711      CLR	R17
     F4E D021      RCALL	_read_program_memory
     F4F 01B8      MOVW	R22,R16
(0274) 	if (TempInt==0xFFFF) goto STARTBOOT;
     F50 3F0F      CPI	R16,0xFF
     F51 EFEF      LDI	R30,0xFF
     F52 071E      CPC	R17,R30
     F53 F409      BNE	0x0F55
     F54 CFCC      RJMP	0x0F21
(0275) 	  else{ iTry--;
     F55 954A      DEC	R20
(0276) 	        if (iTry>0) goto STARTBOOT;}
     F56 E080      LDI	R24,0
     F57 1784      CP	R24,R20
     F58 F408      BCC	0x0F5A
     F59 CFC7      RJMP	0x0F21
(0277) 	SEI();
     F5A 9478      BSET	7
(0278)     ExecCode();//执行用户区程序
     F5B DFAA      RCALL	_ExecCode
     F5C 9508      RET
FILE: F:\AVR常用函数\BootLooderMage8\BootLoad_8M\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:
     F5D D01F      RCALL	0x0F7D
(0009)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
     F5E 01F8      MOVW	R30,R16
(0010)     STS     SPMCR, R18      ;argument 2 decides function
     F5F 9320 0057 STS	0x0057,R18
(0011)     SPM                     ;perform pagewrite
     F61 95E8      SPM
(0012)     RET
     F62 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:
     F63 D019      RCALL	0x0F7D
(0020)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
     F64 01F9      MOVW	R30,R18
(0021)     movw    r0, r16         ;move data to reg 0 and 1
     F65 0108      MOVW	R0,R16
(0022)     LDI     R19, 0x01
     F66 E031      LDI	R19,1
(0023)     STS     SPMCR, R19
     F67 9330 0057 STS	0x0057,R19
(0024)     SPM                     ;Store program memory
     F69 95E8      SPM
(0025)     RET      
     F6A 9508      RET
(0026) 	
(0027) ;-----------------------------------------	
(0028) 
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031)     mov r31,r17
_read_flash:
     F6B 2FF1      MOV	R31,R17
(0032)     mov r30,r16
     F6C 2FE0      MOV	R30,R16
(0033)     lpm r16,z
     F6D 9104      LPM	R16,87(Z)
(0034)     clr r17
     F6E 2711      CLR	R17
(0035)     ret	
     F6F 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:
     F70 01F8      MOVW	R30,R16
(0040)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
     F71 FD20      SBRC	R18,0
(0041)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
     F72 9320 0057 STS	0x0057,R18
(0042)     LPM     r16, Z+
     F74 9105      LPM	R16,Z+
(0043)     LPM     r17, Z
     F75 9114      LPM	R17,87(Z)
(0044)     RET
     F76 9508      RET
(0045) 	
(0046) ;-----------------------------------------
(0047)         
(0048) _enableRWW::
(0049) 	XCALL __WAIT_SPMEN__
_enableRWW:
     F77 D005      RCALL	0x0F7D
(0050)     LDI R27,0x11
     F78 E1B1      LDI	R27,0x11
(0051)     STS SPMCR,R27
     F79 93B0 0057 STS	0x0057,R27
(0052)     SPM
     F7B 95E8      SPM
(0053)     RET   
     F7C 9508      RET
(0054) 	
(0055) ;-----------------------------------------           
(0056) 
(0057) __WAIT_SPMEN__:
(0058)     LDS     R27,SPMCR       ; load SPMCR to R27
     F7D 91B0 0057 LDS	R27,0x0057
(0059)     SBRC    R27,0           ; check SPMEN flag
     F7F FDB0      SBRC	R27,0
(0060)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
     F80 CFFC      RJMP	0x0F7D
(0061)     RET
FILE: <library>
     F81 9508      RET
pop_xgset30FC:
     F82 90A9      LD	R10,Y+
     F83 90B9      LD	R11,Y+
     F84 90C9      LD	R12,Y+
     F85 90D9      LD	R13,Y+
     F86 90E9      LD	R14,Y+
     F87 90F9      LD	R15,Y+
     F88 9149      LD	R20,Y+
     F89 9159      LD	R21,Y+
     F8A 9508      RET
push_xgsetF0FC:
     F8B 937A      ST	R23,-Y
     F8C 936A      ST	R22,-Y
push_xgset30FC:
     F8D 935A      ST	R21,-Y
     F8E 934A      ST	R20,-Y
push_xgset00FC:
     F8F 92FA      ST	R15,-Y
     F90 92EA      ST	R14,-Y
push_xgset003C:
     F91 92DA      ST	R13,-Y
     F92 92CA      ST	R12,-Y
     F93 92BA      ST	R11,-Y
     F94 92AA      ST	R10,-Y
     F95 9508      RET
push_xgset300C:
     F96 935A      ST	R21,-Y
     F97 934A      ST	R20,-Y
     F98 92BA      ST	R11,-Y
     F99 92AA      ST	R10,-Y
     F9A 9508      RET
pop_xgset300C:
     F9B 90A9      LD	R10,Y+
     F9C 90B9      LD	R11,Y+
     F9D 9149      LD	R20,Y+
     F9E 9159      LD	R21,Y+
     F9F 9508      RET
push_xgset303C:
     FA0 935A      ST	R21,-Y
     FA1 934A      ST	R20,-Y
     FA2 92DA      ST	R13,-Y
     FA3 92CA      ST	R12,-Y
     FA4 92BA      ST	R11,-Y
     FA5 92AA      ST	R10,-Y
     FA6 9508      RET
pop_xgset303C:
     FA7 90A9      LD	R10,Y+
     FA8 90B9      LD	R11,Y+
     FA9 90C9      LD	R12,Y+
     FAA 90D9      LD	R13,Y+
     FAB 9149      LD	R20,Y+
     FAC 9159      LD	R21,Y+
     FAD 9508      RET
lsl16:
     FAE 2322      TST	R18
     FAF F021      BEQ	0x0FB4
     FB0 0F00      LSL	R16
     FB1 1F11      ROL	R17
     FB2 952A      DEC	R18
     FB3 CFFA      RJMP	lsl16
     FB4 9508      RET

⌨️ 快捷键说明

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