📄 avrbootloader.lst
字号:
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 + -