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

📄 main.s.bak.bak

📁 AVR16源代码 ICC编译器
💻 BAK
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area data(ram, con, rel)
_bPiont::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.c
	.dbsym e bPiont _bPiont i
_address::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.c
	.dbsym e address _address l
	.area text(rom, con, rel)
	.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.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 43
; #include	<iom128v.h>
; #include	"Eeprom128.h"
; #include	"Rtc8025.h"
; #include	"Uart.h"
; #include	"Crc.h"
; 
; #define		BOOT_TEST	0
; 
; //============================================================
; //无线错误下载设置错误代码定义
; #define		ERR_CONNECT	0x10//表示握手信号接收不对;
; #define		ERR_COMMANDCRC	0x11//表示接收命令校验错误;
; #define		ERR_DATACRC	0x12//表示接收数据不正确,要求丛发数据;
; #define		ERR_OVERTIME	0x13//表示接收数据超时;
; #define		ERR_NOCOMMAND	0x14//没有该指令;
; #define		ERR_SETTING	0x15//设置参数失败;
; #define		ERR_READTIME	0x16//读取系统时钟失败;
; 
; //============================================================
; //定义写Flash一页的长度,同时声明数据Buffer
; #define   	SPM_PAGESIZE 	256
; unsigned char	SendData[100];       
; unsigned char 	SendBuf[100];
; unsigned char 	ReceiveBuf[150];
; unsigned char 	data[SPM_PAGESIZE];
; 
; //============================================================ 
; //定义接收数据的起点和写FLASH的起始地址
; unsigned int 	bPiont = 0;
; unsigned long 	address= 0x0000;
; 
; //============================================================
; //函	数:void boot_page_ew(long p_address,char code) 
; //功	能:读写FLASH数据
; //入口参数:地址,命令字03擦除,05写入
; //返 回 值:无
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================ 
; void boot_page_ew(long p_address,char code) 
; { 
	.dbline 44
;     	asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	out 0x3b,r18
	
	.dbline 47
;         "mov r31,r17\n" 
;         "out 0x3b,r18\n");            	//将页地址放入Z寄存器和RAMPZ的Bit0中 
;     	SPMCSR = code;                	//寄存器SPMCSR中为操作码 
	ldd R0,y+4
	sts 104,R0
	.dbline 48
;     	asm("spm\n");                   //对指定Flash页进行操作 
	spm
	
	.dbline -2
L1:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l code 4 c
	.dbsym l p_address 0 L
	.dbend
	.dbfunc e boot_page_fill _boot_page_fill fV
;           data -> R18,R19
;        address -> R16,R17
	.even
_boot_page_fill::
	.dbline -1
	.dbline 61
; } 
; //============================================================
; //函	数:void boot_page_fill(unsigned int address,int data) 
; //功	能:填充Flash缓冲页中的一个字 
; //入口参数:地址和数据
; //返 回 值:无
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================        
; void boot_page_fill(unsigned int address,int data) 
; { 
	.dbline 62
;     	asm("mov r30,r16\n" 
	mov r30,r16
	mov r31,r17
	mov r0,r18
	mov r1,r19
	
	.dbline 66
;         "mov r31,r17\n"             //Z寄存器中为填冲页内地址 
;         "mov r0,r18\n" 
;         "mov r1,r19\n");            //R0R1中为一个指令字 
;     	SPMCSR = 0x01; 
	ldi R24,1
	sts 104,R24
	.dbline 67
;    	asm("spm\n"); 
	spm
	
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r data 18 I
	.dbsym r address 16 i
	.dbend
	.dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
	.even
_wait_page_rw_ok::
	.dbline -1
	.dbline 80
; } 
; //============================================================
; //函	数:void wait_page_rw_ok(void)
; //功	能:等待一个Flash页的写完成
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void wait_page_rw_ok(void) 
; { 
	xjmp L5
X0:
	.dbline 82
;       	while(SPMCSR & 0x40) 
;      	{ 
L7:
	.dbline 83
L8:
	.dbline 83
	lds R2,104
	sbrc R2,0
	rjmp L7
	.dbline 84
	ldi R24,17
	sts 104,R24
	.dbline 85
	spm
	
	.dbline 86
L5:
	.dbline 81
	lds R2,104
	sbrc R2,6
	rjmp L8
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e write_one_page _write_one_page fV
;              i -> R20,R21
	.even
_write_one_page::
	xcall push_gset1
	sbiw R28,1
	.dbline -1
	.dbline 99
;          	while(SPMCSR & 0x01); 
;          	SPMCSR = 0x11; 
;          	asm("spm\n"); 
;      	} 
; } 
; //============================================================
; //函	数:void write_one_page(void)
; //功	能:一页处理完成
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void write_one_page(void) 
; { 
	.dbline 101
;     	int 	i; 
;     	boot_page_ew(address,0x03);                 //擦除一个Flash页 
	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 102
;     	wait_page_rw_ok();                          //等待擦除完成 
	xcall _wait_page_rw_ok
	.dbline 103
;     	for(i = 0;i < SPM_PAGESIZE;i += 2)                //将数据填入Flash缓冲页中 
	clr R20
	clr R21
L11:
	.dbline 104
	.dbline 105
	ldi R24,<_data+1
	ldi R25,>_data+1
	movw R30,R20
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R3,R2
	clr R2
	ldi R24,<_data
	ldi R25,>_data
	movw R30,R20
	add R30,R24
	adc R31,R25
	ldd R18,z+0
	clr R19
	add R18,R2
	adc R19,R3
	movw R16,R20
	xcall _boot_page_fill
	.dbline 106
L12:
	.dbline 103
	subi R20,254  ; offset = 2
	sbci R21,255
	.dbline 103
	cpi R20,0
	ldi R30,1
	cpc R21,R30
	brlt L11
	.dbline 107
;     	{ 
;         	boot_page_fill(i, data[i]+(data[i+1]<<8)); 
;     	} 
;     	boot_page_ew(address,0x05);                  //将缓冲页数据写入一个Flash页 
	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 108
;     	wait_page_rw_ok();                           //等待写入完成 
	xcall _wait_page_rw_ok
	.dbline -2
L10:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbend
	.dbfunc e quit _quit fV
	.even
_quit::
	.dbline -1
	.dbline 122
; }  
; 
; //============================================================
; //函	数:void quit(void)
; //功	能:跳转程序运行
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void quit(void)
; {
	.dbline 123
; 	MCUCR = 0x01;
	ldi R24,1
	out 0x35,R24
	.dbline 124
; 	MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 125
; 	RAMPZ = 0x00;
	out 0x3b,R2
	.dbline 126
; 	asm("jmp 0x0000\n");
	jmp 0x0000
	
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Flow_Control _Flow_Control fc
;      CRC_Value -> R10,R11
;      Wrong_Cnt -> R12
;        Rec_Len -> R14
;         bPiont -> y+4
	.even
_Flow_Control::
	xcall push_gset5
	sbiw R28,6
	.dbline -1
	.dbline 140
; }
; 
; //============================================================
; //函	数:unsigned char Flow_Control(void)
; //功	能:下载函数控制
; //入口参数:ReceiveBuf接收数据,data写入Flash数据
; //返 回 值:0成功,否则失败
; //设 计 者:陈祖安 
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Flow_Control(void)
; {
	.dbline 141
; 	int		bPiont = 0;
	clr R0
	clr R1
	std y+5,R1
	std y+4,R0
	.dbline 143
; 	unsigned char 	Rec_Len;  
; 	unsigned char 	Wrong_Cnt = 0;
	clr R12
	xjmp L19
L18:
	.dbline 147
; 	unsigned short 	CRC_Value;
; 	    	
; 	while(Wrong_Cnt < 3)
; 	{
	.dbline 148
; 		Rec_Len = Uart_Receive_Frame(ReceiveBuf, 10);
	ldi R18,10
	ldi R19,0
	ldi R16,<_ReceiveBuf
	ldi R17,>_ReceiveBuf
	xcall _Uart_Receive_Frame
	mov R14,R16
	.dbline 149
; 		if(Rec_Len)//收到数据吗?没有等待数据	    
	tst R16
	brne X4
	xjmp L21
X4:
	.dbline 150
; 	 	{  
	.dbline 151
; 	 		if((ReceiveBuf[3] == 'E')&&(ReceiveBuf[4] == 'N')&&(ReceiveBuf[5] == 'D'))
	lds R24,_ReceiveBuf+3
	cpi R24,69
	brne L23
	lds R24,_ReceiveBuf+4
	cpi R24,78
	brne L23
	lds R24,_ReceiveBuf+5
	cpi R24,68
	brne L23
	.dbline 152
; 	      		{
	.dbline 153
; 	       			break;		//如果收到END终止
	xjmp L20
L23:
	.dbline 156
; 	       		}
;         		else
; 			{  
	.dbline 157
; 				CRC_Value = Verify_Command(ReceiveBuf,Rec_Len);
	mov R18,R14
	clr R19
	ldi R16,<_ReceiveBuf
	ldi R17,>_ReceiveBuf
	xcall _Verify_Command
	mov R10,R16
	clr R11
	.dbline 158
; 		          	if(CRC_Value == 0)
	tst R10
	breq X5
	xjmp L28
X5:
	tst R11
	breq X6
	xjmp L28
X6:
X1:
	.dbline 159
; 		            	{
	.dbline 160
; 		            		if(bPiont == 0)
	ldd R0,y+4
	ldd R1,y+5
	tst R0
	brne L30
	tst R1
	brne L30
X2:
	.dbline 161
; 		            		{
	.dbline 162
; 		            			for(bPiont = 0; bPiont < 128; bPiont ++)
	clr R0
	clr R1
	std y+5,R1
	std y+4,R0
L32:
	.dbline 163
	ldi R24,<_ReceiveBuf+5
	ldi R25,>_ReceiveBuf+5
	ldd R30,y+4
	ldd R31,y+5
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_data
	ldi R25,>_data
	ldd R30,y+4
	ldd R31,y+5
	add R30,R24
	adc R31,R25
	std z+0,R2
L33:
	.dbline 162
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	std y+5,R25
	std y+4,R24
	.dbline 162
	cpi R24,128
	ldi R30,0
	cpc R25,R30
	brlt L32
	.dbline 164
; 				        		data[bPiont] = ReceiveBuf[bPiont+5];
; 		            		}
	xjmp L31
L30:
	.dbline 166
; 		            		else
; 		            		{
	.dbline 167
; 		            			for(bPiont = 128; bPiont < 256; bPiont ++)
	ldi R24,128
	ldi R25,0
	std y+5,R25
	std y+4,R24
L37:
	.dbline 168
	ldi R24,<_ReceiveBuf+5-128
	ldi R25,>_ReceiveBuf+5-128
	ldd R30,y+4
	ldd R31,y+5
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_data
	ldi R25,>_data
	ldd R30,y+4
	ldd R31,y+5
	add R30,R24
	adc R31,R25
	std z+0,R2
L38:
	.dbline 167
	ldd R24,y+4
	ldd R25,y+5
	adiw R24,1
	std y+5,R25
	std y+4,R24
	.dbline 167
	cpi R24,0
	ldi R30,1
	cpc R25,R30
	brlt L37
	.dbline 169
; 				        		data[bPiont] = ReceiveBuf[bPiont-128+5];
; 				        	write_one_page();
	xcall _write_one_page
	.dbline 170
; 				        	address += SPM_PAGESIZE;
	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 171
; 				        	bPiont = 0;
	clr R0
	clr R1
	std y+5,R1
	std y+4,R0
	.dbline 172
; 		            		}
L31:
	.dbline 173
; 		             		PC_Send_Ok(SendData,0x00,SendBuf,0);	//请求下一包命令				
	clr R2
	clr R3
	std y+3,R3
	std y+2,R2
	ldi R24,<_SendBuf
	ldi R25,>_SendBuf
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,<_SendData
	ldi R17,>_SendData
	xcall _PC_Send_Ok
	.dbline 174
; 	          		}
	xjmp L29
L28:
	.dbline 176
;             			else
; 	          		{
	.dbline 177
; 	          			Wrong_Cnt++;
	inc R12
	.dbline 178
; 	          			if(Wrong_Cnt == 3)
	mov R24,R12
	cpi R24,3
	brne L43
	.dbline 179
; 	           				return ERR_OVERTIME;
	ldi R16,19
	xjmp L17
L43:
	.dbline 180
; 	          			PC_Send_Err(ERR_DATACRC,SendBuf);	//接收数据错误,需重发
	ldi R18,<_SendBuf
	ldi R19,>_SendBuf
	ldi R16,18
	xcall _PC_Send_Err
	.dbline 181
; 	          		}
L29:
	.dbline 182
; 	          	}
	.dbline 183
; 		}
L21:
	.dbline 184
L19:
	.dbline 146
	mov R24,R12
	cpi R24,3
	brsh X7
	xjmp L18
X7:
L20:
	.dbline 185
;     	}
; 	if(bPiont)
	ldd R0,y+4
	ldd R1,y+5
	tst R0
	brne X3
	tst R1
	breq L45
X3:
	.dbline 186
; 		write_one_page();
	xcall _write_one_page
L45:
	.dbline 187
; 	PC_Send_Ok(SendData,0x00,SendBuf,0);	//向上位机发送下载成功命令
	clr R2
	clr R3

⌨️ 快捷键说明

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