📄 avrbootloader.lst
字号:
0ED6 E682 LDI R24,0x62
0ED7 E090 LDI R25,0
0ED8 2DEA MOV R30,R10
0ED9 27FF CLR R31
0EDA 0FE8 ADD R30,R24
0EDB 1FF9 ADC R31,R25
0EDC 8140 LDD R20,Z+0
0EDD 2755 CLR R21
0EDE 0D42 ADD R20,R2
0EDF 1D53 ADC R21,R3
(0186) if (TempInt != TempInt2) return 0;
0EE0 1704 CP R16,R20
0EE1 0715 CPC R17,R21
0EE2 F011 BEQ 0x0EE5
0EE3 2700 CLR R16
0EE4 C007 RJMP 0x0EEC
0EE5 2D8A MOV R24,R10
0EE6 5F8E SUBI R24,0xFE
0EE7 2EA8 MOV R10,R24
0EE8 2D8A MOV R24,R10
0EE9 3480 CPI R24,0x40
0EEA F2B0 BCS 0x0EC1
(0187) }
(0188) return 1;
0EEB E001 LDI R16,1
0EEC D090 RCALL pop_gset3
0EED 9508 RET
(0189) }
(0190)
(0191) /*****************************************************************************/
(0192) /* 字符输入函数 */
(0193) unsigned char RecChar(void)
(0194) {
(0195) while(!(UCSRA & 0x80));
_RecChar:
0EEE 9B5F SBIS 0x0B,7
0EEF CFFE RJMP _RecChar
(0196) return UDR;
0EF0 B10C IN R16,0x0C
0EF1 9508 RET
(0197) }
(0198) /*****************************************************************************/
(0199) void SendChar(unsigned char c)
(0200) {
(0201) while (!(UCSRA&(1<<UDRE)));
_SendChar:
c --> R16
0EF2 9B5D SBIS 0x0B,5
0EF3 CFFE RJMP _SendChar
(0202) UDR=c;
0EF4 B90C OUT 0x0C,R16
0EF5 9508 RET
(0203) }
(0204) void delay(void)
(0205) {
(0206) unsigned int i;
(0207) for (i=0;i<65530;i++);
_delay:
i --> R16
0EF6 2700 CLR R16
0EF7 2711 CLR R17
0EF8 C002 RJMP 0x0EFB
0EF9 5F0F SUBI R16,0xFF
0EFA 4F1F SBCI R17,0xFF
0EFB 3F0A CPI R16,0xFA
0EFC EFEF LDI R30,0xFF
0EFD 071E CPC R17,R30
0EFE F3D0 BCS 0x0EF9
0EFF 9508 RET
(0208) }
(0209)
(0210) /*****************************************************************************/
(0211) void ExecCode(void)
(0212) {
(0213) GICR=0X01; //中断向量表移位允许
_ExecCode:
0F00 E081 LDI R24,1
0F01 BF8B OUT 0x3B,R24
(0214) GICR=0X00; //中断向量指向应用程序区
0F02 2422 CLR R2
0F03 BE2B OUT 0x3B,R2
(0215) asm("jmp 0x0000");
0F04 940C0000 JMP 0x0
0F06 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
_main:
iTry --> R20
TempInt --> R10
BootFlag --> R22
0F07 E08F LDI R24,0xF
0F08 BB88 OUT 0x18,R24
(0231) DDRB = 0xFF;//bit1=output
0F09 EF8F LDI R24,0xFF
0F0A BB87 OUT 0x17,R24
(0232) PORTC = 0x21;//0x20;//rfrst=1,not reset!
0F0B E281 LDI R24,0x21
0F0C BB85 OUT 0x15,R24
(0233) DDRC = 0x7F;
0F0D E78F LDI R24,0x7F
0F0E BB84 OUT 0x14,R24
(0234) PORTD = 0x0C;
0F0F E08C LDI R24,0xC
0F10 BB82 OUT 0x12,R24
(0235) DDRD = 0xF0;
0F11 EF80 LDI R24,0xF0
0F12 BB81 OUT 0x11,R24
(0236) #else
(0237) #endif
(0238)
(0239) UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
0F13 E886 LDI R24,0x86
0F14 BD80 OUT 0x20,R24
(0240) UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
0F15 E188 LDI R24,0x18
0F16 B98A OUT 0x0A,R24
(0241) UBRR = BAU;
0F17 E283 LDI R24,0x23
0F18 B989 OUT 0x09,R24
(0242)
(0243) iTry=20;
0F19 E144 LDI R20,0x14
(0244) STARTBOOT://pei未下载程序时重复等待
(0245) #ifdef W0
(0246) PORTC=PORTC^0x03;//指示灯闪烁
0F1A E083 LDI R24,3
0F1B B225 IN R2,0x15
0F1C 2628 EOR R2,R24
0F1D BA25 OUT 0x15,R2
(0247) #endif
(0248)
(0249) SendChar('>'); //通知PC机,BOOT下载准备就绪
0F1E E30E LDI R16,0x3E
0F1F DFD2 RCALL _SendChar
(0250) delay(); //延时等待PC机响应
0F20 DFD5 RCALL _delay
(0251) BootFlag=UDR;
0F21 B16C IN R22,0x0C
(0252) if (BootFlag == '<')
0F22 336C CPI R22,0x3C
0F23 F4F9 BNE 0x0F43
(0253) {
(0254) SendChar(ChipType); //芯片版本信息
0F24 E300 LDI R16,0x30
0F25 DFCC RCALL _SendChar
(0255) SendChar(BootSize);
0F26 E603 LDI R16,0x63
0F27 DFCA RCALL _SendChar
(0256) SendChar(BootVer);
0F28 E607 LDI R16,0x67
0F29 DFC8 RCALL _SendChar
0F2A C017 RJMP 0x0F42
(0257) while (1)
(0258) {
(0259) switch (RecChar())
0F2B DFC2 RCALL _RecChar
0F2C 2EC0 MOV R12,R16
0F2D 24DD CLR R13
0F2E 01C6 MOVW R24,R12
0F2F 3485 CPI R24,0x45
0F30 E0E0 LDI R30,0
0F31 079E CPC R25,R30
0F32 F061 BEQ 0x0F3F
0F33 3485 CPI R24,0x45
0F34 E0E0 LDI R30,0
0F35 079E CPC R25,R30
0F36 F05C BLT 0x0F42
0F37 01C6 MOVW R24,R12
0F38 3587 CPI R24,0x57
0F39 E0E0 LDI R30,0
0F3A 079E CPC R25,R30
0F3B F009 BEQ 0x0F3D
0F3C C005 RJMP 0x0F42
(0260) {
(0261) case 'W': FlashLoad();
0F3D DEF9 RCALL _FlashLoad
(0262) break;
0F3E C003 RJMP 0x0F42
(0263) case 'E': {
(0264) SendChar('E'); //通知PC机,进入运用程序区
0F3F E405 LDI R16,0x45
0F40 DFB1 RCALL _SendChar
(0265) ExecCode();
0F41 DFBE RCALL _ExecCode
0F42 CFE8 RJMP 0x0F2B
(0266) } break;
(0267) default : break;
(0268) }
(0269) }
(0270) }
(0271) SendChar('E');
0F43 E405 LDI R16,0x45
0F44 DFAD RCALL _SendChar
(0272)
(0273) TempInt = read_program_memory(0,0);//pei
0F45 2722 CLR R18
0F46 2700 CLR R16
0F47 2711 CLR R17
0F48 D020 RCALL _read_program_memory
0F49 0158 MOVW R10,R16
(0274) if (TempInt==0xFFFF) goto STARTBOOT;
0F4A 3F0F CPI R16,0xFF
0F4B EFEF LDI R30,0xFF
0F4C 071E CPC R17,R30
0F4D F409 BNE 0x0F4F
0F4E CFCB RJMP 0x0F1A
(0275) else{ iTry--;
0F4F 954A DEC R20
(0276) if (iTry>0) goto STARTBOOT;}
0F50 2422 CLR R2
0F51 1624 CP R2,R20
0F52 F408 BCC 0x0F54
0F53 CFC6 RJMP 0x0F1A
(0277)
(0278) ExecCode();//执行用户区程序
0F54 DFAB RCALL _ExecCode
0F55 9508 RET
FILE: D:\IccAvr\Pei\BootLoad_Pei\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:
0F56 D01F RCALL 0x0F76
(0009) movw r30, r16 ;move address to z pointer (R31 = ZH, R30 = ZL)
0F57 01F8 MOVW R30,R16
(0010) STS SPMCR, R18 ;argument 2 decides function
0F58 93200057 STS 0x57,R18
(0011) SPM ;perform pagewrite
0F5A 95E8 SPM
(0012) RET
0F5B 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:
0F5C D019 RCALL 0x0F76
(0020) movw r30, r18 ;move adress to z pointer (R31=ZH R30=ZL)
0F5D 01F9 MOVW R30,R18
(0021) movw r0, r16 ;move data to reg 0 and 1
0F5E 0108 MOVW R0,R16
(0022) LDI R19, 0x01
0F5F E031 LDI R19,1
(0023) STS SPMCR, R19
0F60 93300057 STS 0x57,R19
(0024) SPM ;Store program memory
0F62 95E8 SPM
(0025) RET
0F63 9508 RET
(0026)
(0027) ;-----------------------------------------
(0028)
(0029) ;unsigned char read_flash(unsigned int add);
(0030) _read_flash::
(0031) mov r31,r17
_read_flash:
0F64 2FF1 MOV R31,R17
(0032) mov r30,r16
0F65 2FE0 MOV R30,R16
(0033) lpm r16,z
0F66 9104 LPM R16,0(Z)
(0034) clr r17
0F67 2711 CLR R17
(0035) ret
0F68 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:
0F69 01F8 MOVW R30,R16
(0040) SBRC R18, 0 ;read lockbits? (second argument = 0x09)
0F6A FD20 SBRC R18,0
(0041) STS SPMCR, R18 ;if so, place second argument in SPMEN register
0F6B 93200057 STS 0x57,R18
(0042) LPM r16, Z+
0F6D 9105 LPM R16,Z+
(0043) LPM r17, Z
0F6E 9114 LPM R17,0(Z)
(0044) RET
0F6F 9508 RET
(0045)
(0046) ;-----------------------------------------
(0047)
(0048) _enableRWW::
(0049) XCALL __WAIT_SPMEN__
_enableRWW:
0F70 D005 RCALL 0x0F76
(0050) LDI R27,0x11
0F71 E1B1 LDI R27,0x11
(0051) STS SPMCR,R27
0F72 93B00057 STS 0x57,R27
(0052) SPM
0F74 95E8 SPM
(0053) RET
0F75 9508 RET
(0054)
(0055) ;-----------------------------------------
(0056)
(0057) __WAIT_SPMEN__:
(0058) LDS R27,SPMCR ; load SPMCR to R27
0F76 91B00057 LDS R27,0x57
(0059) SBRC R27,0 ; check SPMEN flag
0F78 FDB0 SBRC R27,0
(0060) RJMP __WAIT_SPMEN__ ; wait for SPMEN flag cleared
0F79 CFFC RJMP 0x0F76
(0061) RET
FILE: <library>
0F7A 9508 RET
pop_gset2:
0F7B E0E2 LDI R30,2
0F7C C010 RJMP pop
pop_gset3:
0F7D E0E4 LDI R30,4
0F7E C00E RJMP pop
pop_gset4:
0F7F E0E8 LDI R30,0x8
0F80 C00C RJMP pop
push_gset5:
0F81 92FA ST R15,-Y
0F82 92EA ST R14,-Y
push_gset4:
0F83 92DA ST R13,-Y
0F84 92CA ST R12,-Y
push_gset3:
0F85 92BA ST R11,-Y
0F86 92AA ST R10,-Y
push_gset2:
0F87 937A ST R23,-Y
0F88 936A ST R22,-Y
push_gset1:
0F89 935A ST R21,-Y
0F8A 934A ST R20,-Y
0F8B 9508 RET
pop_gset1:
0F8C E0E1 LDI R30,1
pop:
0F8D 9149 LD R20,Y+
0F8E 9159 LD R21,Y+
0F8F FDE0 SBRC R30,0
0F90 9508 RET
0F91 9169 LD R22,Y+
0F92 9179 LD R23,Y+
0F93 FDE1 SBRC R30,1
0F94 9508 RET
0F95 90A9 LD R10,Y+
0F96 90B9 LD R11,Y+
0F97 FDE2 SBRC R30,2
0F98 9508 RET
0F99 90C9 LD R12,Y+
0F9A 90D9 LD R13,Y+
0F9B FDE3 SBRC R30,3
0F9C 9508 RET
0F9D 90E9 LD R14,Y+
0F9E 90F9 LD R15,Y+
0F9F 9508 RET
lsl16:
0FA0 2322 TST R18
0FA1 F021 BEQ 0x0FA6
0FA2 0F00 LSL R16
0FA3 1F11 ROL R17
0FA4 952A DEC R18
0FA5 CFFA RJMP lsl16
0FA6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -