📄 avr-bootloader.s
字号:
xjmp pop_xgset300C
.dbsym r i 20 c
.dbsym r crc 10 I
.dbsym r count 18 I
.dbsym r ptr 16 pc
.dbend
.dbfunc e quit _quit fV
.even
_quit::
.dbline -1
.dbline 123
; }
; //退出Bootloader程序,从0x0000处执行应用程序
; void quit(void)
; {
.dbline 124
; uart_putchar('O');uart_putchar('K');uart_putchar('?');
ldi R16,79
xcall _uart_putchar
.dbline 124
ldi R16,75
xcall _uart_putchar
.dbline 124
ldi R16,63
xcall _uart_putchar
.dbline 125
; uart_putchar(0x0d);uart_putchar(0x0a);
ldi R16,13
xcall _uart_putchar
.dbline 125
ldi R16,10
xcall _uart_putchar
L39:
.dbline 126
; while(!(UCSR0A&0x20));
L40:
.dbline 126
sbis 0xb,5
rjmp L39
X10:
.dbline 127
; MCUCR=0x01;
ldi R24,1
out 0x35,R24
.dbline 128
; MCUCR=0x00;
clr R2
out 0x35,R2
.dbline 129
; RAMPZ=0x00;
out 0x3b,R2
.dbline 130
; asm("jmp 0x0000\n");
jmp 0x0000
.dbline -2
L38:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; timercount -> R12
; crc -> R10,R11
; packNO -> R22
; i -> R10,R11
; bufferPoint -> R20,R21
.even
_main::
.dbline -1
.dbline 135
; }
;
; //主程序
; void main(void)
; {
.dbline 136
; int i=0;
clr R10
clr R11
.dbline 137
; unsigned char timercount=0;
clr R12
.dbline 138
; unsigned char packNO=1;
ldi R22,1
.dbline 139
; int bufferPoint=0;
clr R20
clr R21
.dbline 142
; unsigned int crc;
; //初始化M128的USART0
; UBRR0H=BAUD_H;
clr R2
sts 144,R2
.dbline 143
; UBRR0L=BAUD_L;
ldi R24,23
out 0x9,R24
.dbline 144
; UCSR0B=0x18;
ldi R24,24
out 0xa,R24
.dbline 145
; UCSR0C=0x0E;
ldi R24,14
sts 149,R24
.dbline 146
; OCR0=0xEA;
ldi R24,234
out 0x31,R24
.dbline 148
; //////////
; MCUCR = 0x00;
out 0x35,R2
.dbline 149
; EICRA = 0x00; //extended ext ints
sts 106,R2
.dbline 150
; EICRB = 0x00; //extended ext ints
out 0x3a,R2
.dbline 151
; EIMSK = 0x00;
out 0x39,R2
.dbline 152
; TIMSK = 0x00; //timer interrupt sources
out 0x37,R2
.dbline 153
; ETIMSK = 0x00; //extended timer interrupt sources
sts 125,R2
.dbline 155
;
; TCCR0 = 0x00; //stop
out 0x33,R2
.dbline 156
; ASSR = 0x00; //set async mode
out 0x30,R2
.dbline 157
; TCNT0 = 0x29; //set count
ldi R24,41
out 0x32,R24
.dbline 158
; OCR0 = 0xD7;
ldi R24,215
out 0x31,R24
xjmp L44
L43:
.dbline 162
; //TCCR0 = 0x07; //start timer
; ///////////
; while(startupString[i]!='\0')
; {
.dbline 163
; uart_putchar(startupString[i]);
ldi R24,<_startupString
ldi R25,>_startupString
movw R30,R10
add R30,R24
adc R31,R25
elpm R16,Z
xcall _uart_putchar
.dbline 164
; i++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 165
; }
L44:
.dbline 161
ldi R24,<_startupString
ldi R25,>_startupString
movw R30,R10
add R30,R24
adc R31,R25
elpm R2,Z
tst R2
brne L43
X11:
.dbline 166
; TCCR0 = 0x07; //start timer
ldi R24,7
out 0x33,R24
xjmp L47
L46:
.dbline 169
; //////3秒等待PC机发'd',否则退出Bootloader程序,从0x0000处执行应用程序
; while(1)
; {
.dbline 170
; if(uart_getchar()=='d')break;
xcall _uart_getchar
cpi R16,100
ldi R30,0
cpc R17,R30
brne L49
X12:
.dbline 170
xjmp L56
L49:
.dbline 171
; if(TIFR&0x02)
in R2,0x36
sbrs R2,1
rjmp L51
X13:
.dbline 172
; {
.dbline 173
; if(++timercount>200) quit(); //3秒
mov R24,R12
subi R24,255 ; addi 1
mov R12,R24
ldi R24,200
cp R24,R12
brsh L53
X14:
.dbline 173
xcall _quit
L53:
.dbline 176
; // if(++timercount>20) quit(); //1秒 林树亮 2007-6-25改
;
; TCNT0 = 0x29; //set count
ldi R24,41
out 0x32,R24
.dbline 177
; TIFR=TIFR|0x02;
in R24,0x36
ori R24,2
out 0x36,R24
.dbline 178
; }
L51:
.dbline 179
; }
L47:
.dbline 168
xjmp L46
L55:
.dbline 183
;
; ////每秒向PC机发送一个控制字符C,等待控制字
; while(uart_getchar()!=XMODEM_SOH)
; {
.dbline 184
; if(TIFR&0x02)
in R2,0x36
sbrs R2,1
rjmp L58
X15:
.dbline 185
; {
.dbline 186
; if(++timercount>67)
mov R24,R12
subi R24,255 ; addi 1
mov R14,R24
mov R12,R24
ldi R24,67
cp R24,R12
brsh L60
X16:
.dbline 187
; {
.dbline 188
; uart_putchar(XMODEM_RECIEVING_WAIT_CHAR);
ldi R16,67
xcall _uart_putchar
.dbline 189
; timercount=0;
clr R12
.dbline 190
; }
L60:
.dbline 191
; TIFR=TIFR|0x02;
in R24,0x36
ori R24,2
out 0x36,R24
.dbline 192
; }
L58:
.dbline 193
; }
L56:
.dbline 182
xcall _uart_getchar
movw R14,R16
cpi R16,1
ldi R30,0
cpc R17,R30
brne L55
X17:
L62:
.dbline 196
; //////开始接收数据块
; do
; {
.dbline 197
; if((packNO==uart_waitchar())&&(packNO==(~uart_waitchar())))
xcall _uart_waitchar
mov R12,R16
cp R22,R16
breq X25
xjmp L65
X25:
X18:
xcall _uart_waitchar
mov R12,R16
mov R2,R12
com R2
cp R22,R2
breq X26
xjmp L65
X26:
X19:
.dbline 198
; {
.dbline 199
; for(i=0;i<128;i++)
clr R10
clr R11
L67:
.dbline 200
; {
.dbline 201
; data[bufferPoint]=uart_waitchar();
xcall _uart_waitchar
mov R12,R16
ldi R24,<_data
ldi R25,>_data
movw R30,R20
add R30,R24
adc R31,R25
std z+0,R12
.dbline 202
; bufferPoint++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 203
; }
L68:
.dbline 199
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 199
cpi R24,128
ldi R30,0
cpc R25,R30
brlt L67
X20:
.dbline 204
; crc=uart_waitchar()<<8; //修改处
xcall _uart_waitchar
mov R10,R16
mov R2,R10
clr R3
mov R3,R2
clr R2
movw R10,R2
.dbline 205
; crc+=uart_waitchar(); //修改处
xcall _uart_waitchar
mov R12,R16
mov R2,R12
clr R3
add R10,R2
adc R11,R3
.dbline 206
; if(calcrc(&data[bufferPoint-128],128)==crc)
ldi R18,128
ldi R19,0
ldi R24,<_data-128
ldi R25,>_data-128
movw R16,R20
add R16,R24
adc R17,R25
xcall _calcrc
movw R12,R16
cp R16,R10
cpc R17,R11
brne L71
X21:
.dbline 207
; {
xjmp L75
L74:
.dbline 209
; while(bufferPoint>=SPM_PAGESIZE)
; {
.dbline 210
; write_one_page();
xcall _write_one_page
.dbline 211
; address+=SPM_PAGESIZE;
ldi R24,0
ldi R25,1
ldi R26,0
ldi R27,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R24
adc R3,R25
adc R4,R26
adc R5,R27
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 212
; bufferPoint=0;
clr R20
clr R21
.dbline 213
; }
L75:
.dbline 208
cpi R20,0
ldi R30,1
cpc R21,R30
brge L74
X22:
.dbline 214
; uart_putchar(XMODEM_ACK);
ldi R16,6
xcall _uart_putchar
.dbline 215
; packNO++;
inc R22
.dbline 216
; }
xjmp L66
L71:
.dbline 218
; else
; {
.dbline 219
; uart_putchar(XMODEM_NAK);
ldi R16,21
xcall _uart_putchar
.dbline 220
; }
.dbline 221
; }
xjmp L66
L65:
.dbline 223
; else
; {
.dbline 224
; uart_putchar(XMODEM_NAK);
ldi R16,21
xcall _uart_putchar
.dbline 225
; }
L66:
.dbline 226
; }
L63:
.dbline 227
; while(uart_waitchar()!=XMODEM_EOT);
xcall _uart_waitchar
mov R10,R16
cpi R16,4
breq X27
xjmp L62
X27:
X23:
.dbline 228
; uart_putchar(XMODEM_ACK);
ldi R16,6
xcall _uart_putchar
.dbline 229
; if(bufferPoint)
cpi R20,0
cpc R20,R21
breq L77
X24:
.dbline 230
; write_one_page();
xcall _write_one_page
L77:
.dbline 231
; quit();
xcall _quit
.dbline -2
L42:
.dbline 0 ; func end
ret
.dbsym r timercount 12 c
.dbsym r crc 10 i
.dbsym r packNO 22 c
.dbsym r i 10 I
.dbsym r bufferPoint 20 I
.dbend
.area bss(ram, con, rel)
.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
_data::
.blkb 256
.dbsym e data _data A[256:256]c
;
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -