⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atemga128iap.s

📁 atmega128在线升级程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -