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

📄 avr-bootloader.s

📁 ATMEG128在线升级程序,运行稳定可靠
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module AVR-Bootloader.c
	.area text(rom, con, rel)
	.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
	.area lit(rom, con, rel)
_startupString::
	.byte 'P,'l,'e,'a,'s,'e,32,'p,'r,'e,'s,'s,32,39,'d,39
	.byte 32,'t,'o,32,'b,'o,'o,'t,'l,'o,'a,'d,'e,'r,32,'w
	.byte 'i,'t,'h,'i,'n,32,51,32,'s,'e,'c,'o,'n,'d,'s,33
	.byte 91,'E,'n,'c,'r,'y,'p,'t,'e,'d,33,93,10,13,0,0
	.dbsym e startupString _startupString A[64:64]kc
	.area data(ram, con, rel)
	.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
_address::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
	.dbsym e address _address L
	.area text(rom, con, rel)
	.dbfile E:\项目\程序\Bootloader程序\AVR-Bootloader\AVR-Bootloader.c
	.dbfunc e boot_page_ew _boot_page_ew fV
;           code -> y+4
;      p_address -> y+0
	.even
_boot_page_ew::
	xcall push_arg4
	.dbline -1
	.dbline 27
; #include <iom128v.h>
; #define SPM_PAGESIZE 256
; 
; #define BAUD_H 0x00
; #define BAUD_L 0x17
; #define DATA_BUFFER_SIZE SPM_PAGESIZE
; 
; //定义Xmodem控制字符
; #define XMODEM_NUL 0x00
; #define XMODEM_SOH 0x01
; #define XMODEM_STX 0x02
; #define XMODEM_EOT 0x04
; #define XMODEM_ACK 0x06
; #define XMODEM_NAK 0x15
; #define XMODEM_CAN 0x18
; #define XMODEM_EOF 0x1A
; #define XMODEM_RECIEVING_WAIT_CHAR 'C'
; 
; //定义全局变量
; //const char startupString[]="Type 'd' download,Others run app.\n\r\0";
; const char startupString[]="Please press 'd' to bootloader within 3 seconds![Encrypted!]\n\r\0";
; char data[DATA_BUFFER_SIZE];
; long address=0;
; 
; //擦除(code==0x03)和写入(code==0x05)一个Flash页
; void boot_page_ew(long p_address,char code)
; {
	.dbline 28
;  asm("mov r30,r16\n"
	mov r30,r16
	mov r31,r17
	out 0x3b,r18
	
	.dbline 31
;      "mov r31,r17\n"
; 	 "out 0x3b,r18\n");
;  SPMCSR=code;
	ldd R0,y+4
	sts 104,R0
	.dbline 32
;  asm("spm\n");
	spm
	
	.dbline -2
L1:
	.dbline 0 ; func end
	adiw R28,4
	ret
	.dbsym l code 4 c
	.dbsym l p_address 0 L
	.dbend
	.dbfunc e boot_page_fill _boot_page_fill fV
;           data -> <dead>
;        address -> <dead>
	.even
_boot_page_fill::
	xcall push_arg4
	.dbline -1
	.dbline 36
; }
; //填充Flash缓冲页中的一个字
; void boot_page_fill(unsigned int address,int data)
; {
	.dbline 37
;  asm("mov r30,r16\n"
	mov r30,r16
	mov r31,r17
	mov r0,r18
	mov r1,r19
	
	.dbline 41
;      "mov r31,r17\n"
; 	 "mov r0,r18\n"
; 	 "mov r1,r19\n");
;  SPMCSR=0x01;
	ldi R24,1
	sts 104,R24
	.dbline 42
;  asm("spm\n");
	spm
	
	.dbline -2
L2:
	.dbline 0 ; func end
	adiw R28,4
	ret
	.dbsym l data 2 I
	.dbsym l address 0 i
	.dbend
	.dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
	.even
_wait_page_rw_ok::
	.dbline -1
	.dbline 46
; }
; //等待一个Flash页的写完成
; void wait_page_rw_ok(void)
; {
	xjmp L5
L7:
	.dbline 49
; 	while(SPMCSR&0x40)
; 	{
; 		while(SPMCSR&0x01);
L8:
	.dbline 49
	lds R2,104
	sbrc R2,0
	rjmp L7
X0:
	.dbline 50
; 		SPMCSR=0x11;
	ldi R24,17
	sts 104,R24
	.dbline 51
; 		asm("spm\n");
	spm
	
	.dbline 52
; 	}
L5:
	.dbline 47
	lds R2,104
	sbrc R2,6
	rjmp L8
X1:
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e de_encryptdata _de_encryptdata fc
;        tmpchrL -> R10
;        tmpchrH -> R22
;            chr -> R20
;              i -> R16
	.even
_de_encryptdata::
	xcall push_xgsetF00C
	.dbline -1
	.dbline 56
; }
; ///对BIN文件的数据进行解密
; char de_encryptdata(char i)
; {	
	.dbline 58
; 	char chr,tmpchrH,tmpchrL;
; 	chr=data[i];
	ldi R24,<_data
	ldi R25,>_data
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	ldd R20,z+0
	.dbline 59
; 	tmpchrH=0xf0&chr;
	mov R22,R20
	andi R22,240
	.dbline 60
; 	tmpchrL=0x0f&chr;
	mov R24,R20
	andi R24,15
	mov R10,R24
	.dbline 61
; 	chr=tmpchrH/16+tmpchrL*16;
	ldi R24,16
	mul R24,R10
	mov R20,R22
	swap R20
	andi R20,#0x0F
	add R20,R0
	.dbline 62
; 	return (0xff-0x86^chr);		
	ldi R24,121
	mov R16,R20
	eor R16,R24
	.dbline -2
L10:
	.dbline 0 ; func end
	xjmp pop_xgsetF00C
	.dbsym r tmpchrL 10 c
	.dbsym r tmpchrH 22 c
	.dbsym r chr 20 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e write_one_page _write_one_page fV
;              i -> R20,R21
	.even
_write_one_page::
	st -y,R20
	st -y,R21
	sbiw R28,1
	.dbline -1
	.dbline 66
; }
; //更新一个Flash页的完整处理
; void write_one_page(void)
; {
	.dbline 68
; 	int i;
; 	boot_page_ew(address,0x03);
	ldi R24,3
	std y+0,R24
	lds R18,_address+2
	lds R19,_address+2+1
	lds R16,_address
	lds R17,_address+1
	xcall _boot_page_ew
	.dbline 69
; 	wait_page_rw_ok();
	xcall _wait_page_rw_ok
	.dbline 70
; 	for(i=0;i<SPM_PAGESIZE;i+=2)
	clr R20
	clr R21
L12:
	.dbline 71
; 	{
	.dbline 72
; 		boot_page_fill(i,de_encryptdata(i)+(de_encryptdata(i+1)<<8));
	mov R16,R20
	xcall _de_encryptdata
	mov R4,R16
	mov R16,R20
	subi R16,255  ; offset = 1
	sbci R17,255
	push R4
	xcall _de_encryptdata
	pop R4
	mov R2,R16
	clr R3
	mov R3,R2
	clr R2
	mov R18,R4
	clr R19
	add R18,R2
	adc R19,R3
	movw R16,R20
	xcall _boot_page_fill
	.dbline 73
; 	} 
L13:
	.dbline 70
	subi R20,254  ; offset = 2
	sbci R21,255
	.dbline 70
	cpi R20,0
	ldi R30,1
	cpc R21,R30
	brlt L12
X2:
	.dbline 74
; 	boot_page_ew(address,0x05);
	ldi R24,5
	std y+0,R24
	lds R18,_address+2
	lds R19,_address+2+1
	lds R16,_address
	lds R17,_address+1
	xcall _boot_page_ew
	.dbline 75
; 	wait_page_rw_ok();
	xcall _wait_page_rw_ok
	.dbline -2
L11:
	.dbline 0 ; func end
	adiw R28,1
	ld R21,y+
	ld R20,y+
	ret
	.dbsym r i 20 I
	.dbend
	.dbfunc e uart_putchar _uart_putchar fV
;              c -> R16
	.even
_uart_putchar::
	.dbline -1
	.dbline 79
; }
; //从RS232发送1个字节
; void uart_putchar(char c)
; {
L17:
	.dbline 80
; 	while(!(UCSR0A&0x20));
L18:
	.dbline 80
	sbis 0xb,5
	rjmp L17
X3:
	.dbline 81
; 	UDR0=c;
	out 0xc,R16
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc e uart_getchar _uart_getchar fI
;         status -> R18
;            res -> R16
	.even
_uart_getchar::
	.dbline -1
	.dbline 85
; }
; //从RS232接收1个字节
; int uart_getchar(void)
; {
	.dbline 87
; 	unsigned char status,res;
; 	if(!(UCSR0A&0x80)) return -1;
	sbic 0xb,7
	rjmp L21
X4:
	.dbline 87
	ldi R16,-1
	ldi R17,-1
	xjmp L20
L21:
	.dbline 88
; 	status=UCSR0A;
	in R18,0xb
	.dbline 89
; 	res=UDR0;
	in R16,0xc
	.dbline 90
; 	res=res;
	.dbline 91
; 	if(status&0x1c) return -1;
	mov R24,R18
	andi R24,28
	breq L23
X5:
	.dbline 91
	ldi R16,-1
	ldi R17,-1
	xjmp L20
L23:
	.dbline 92
; 	return res;
	clr R17
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbsym r status 18 c
	.dbsym r res 16 c
	.dbend
	.dbfunc e uart_waitchar _uart_waitchar fc
;              c -> R10,R11
	.even
_uart_waitchar::
	st -y,R10
	st -y,R11
	.dbline -1
	.dbline 96
; }
; //等待从RS232接收1个有效字节
; char uart_waitchar(void)
; {
L26:
	.dbline 98
; 	int c;
; 	while((c=uart_getchar())==-1);
L27:
	.dbline 98
	xcall _uart_getchar
	movw R10,R16
	cpi R16,255
	ldi R30,255
	cpc R17,R30
	breq L26
X6:
	.dbline 99
; 	return (char)c;
	.dbline -2
L25:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ret
	.dbsym r c 10 I
	.dbend
	.dbfunc e calcrc _calcrc fI
;              i -> R20
;            crc -> R10,R11
;          count -> R18,R19
;            ptr -> R16,R17
	.even
_calcrc::
	xcall push_xgset300C
	.dbline -1
	.dbline 103
; }
; //计算CRC
; int calcrc(char *ptr,int count)
; {
	.dbline 104
; 	int crc=0;
	clr R10
	clr R11
	xjmp L31
L30:
	.dbline 107
; 	char i;
; 	while(--count>=0)
; 	{
	.dbline 108
; 		crc=crc^(int)*ptr++<<8;
	movw R30,R16
	ld R2,Z+
	movw R16,R30
	clr R3
	mov R3,R2
	clr R2
	eor R10,R2
	eor R11,R3
	.dbline 109
; 		i=8;
	ldi R20,8
L33:
	.dbline 111
; 		do
; 		{
	.dbline 112
; 			if(crc&0x8000)
	sbrs R11,7
	rjmp L36
X7:
	.dbline 113
; 				crc=crc<<1^0x1021;
	ldi R24,4129
	ldi R25,16
	movw R2,R10
	lsl R2
	rol R3
	eor R2,R24
	eor R3,R25
	movw R10,R2
	xjmp L37
L36:
	.dbline 115
; 			else
; 				crc=crc<<1;
	lsl R10
	rol R11
L37:
	.dbline 116
; 		}
L34:
	.dbline 117
; 		while(--i);
	mov R24,R20
	subi R24,1
	mov R20,R24
	tst R20
	brne L33
X8:
	.dbline 118
; 	}
L31:
	.dbline 106
	movw R24,R18
	sbiw R24,1
	movw R18,R24
	cpi R18,0
	ldi R30,0
	cpc R19,R30
	brge L30
X9:
	.dbline 119
; 	return (crc);
	movw R16,R10
	.dbline -2
L29:
	.dbline 0 ; func end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -