📄 atemga128iap.s
字号:
.dbsym r crc 20 I
.dbsym r count 18 I
.dbsym r ptr 16 pc
.dbend
.dbfunc e quit _quit fV
.even
_quit::
.dbline -1
.dbline 124
; }
; //退出Bootloader程序,从0x0000处执行应用程序
; void quit(void)
; {
.dbline 125
; uart_putchar('O');uart_putchar('K');
ldi R16,79
xcall _uart_putchar
.dbline 125
ldi R16,75
xcall _uart_putchar
.dbline 126
; uart_putchar(0x0d);uart_putchar(0x0a);
ldi R16,13
xcall _uart_putchar
.dbline 126
ldi R16,10
xcall _uart_putchar
L39:
.dbline 127
L40:
.dbline 127
; while(!(UCSR0A & 0x20)); //等待结束提示信息回送完成
sbis 0xb,5
rjmp L39
.dbline 128
; MCUCR = 0x01;
ldi R24,1
out 0x35,R24
.dbline 129
; MCUCR = 0x00; //将中断向量表迁移到应用程序区头部
clr R2
out 0x35,R2
.dbline 130
; RAMPZ = 0x00; //RAMPZ/清零初始化
out 0x3b,R2
.dbline 131
; asm("jmp 0x0000\n"); //跳转到Flash的0x0000处,执行用户的应用程序
jmp 0x0000
.dbline -2
.dbline 132
; }
L38:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; timercount -> y+2
; crc -> R10,R11
; packNO -> R14
; i -> y+0
; bufferPoint -> R12,R13
.even
_main::
sbiw R28,3
.dbline -1
.dbline 135
; //主程序
; void main(void)
; {
.dbline 136
; int i = 0;
clr R0
clr R1
std y+1,R1
std y+0,R0
.dbline 137
; unsigned char timercount = 0;
std y+2,R0
.dbline 138
; unsigned char packNO = 1;
clr R14
inc R14
.dbline 139
; int bufferPoint = 0;
clr R12
clr R13
.dbline 142
; unsigned int crc;
; //初始化M128的USART0
; UBRR0H = BAUD_H;
clr R2
sts 144,R2
.dbline 143
; UBRR0L = BAUD_L; //Set/ baud rate
ldi R24,25
out 0x9,R24
.dbline 144
; UCSR0B = 0x18; //Enable/ Receiver and Transmitter
ldi R24,24
out 0xa,R24
.dbline 145
; UCSR0C = 0x0E; //Set/ frame format: 8data, 2stop bit
ldi R24,14
sts 149,R24
.dbline 147
; //初始化M128的T/C0,15ms自动重载
; OCR0 = 0xEA;
ldi R24,234
out 0x31,R24
.dbline 148
; TCCR0 = 0x0F;
ldi R24,15
out 0x33,R24
xjmp L44
L43:
.dbline 151
.dbline 152
ldi R24,<_startupString
ldi R25,>_startupString
ldd R30,y+0
ldd R31,y+1
add R30,R24
adc R31,R25
elpm R16,Z
xcall _uart_putchar
.dbline 153
ldd R24,y+0
ldd R25,y+1
adiw R24,1
std y+1,R25
std y+0,R24
.dbline 154
L44:
.dbline 150
; //向PC机发送开始提示信息
; while(startupString[i]!='\0')
ldi R24,<_startupString
ldi R25,>_startupString
ldd R30,y+0
ldd R31,y+1
add R30,R24
adc R31,R25
elpm R30,Z
tst R30
brne L43
xjmp L47
L46:
.dbline 157
; {
; uart_putchar(startupString[i]);
; i++;
; }
; //3/秒种等待PC下发"d",否则退出Bootloader程序,从0x0000处执行应用程序
; while(1)
; {
.dbline 158
; if(uart_getchar()== 'd') break;
xcall _uart_getchar
cpi R16,100
ldi R30,0
cpc R17,R30
brne L49
.dbline 158
xjmp L56
L49:
.dbline 159
; if (TIFR & 0x02) //timer0/ over flow
in R2,0x36
sbrs R2,1
rjmp L51
.dbline 160
; {
.dbline 161
; if (++timercount > 200) quit(); //200*15ms/ = 3s
ldd R24,y+2
subi R24,255 ; addi 1
mov R2,R24
std y+2,R2
ldi R24,200
cp R24,R2
brsh L53
.dbline 161
xcall _quit
L53:
.dbline 162
; TIFR = TIFR|0x02;
in R24,0x36
ori R24,2
out 0x36,R24
.dbline 163
; }
L51:
.dbline 164
L47:
.dbline 156
xjmp L46
L55:
.dbline 167
; }
; //每秒向PC机发送一个控制字符"C",等待控制字〈soh〉
; while(uart_getchar()!=XMODEM_SOH) //receive/ the start of Xmodem
; {
.dbline 168
; if(TIFR & 0x02) //timer0/ over flow
in R2,0x36
sbrs R2,1
rjmp L58
.dbline 169
; {
.dbline 170
; if(++timercount > 67) //wait/ about 1 second
ldd R24,y+2
subi R24,255 ; addi 1
mov R2,R24
std y+2,R2
ldi R24,67
cp R24,R2
brsh L60
.dbline 171
; {
.dbline 172
; uart_putchar(XMODEM_RECIEVING_WAIT_CHAR); //send/ a "C"
ldi R16,67
xcall _uart_putchar
.dbline 173
; timercount=0;
clr R0
std y+2,R0
.dbline 174
; }
L60:
.dbline 175
; TIFR=TIFR | 0x02;
in R24,0x36
ori R24,2
out 0x36,R24
.dbline 176
; }
L58:
.dbline 177
L56:
.dbline 166
xcall _uart_getchar
cpi R16,1
ldi R30,0
cpc R17,R30
brne L55
L62:
.dbline 180
; }
; //开始接收数据块
; do
; {
.dbline 181
; if ((packNO == uart_waitchar()) && (packNO ==(~uart_waitchar())))
xcall _uart_waitchar
cp R14,R16
breq X2
xjmp L65
X2:
xcall _uart_waitchar
mov R2,R16
com R2
cp R14,R2
breq X3
xjmp L65
X3:
.dbline 182
; { //核对数据块编号正确
.dbline 183
; for(i=0;i<128;i++) //接收128个字节数据
clr R0
clr R1
std y+1,R1
std y+0,R0
L67:
.dbline 184
.dbline 185
xcall _uart_waitchar
ldi R24,<_data
ldi R25,>_data
movw R30,R12
add R30,R24
adc R31,R25
std z+0,R16
.dbline 186
movw R24,R12
adiw R24,1
movw R12,R24
.dbline 187
L68:
.dbline 183
ldd R24,y+0
ldd R25,y+1
adiw R24,1
std y+1,R25
std y+0,R24
.dbline 183
cpi R24,128
ldi R30,0
cpc R25,R30
brlt L67
.dbline 188
; {
; data[bufferPoint]= uart_waitchar();
; bufferPoint++;
; }
; crc = (uart_waitchar()<<8);
xcall _uart_waitchar
mov R10,R16
clr R11
mov R11,R10
clr R10
.dbline 189
; crc += uart_waitchar(); //接收2个字节的CRC效验字
xcall _uart_waitchar
mov R2,R16
clr R3
add R10,R2
adc R11,R3
.dbline 190
; if(calcrc(&data[bufferPoint-128],128)==crc) //CRC/校验验证
ldi R18,128
ldi R19,0
ldi R24,<_data-128
ldi R25,>_data-128
movw R16,R12
add R16,R24
adc R17,R25
xcall _calcrc
cp R16,R10
cpc R17,R11
brne L71
.dbline 191
; { //正确接收128个字节数据
xjmp L75
L74:
.dbline 193
.dbline 194
xcall _write_one_page
.dbline 195
ldi R20,0
ldi R21,1
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 196
clr R12
clr R13
.dbline 197
L75:
.dbline 192
; while(bufferPoint >= SPM_PAGESIZE)
movw R24,R12
cpi R24,0
ldi R30,1
cpc R25,R30
brge L74
.dbline 198
; { //正确接受256个字节的数据
; write_one_page(); //收到256字节写入一页Flash中
; address += SPM_PAGESIZE; //Flash/页加1
; bufferPoint = 0;
; }
; uart_putchar(XMODEM_ACK); //正确收到一个数据块
ldi R16,6
xcall _uart_putchar
.dbline 199
; packNO++; //数据块编号加1
inc R14
.dbline 200
; }
xjmp L66
L71:
.dbline 202
; else
; {
.dbline 203
; uart_putchar(XMODEM_NAK); //要求重发数据块
ldi R16,21
xcall _uart_putchar
.dbline 204
; }
.dbline 205
; }
xjmp L66
L65:
.dbline 207
; else
; {
.dbline 208
; uart_putchar(XMODEM_NAK); //要求重发数据块
ldi R16,21
xcall _uart_putchar
.dbline 209
; }
L66:
.dbline 210
L63:
.dbline 210
; }while(uart_waitchar()!=XMODEM_EOT); //循环接收,直到全部发完
xcall _uart_waitchar
cpi R16,4
breq X4
xjmp L62
X4:
.dbline 211
; uart_putchar(XMODEM_ACK); //通知PC机全部收到
ldi R16,6
xcall _uart_putchar
.dbline 213
;
; if(bufferPoint) write_one_page(); //把剩余的数据写入Flash中
tst R12
brne X1
tst R13
breq L77
X1:
.dbline 213
xcall _write_one_page
L77:
.dbline 214
; quit(); //退出Bootloader程序,从0x0000处执行应用程序
xcall _quit
.dbline -2
.dbline 215
; }
L42:
adiw R28,3
.dbline 0 ; func end
ret
.dbsym l timercount 2 c
.dbsym r crc 10 i
.dbsym r packNO 14 c
.dbsym l i 0 I
.dbsym r bufferPoint 12 I
.dbend
.area bss(ram, con, rel)
.dbfile E:\宇能工作盘\YN3010\IAP\ATEMGA128IAP.C
_data::
.blkb 256
.dbsym e data _data A[256:256]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -