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