📄 main.s
字号:
; unsigned char i;
; unsigned int TempInt;
; unsigned int TempInt2;
;
; for (i=0;i<PageByte;i+=2)
clr R20
rjmp L29
L26:
.dbline 183
; {
.dbline 184
; TempInt = read_program_memory(PageAddress + i,0x00);
clr R18
mov R2,R20
clr R3
lds R16,_PageAddress
lds R17,_PageAddress+1
add R16,R2
adc R17,R3
rcall _read_program_memory
movw R10,R16
.dbline 185
; TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
ldi R24,<_PageBuffer+1
ldi R25,>_PageBuffer+1
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R12,z+0
clr R13
add R12,R2
adc R13,R3
.dbline 186
; if (TempInt != TempInt2) return 0;
cp R16,R12
cpc R17,R13
breq L31
X8:
.dbline 186
clr R16
rjmp L25
L31:
.dbline 187
; }
L27:
.dbline 182
subi R20,254 ; addi 2
L29:
.dbline 182
cpi R20,64
brlo L26
X9:
.dbline 188
; return 1;
ldi R16,1
.dbline -2
L25:
.dbline 0 ; func end
rjmp pop_xgset303C
.dbsym r TempInt2 12 i
.dbsym r TempInt 10 i
.dbsym r i 20 c
.dbend
.dbfunc e RecChar _RecChar fc
.even
_RecChar::
.dbline -1
.dbline 194
; }
;
; /*****************************************************************************/
; /* 字符输入函数 */
; unsigned char RecChar(void)
; {
L34:
.dbline 195
; while(!(UCSRA & 0x80));
L35:
.dbline 195
sbis 0xb,7
rjmp L34
X10:
.dbline 196
; return UDR;
in R16,0xc
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SendChar _SendChar fV
; c -> R16
.even
_SendChar::
.dbline -1
.dbline 200
; }
; /*****************************************************************************/
; void SendChar(unsigned char c)
; {
L38:
.dbline 201
; while (!(UCSRA&(1<<UDRE)));
L39:
.dbline 201
sbis 0xb,5
rjmp L38
X11:
.dbline 202
; UDR=c;
out 0xc,R16
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e delay _delay fV
; i -> R16,R17
.even
_delay::
.dbline -1
.dbline 205
; }
; void delay(void)
; {
.dbline 207
; unsigned int i;
; for (i=0;i<65530;i++);
clr R16
clr R17
rjmp L45
L42:
.dbline 207
L43:
.dbline 207
subi R16,255 ; offset = 1
sbci R17,255
L45:
.dbline 207
ldi R24,250
ldi R25,255
ldi R26,0
ldi R27,0
movw R2,R16
clr R4
clr R5
cp R2,R24
cpc R3,R25
cpc R4,R26
cpc R5,R27
brlt L42
X12:
.dbline -2
L41:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e ExecCode _ExecCode fV
.even
_ExecCode::
.dbline -1
.dbline 212
; }
;
; /*****************************************************************************/
; void ExecCode(void)
; {
.dbline 213
; GICR=0X01; //中断向量表移位允许
ldi R24,1
out 0x3b,R24
.dbline 214
; GICR=0X00; //中断向量指向应用程序区
clr R2
out 0x3b,R2
.dbline 215
; asm("jmp 0x0000");
jmp 0x0000
.dbline -2
L46:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; iTry -> R20
; TempInt -> R22,R23
; BootFlag -> R22
.even
_main::
.dbline -1
.dbline 218
; }
; void main(void)
; {
.dbline 222
; unsigned char BootFlag;
; unsigned int TempInt;
; char iTry;
; CLI();
cli
.dbline 229
; #ifdef InteClk //如果使用内部时钟,读取时钟校准值
; OSCCAL=read_flash(OscAddress);
; #endif
;
; #ifdef W0
; //pei 拷贝W0的PortInit
; PORTB = 0x0F;//rfslp,fs123=1
ldi R24,15
out 0x18,R24
.dbline 230
; DDRB = 0xFF;//bit1=output
ldi R24,255
out 0x17,R24
.dbline 231
; PORTC = 0x21;//0x20;//rfrst=1,not reset!
ldi R24,33
out 0x15,R24
.dbline 232
; DDRC = 0x7F;
ldi R24,127
out 0x14,R24
.dbline 233
; PORTD = 0x0C;
ldi R24,12
out 0x12,R24
.dbline 234
; DDRD = 0xF0;
ldi R24,240
out 0x11,R24
.dbline 238
; #else
; #endif
;
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8位数据+1位停止
ldi R24,134
out 0x20,R24
.dbline 239
; UCSRB = (1<<RXEN)|(1<<TXEN); //允许串口发送和接收
ldi R24,24
out 0xa,R24
.dbline 240
; UBRR = BAU;
ldi R24,51
out 0x9,R24
.dbline 242
;
; iTry=20;
ldi R20,20
L48:
.dbline 245
; STARTBOOT://pei未下载程序时重复等待
; #ifdef W0
; PORTC=PORTC^0x03;//指示灯闪烁
ldi R24,3
in R2,0x15
eor R2,R24
out 0x15,R2
.dbline 247
; #endif
; delay(); //延时等待PC机响应
rcall _delay
.dbline 248
; SendChar('>'); //通知PC机,BOOT下载准备就绪
ldi R16,62
rcall _SendChar
.dbline 249
; delay(); //延时等待PC机响应
rcall _delay
.dbline 250
; BootFlag=UDR;
in R22,0xc
.dbline 252
;
; if (BootFlag == '<')
cpi R22,60
brne L49
X13:
.dbline 253
; {
.dbline 254
; SendChar(ChipType); //芯片版本信息
ldi R16,48
rcall _SendChar
.dbline 255
; SendChar(BootSize);
ldi R16,99
rcall _SendChar
.dbline 256
; SendChar(BootVer);
ldi R16,103
rcall _SendChar
rjmp L52
L51:
.dbline 258
; while (1)
; {
.dbline 259
; switch (RecChar())
rcall _RecChar
mov R22,R16
clr R23
cpi R22,69
ldi R30,0
cpc R23,R30
breq L58
X14:
cpi R22,69
ldi R30,0
cpc R23,R30
brlt L55
X15:
L59:
cpi R22,87
ldi R30,0
cpc R23,R30
breq L57
X16:
rjmp L55
L57:
.dbline 261
; {
; case 'W': FlashLoad();
rcall _FlashLoad
.dbline 262
; break;
rjmp L55
L58:
.dbline 263
; case 'E': {
.dbline 264
; SendChar('E'); //通知PC机,进入运用程序区
ldi R16,69
rcall _SendChar
.dbline 265
; ExecCode();
rcall _ExecCode
.dbline 266
; } break;
.dbline 266
.dbline 267
; default : break;
L55:
.dbline 269
; }
; }
L52:
.dbline 257
rjmp L51
L49:
.dbline 271
; }
; SendChar('E');
ldi R16,69
rcall _SendChar
.dbline 273
;
; TempInt = read_program_memory(0,0);//pei
clr R18
clr R16
clr R17
rcall _read_program_memory
movw R22,R16
.dbline 274
; if (TempInt==0xFFFF) goto STARTBOOT;
cpi R16,255
ldi R30,255
cpc R17,R30
brne L60
X17:
.dbline 274
rjmp L48
L60:
.dbline 275
; else{ iTry--;
.dbline 275
dec R20
.dbline 276
; if (iTry>0) goto STARTBOOT;}
ldi R24,0
cp R24,R20
brsh L62
X18:
.dbline 276
rjmp L48
L62:
.dbline 276
.dbline 277
; SEI();
sei
.dbline 278
; ExecCode();//执行用户区程序
rcall _ExecCode
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbsym r iTry 20 c
.dbsym r TempInt 22 i
.dbsym r BootFlag 22 c
.dbend
.area bss(ram, con, rel)
.dbfile F:\AVR常用函数\BootLooderMage8\BootLoad_8M\main.c
_PageAddress::
.blkb 2
.dbsym e PageAddress _PageAddress i
_PageBuffer::
.blkb 64
.dbsym e PageBuffer _PageBuffer A[64:64]c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -