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

📄 avr-bootloader.s

📁 ATMEG128在线升级程序,运行稳定可靠
💻 S
📖 第 1 页 / 共 2 页
字号:
	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 + -