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

📄 avrboot_m8_16.lst

📁 AVR的BOOT原代码 AVR的BOOT原代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
    1EF7 1D53      ADC	R21,R3
(0164) 	if (TempInt != TempInt2) return 0;
    1EF8 1704      CP	R16,R20
    1EF9 0715      CPC	R17,R21
    1EFA F011      BEQ	0x1EFD
    1EFB 2700      CLR	R16
    1EFC C007      RJMP	0x1F04
    1EFD 2D8A      MOV	R24,R10
    1EFE 5F8E      SUBI	R24,0xFE
    1EFF 2EA8      MOV	R10,R24
    1F00 2D8A      MOV	R24,R10
    1F01 3880      CPI	R24,0x80
    1F02 F2A8      BCS	0x1ED8
(0165)       }
(0166)     return 1;
    1F03 E001      LDI	R16,1
    1F04 940E1F93  CALL	pop_gset3
    1F06 9508      RET
(0167)   }
(0168) 
(0169) /*****************************************************************************/
(0170) /*  		字符输入函数 		 */	
(0171) unsigned char RecChar(void)
(0172)   {
(0173)      while(!(UCSRA & 0x80));
_RecChar:
    1F07 9B5F      SBIS	0x0B,7
    1F08 CFFE      RJMP	_RecChar
(0174)      return UDR;
    1F09 B10C      IN	R16,0x0C
    1F0A 9508      RET
(0175)   }		
(0176) /*****************************************************************************/
(0177) void SendChar(unsigned char c)
(0178)   {	 
(0179)     while (!(UCSRA&(1<<UDRE)));
_SendChar:
  c                    --> R16
    1F0B 9B5D      SBIS	0x0B,5
    1F0C CFFE      RJMP	_SendChar
(0180)     UDR=c;
    1F0D B90C      OUT	0x0C,R16
(0181)   }
    1F0E 9508      RET
(0182) void delay(void)  
(0183)   {
(0184)     unsigned int i;
(0185)     for (i=0;i<65530;i++);
_delay:
  i                    --> R16
    1F0F 2700      CLR	R16
    1F10 2711      CLR	R17
    1F11 C002      RJMP	0x1F14
    1F12 5F0F      SUBI	R16,0xFF
    1F13 4F1F      SBCI	R17,0xFF
    1F14 3F0A      CPI	R16,0xFA
    1F15 EFEF      LDI	R30,0xFF
    1F16 071E      CPC	R17,R30
    1F17 F3D0      BCS	0x1F12
(0186)   }
    1F18 9508      RET
(0187) 
(0188) /*****************************************************************************/
(0189) void ExecCode(void)
(0190)   {
(0191)     GICR=0X01;           //中断向量表移位允许
_ExecCode:
    1F19 E081      LDI	R24,1
    1F1A BF8B      OUT	0x3B,R24
(0192)     GICR=0X00;           //中断向量指向应用程序区
    1F1B 2422      CLR	R2
    1F1C BE2B      OUT	0x3B,R2
(0193)     asm("jmp 0x0000");              
    1F1D 940C0000  JMP	0x0
(0194)   }
    1F1F 9508      RET
(0195) 		
(0196) void main(void)
(0197)   {
(0198)     unsigned char BootFlag;
(0199)     
(0200)     #ifdef InteClk                //如果使用内部时钟,读取时钟校准值
(0201)        OSCCAL=read_flash(OscAddress);
_main:
  BootFlag             --> R20
    1F20 EF0F      LDI	R16,0xFF
    1F21 E11F      LDI	R17,0x1F
    1F22 940E1F79  CALL	_read_flash
    1F24 BF01      OUT	0x31,R16
(0202)     #endif
(0203)     
(0204)     UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
    1F25 E886      LDI	R24,0x86
    1F26 BD80      OUT	0x20,R24
(0205)     UCSRB = (1<<RXEN)|(1<<TXEN);       //允许串口发送和接收
    1F27 E188      LDI	R24,0x18
    1F28 B98A      OUT	0x0A,R24
(0206)     UBRR = BAU;
    1F29 E383      LDI	R24,0x33
    1F2A B989      OUT	0x09,R24
(0207)     
(0208)     SendChar('>');              //通知PC机,BOOT下载准备就绪
    1F2B E30E      LDI	R16,0x3E
    1F2C DFDE      RCALL	_SendChar
(0209)     delay();                    //延时等待PC机响应
    1F2D DFE1      RCALL	_delay
(0210) 	delay();
    1F2E DFE0      RCALL	_delay
(0211) 	delay();
    1F2F DFDF      RCALL	_delay
(0212) 	delay();
    1F30 DFDE      RCALL	_delay
(0213) 	delay();
    1F31 DFDD      RCALL	_delay
(0214) 	delay();
    1F32 DFDC      RCALL	_delay
(0215) 	delay();
    1F33 DFDB      RCALL	_delay
(0216) 	delay();
    1F34 DFDA      RCALL	_delay
(0217)     BootFlag=UDR;
    1F35 B14C      IN	R20,0x0C
(0218)     if (BootFlag == '<') 
    1F36 334C      CPI	R20,0x3C
    1F37 F009      BEQ	0x1F39
    1F38 C02F      RJMP	0x1F68
(0219)       {
(0220) 	     SendChar(ChipType);
    1F39 E301      LDI	R16,0x31
    1F3A DFD0      RCALL	_SendChar
(0221) 		 delay();                    //延时等待PC机响应
    1F3B DFD3      RCALL	_delay
(0222) 	     delay();
    1F3C DFD2      RCALL	_delay
(0223) 	     delay();
    1F3D DFD1      RCALL	_delay
(0224) 	     delay();
    1F3E DFD0      RCALL	_delay
(0225) 		 delay();
    1F3F DFCF      RCALL	_delay
(0226) 	     delay();
    1F40 DFCE      RCALL	_delay
(0227)          SendChar(BootSize);
    1F41 E603      LDI	R16,0x63
    1F42 DFC8      RCALL	_SendChar
(0228) 		 delay();                    //延时等待PC机响应
    1F43 DFCB      RCALL	_delay
(0229) 	     delay();
    1F44 DFCA      RCALL	_delay
(0230) 	     delay();
    1F45 DFC9      RCALL	_delay
(0231) 	     delay();
    1F46 DFC8      RCALL	_delay
(0232) 		 delay();
    1F47 DFC7      RCALL	_delay
(0233) 	     delay();
    1F48 DFC6      RCALL	_delay
(0234)          SendChar(BootVer);
    1F49 E606      LDI	R16,0x66
    1F4A DFC0      RCALL	_SendChar
(0235) 		 delay();                    //延时等待PC机响应
    1F4B DFC3      RCALL	_delay
(0236) 	     delay();
    1F4C DFC2      RCALL	_delay
(0237) 	     delay();
    1F4D DFC1      RCALL	_delay
(0238) 	     delay();
    1F4E DFC0      RCALL	_delay
(0239) 		 delay();
    1F4F DFBF      RCALL	_delay
(0240) 	     delay();
    1F50 DFBE      RCALL	_delay
    1F51 C015      RJMP	0x1F67
(0241)          while (1)
(0242) 	   {
(0243) 	     switch (RecChar())
    1F52 DFB4      RCALL	_RecChar
    1F53 2F40      MOV	R20,R16
    1F54 2755      CLR	R21
    1F55 3445      CPI	R20,0x45
    1F56 E0E0      LDI	R30,0
    1F57 075E      CPC	R21,R30
    1F58 F059      BEQ	0x1F64
    1F59 3445      CPI	R20,0x45
    1F5A E0E0      LDI	R30,0
    1F5B 075E      CPC	R21,R30
    1F5C F054      BLT	0x1F67
    1F5D 3547      CPI	R20,0x57
    1F5E E0E0      LDI	R30,0
    1F5F 075E      CPC	R21,R30
    1F60 F009      BEQ	0x1F62
    1F61 C005      RJMP	0x1F67
(0244) 	       {
(0245) 	         case 'W': FlashLoad(); break;
    1F62 DEEB      RCALL	_FlashLoad
    1F63 C003      RJMP	0x1F67
(0246) 	         case 'E': { 
(0247) 	         	     SendChar('E');  //通知PC机,进入运用程序区
    1F64 E405      LDI	R16,0x45
    1F65 DFA5      RCALL	_SendChar
(0248) 	         	     ExecCode();  
    1F66 DFB2      RCALL	_ExecCode
    1F67 CFEA      RJMP	0x1F52
(0249) 	         	   } break;
(0250) 	         default : break;
(0251) 	       }
(0252) 	   }
(0253)       }
(0254)     SendChar('E');  //通知PC机,进入运用程序区
    1F68 E405      LDI	R16,0x45
    1F69 DFA1      RCALL	_SendChar
(0255)     ExecCode();
(0256)   }
    1F6A CFAE      RJMP	_ExecCode
FILE: E:\icc\peter\BootLoad\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:
    1F6B D01F      RCALL	0x1F8B
(0009)     movw    r30, r16        ;move address to z pointer (R31 = ZH, R30 = ZL)
    1F6C 01F8      MOVW	R30,R16
(0010)     STS     SPMCR, R18      ;argument 2 decides function
    1F6D 93200057  STS	0x57,R18
(0011)     SPM                     ;perform pagewrite
    1F6F 95E8      SPM
(0012)     RET
    1F70 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:
    1F71 D019      RCALL	0x1F8B
(0020)     movw    r30, r18        ;move adress to z pointer (R31=ZH R30=ZL)
    1F72 01F9      MOVW	R30,R18
(0021)     movw    r0, r16         ;move data to reg 0 and 1
    1F73 0108      MOVW	R0,R16
(0022)     LDI     R19, 0x01
    1F74 E031      LDI	R19,1
(0023)     STS     SPMCR, R19
    1F75 93300057  STS	0x57,R19
(0024)     SPM                     ;Store program memory
    1F77 95E8      SPM
(0025)     RET      
    1F78 9508      RET
(0026) 	
(0027) ;-----------------------------------------	
(0028) 
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031)     mov r31,r17
_read_flash:
    1F79 2FF1      MOV	R31,R17
(0032)     mov r30,r16
    1F7A 2FE0      MOV	R30,R16
(0033)     lpm r16,z
    1F7B 9104      LPM	R16,0(Z)
(0034)     clr r17
    1F7C 2711      CLR	R17
(0035)     ret	
    1F7D 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:
    1F7E 01F8      MOVW	R30,R16
(0040)     SBRC    R18, 0          ;read lockbits? (second argument = 0x09)
    1F7F FD20      SBRC	R18,0
(0041)     STS     SPMCR, R18      ;if so, place second argument in SPMEN register
    1F80 93200057  STS	0x57,R18
(0042)     LPM     r16, Z+
    1F82 9105      LPM	R16,Z+
(0043)     LPM     r17, Z
    1F83 9114      LPM	R17,0(Z)
(0044)     RET
    1F84 9508      RET
(0045) 	
(0046) ;-----------------------------------------
(0047)         
(0048) _enableRWW::
(0049) 	XCALL __WAIT_SPMEN__
_enableRWW:
    1F85 D005      RCALL	0x1F8B
(0050)     LDI R27,0x11
    1F86 E1B1      LDI	R27,0x11
(0051)     STS SPMCR,R27
    1F87 93B00057  STS	0x57,R27
(0052)     SPM
    1F89 95E8      SPM
(0053)     RET   
    1F8A 9508      RET
(0054) 	
(0055) ;-----------------------------------------           
(0056) 
(0057) __WAIT_SPMEN__:
(0058)     LDS     R27,SPMCR       ; load SPMCR to R27
    1F8B 91B00057  LDS	R27,0x57
(0059)     SBRC    R27,0           ; check SPMEN flag
    1F8D FDB0      SBRC	R27,0
(0060)     RJMP    __WAIT_SPMEN__  ; wait for SPMEN flag cleared        
    1F8E CFFC      RJMP	0x1F8B
(0061)     RET
FILE: <library>
    1F8F 9508      RET
pop_gset2:
    1F90 E0E2      LDI	R30,2
    1F91 940C1F9A  JMP	pop
pop_gset3:
    1F93 E0E4      LDI	R30,4
    1F94 940C1F9A  JMP	pop
push_gset1:
    1F96 935A      ST	R21,-Y
    1F97 934A      ST	R20,-Y
    1F98 9508      RET
pop_gset1:
    1F99 E0E1      LDI	R30,1
pop:
    1F9A 9149      LD	R20,Y+
    1F9B 9159      LD	R21,Y+
    1F9C FDE0      SBRC	R30,0
    1F9D 9508      RET
    1F9E 9169      LD	R22,Y+
    1F9F 9179      LD	R23,Y+
    1FA0 FDE1      SBRC	R30,1
    1FA1 9508      RET
    1FA2 90A9      LD	R10,Y+
    1FA3 90B9      LD	R11,Y+
    1FA4 FDE2      SBRC	R30,2
    1FA5 9508      RET
    1FA6 90C9      LD	R12,Y+
    1FA7 90D9      LD	R13,Y+
    1FA8 FDE3      SBRC	R30,3
    1FA9 9508      RET
    1FAA 90E9      LD	R14,Y+
    1FAB 90F9      LD	R15,Y+
    1FAC 9508      RET
push_gset2:
    1FAD 937A      ST	R23,-Y
    1FAE 936A      ST	R22,-Y
    1FAF 940C1F96  JMP	push_gset1
push_gset3:
    1FB1 92BA      ST	R11,-Y
    1FB2 92AA      ST	R10,-Y
    1FB3 940C1FAD  JMP	push_gset2
lsl16:
    1FB5 2322      TST	R18
    1FB6 F021      BEQ	0x1FBB
    1FB7 0F00      LSL	R16
    1FB8 1F11      ROL	R17
    1FB9 952A      DEC	R18
    1FBA CFFA      RJMP	lsl16
    1FBB 9508      RET

⌨️ 快捷键说明

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