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

📄 nflash32.s

📁 AVR单片机里的USB通信程序开发源代码,是某人的本科毕业设计,里面附有毕业论文.
💻 S
📖 第 1 页 / 共 2 页
字号:
	sts _Flash_Write_addl,R2
	.dbline 180
; 	Flash_Write_addh= XmtBuff.b[19];
	lds R2,_XmtBuff+19
	sts _Flash_Write_addh,R2
	.dbline 181
;   	WriteResidueVal=(XmtBuff.b[22]<<8)+XmtBuff.b[23];
	lds R2,_XmtBuff+23
	clr R3
	lds R4,_XmtBuff+22
	clr R5
	mov R5,R4
	clr R4
	add R4,R2
	adc R5,R3
	sts _WriteResidueVal+1,R5
	sts _WriteResidueVal,R4
	.dbline -2
	.dbline 182
; }
L9:
	adiw R28,20
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym l Start_add 9 X
	.dbsym l End_add 7 X
	.dbsym l WritePageNum 5 i
	.dbsym l Erase_Count 3 i
	.dbsym r Erase_addh 14 c
	.dbsym r Dest_two_addh 22 c
	.dbsym r Sour_two_addh 10 c
	.dbsym l Dest_addh 19 c
	.dbsym l Sour_addh 18 c
	.dbsym l CopyBack_two_count 16 i
	.dbsym l CopyBack_Count 14 i
	.dbsym l Erase_addl 13 c
	.dbsym r Dest_two_addl 12 c
	.dbsym r Sour_two_addl 20 c
	.dbsym l Dest_addl 12 c
	.dbsym l Sour_addl 11 c
	.dbsym r i 6 i
	.dbfunc s flashWrite _flashWrite fI
;              i -> R20,R21
;       PageBuff -> R16,R17
	.even
_flashWrite::
	rcall push_gset1
	.dbline -1
	.dbline 205
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:写FLASH函数
; **函数输入参数及说明:写入数据
; 
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashWrite(unsigned char * PageBuff)
; {
	.dbline 207
; 	unsigned int i;
; 	if(WriteResidueVal > 0)
	lds R3,_WriteResidueVal+1
	lds R2,_WriteResidueVal
	tst R2
	brne X0
	tst R3
	brne X1
	rjmp L58
X1:
X0:
	.dbline 208
; 	{
	.dbline 209
; 		fWPs;//打开写保护
	SBI 0x12,5
	.dbline 209
	.dbline 210
; 		fCOMMAND = 0x00;//从FRIST部分开始
	clr R2
	sts 40960,R2
	.dbline 211
; 		fCOMMAND = 0x80;//写FLASH命令
	ldi R24,128
	sts 40960,R24
	.dbline 212
; 		fADD = 0x00;//从0列开始
	clr R2
	sts 36864,R2
	.dbline 213
; 		fADD = Flash_Write_addl;//页地址低位
	lds R2,_Flash_Write_addl
	sts 36864,R2
	.dbline 214
; 		fADD = Flash_Write_addh;//页地址高位
	lds R2,_Flash_Write_addh
	sts 36864,R2
	.dbline 216
; 		
; 		for(i=0;i<512;i++)
	clr R20
	clr R21
	rjmp L63
L60:
	.dbline 217
	.dbline 218
	mov R30,R20
	mov R31,R21
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	sts 32768,R2
	.dbline 219
L61:
	.dbline 216
	subi R20,255  ; offset = 1
	sbci R21,255
L63:
	.dbline 216
	cpi R20,0
	ldi R30,2
	cpc R21,R30
	brlo L60
	.dbline 221
; 		{
; 			fDATA = PageBuff[i];//写数据到FLASH指定页里
; 		}
; 		
; 		fCOMMAND = 0x10;
	ldi R24,16
	sts 40960,R24
	.dbline 222
; 		asm("nop \n nop");
	nop 
	 nop
L64:
	.dbline 223
L65:
	.dbline 223
; 		while(!fRB);
	sbis 0x10,4
	rjmp L64
	.dbline 224
; 		fCOMMAND = 0x70;//读状态值命令
	ldi R24,112
	sts 40960,R24
	.dbline 225
; 		i = fDATA;//读状态值
	lds R20,32768
	clr R21
	.dbline 226
; 		D12_COMMAND = 0xf2;//清端点缓冲区
	ldi R24,242
	sts 31745,R24
	.dbline 227
; 		csram;
	sts 0xfc01,R22
	.dbline 227
	.dbline 228
; 		fWPc;//写保护
	CBI 0x12,5
	.dbline 228
	.dbline 230
; 		
; 		WriteResidueVal = WriteResidueVal - 1;
	lds R25,_WriteResidueVal+1
	lds R24,_WriteResidueVal
	sbiw R24,1
	sts _WriteResidueVal+1,R25
	sts _WriteResidueVal,R24
	.dbline 231
; 		if(Flash_Write_addl== 255){
	lds R24,_Flash_Write_addl
	cpi R24,255
	brne L67
	.dbline 231
	.dbline 232
; 			Flash_Write_addl= 0x00;
	clr R2
	sts _Flash_Write_addl,R2
	.dbline 233
; 			Flash_Write_addh++;
	lds R24,_Flash_Write_addh
	subi R24,255	; addi 1
	sts _Flash_Write_addh,R24
	.dbline 234
; 		}else
	rjmp L68
L67:
	.dbline 235
; 			Flash_Write_addl++;
	lds R24,_Flash_Write_addl
	subi R24,255	; addi 1
	sts _Flash_Write_addl,R24
L68:
	.dbline 236
L58:
	.dbline -2
	.dbline 237
; 	}
; }
L57:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r PageBuff 16 pc
	.dbfunc s flashCopyBLack _flashCopyBLack fI
;              i -> R20
; Destination_addl -> R22
; Destination_addh -> R10
;    Source_addl -> R18
;    Source_addh -> R16
	.even
_flashCopyBLack::
	rcall push_gset3
	ldd R10,y+6
	ldd R11,y+7
	ldd R22,y+8
	ldd R23,y+9
	.dbline -1
	.dbline 264
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:FLASH页拷贝命令
; **函数输入参数及说明:
;   Source_addh:源地址高位
;   Source_addl:源地址低位
;   Destination_addh:目的地址高位
;   Destination_addl:目的地址低位
; 
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl)
; {
	.dbline 266
; 	unsigned char i;
; 	fWPs;//打开写保护
	SBI 0x12,5
	.dbline 266
	.dbline 267
; 	fCOMMAND = 0x00;//页拷贝命令
	clr R2
	sts 40960,R2
	.dbline 269
;         /*源地址*/
; 	fADD = 0x00;
	sts 36864,R2
	.dbline 270
; 	fADD = Source_addl;
	sts 36864,R18
	.dbline 271
; 	fADD = Source_addh;
	sts 36864,R16
	.dbline 272
; 	asm("nop \n nop");
	nop 
	 nop
L70:
	.dbline 273
L71:
	.dbline 273
; 	while(!fRB);
	sbis 0x10,4
	rjmp L70
	.dbline 275
; 	
; 	fCOMMAND = 0x8a;//页拷贝命令
	ldi R24,138
	sts 40960,R24
	.dbline 277
; 	/*目的地址*/
; 	fADD = 0x00;
	clr R2
	sts 36864,R2
	.dbline 278
; 	fADD = Destination_addl;
	sts 36864,R22
	.dbline 279
; 	fADD = Destination_addh;
	sts 36864,R10
	.dbline 280
; 	asm("nop \n nop");
	nop 
	 nop
L73:
	.dbline 281
L74:
	.dbline 281
; 	while(!fRB);
	sbis 0x10,4
	rjmp L73
	.dbline 283
; 	
; 	fCOMMAND = 0x70;//读状态命令
	ldi R24,112
	sts 40960,R24
	.dbline 284
; 	i = fDATA;//读状态值
	lds R20,32768
	.dbline 285
; 	csram;
	sts 0xfc01,R22
	.dbline 285
	.dbline 286
; 	fWPc;//写保护
	CBI 0x12,5
	.dbline 286
	.dbline -2
	.dbline 287
; }
L69:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r Destination_addl 22 c
	.dbsym r Destination_addh 10 c
	.dbsym r Source_addl 18 c
	.dbsym r Source_addh 16 c
	.dbfunc s flashReadcmd _flashReadcmd fI
	.even
_flashReadcmd::
	.dbline -1
	.dbline 310
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:读FLASH预处理函数
; **函数输入参数及说明:无
; 
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashReadcmd(void)
; {
	.dbline 316
; 	/****************说明************
; 	  对于FLASH的读原理为:FLASH的读
; 	  可以是随机读取,所以这里只要给
; 	  定读数据的首地址和读写长度
; 	********************************/
; 	Flash_Read_Sec = 0x00;
	clr R2
	sts _Flash_Read_Sec,R2
	.dbline 317
; 	Flash_Read_Col = 0x00;
	sts _Flash_Read_Col,R2
	.dbline 318
; 	Flash_Read_addl = XmtBuff.b[20];
	lds R2,_XmtBuff+20
	sts _Flash_Read_addl,R2
	.dbline 319
; 	Flash_Read_addh = XmtBuff.b[19];
	lds R2,_XmtBuff+19
	sts _Flash_Read_addh,R2
	.dbline 320
;   	ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23];
	lds R2,_XmtBuff+23
	clr R3
	lds R4,_XmtBuff+22
	clr R5
	mov R5,R4
	clr R4
	add R4,R2
	adc R5,R3
	mov R2,R4
	mov R3,R5
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	sts _ReadResidueVal+1,R3
	sts _ReadResidueVal,R2
	sts _ReadResidueVal+2+1,R5
	sts _ReadResidueVal+2,R4
	.dbline 321
;       	ReadResidueVal = 512 * ReadResidueVal;
	ldi R24,9
	ldi R25,0
	st -y,R24
	mov R16,R2
	mov R17,R3
	mov R18,R4
	mov R19,R5
	rcall lsl32
	sts _ReadResidueVal+1,R17
	sts _ReadResidueVal,R16
	sts _ReadResidueVal+2+1,R19
	sts _ReadResidueVal+2,R18
	.dbline 322
; 	fCOMMAND = 0xff;
	ldi R24,255
	sts 40960,R24
	.dbline 323
; 	asm("nop \n nop");
	nop 
	 nop
L81:
	.dbline 324
L82:
	.dbline 324
; 	while(!fRB);
	sbis 0x10,4
	rjmp L81
	.dbline -2
	.dbline 325
; }
L76:
	.dbline 0 ; func end
	ret
	.dbfunc s flashRead _flashRead fI
;           temp -> R10
;              i -> R10
	.even
_flashRead::
	rcall push_gset4
	.dbline -1
	.dbline 348
; /************************************************************
; **工程名称:U盘固件程序开发
; **编译器类型及版本:ICCAVR 6.26C
; **日期:2004.4.30
; **创建人:陈驰
; **所属单位:湖南大学计算机与通信学院
; 
; **芯片类型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
; **时钟频率:8MHZ
; 
; **函数功能:读FLASH函数
; **函数输入参数及说明:无
; 
; **函数返回值:无
; **在本函数以外定义的变量:
; **调用的函数说明:无
; 
; **修改人:陈驰
; **修改日期:2004.4.30
; **修改说明:创建
; *************************************************************/
; void flashRead(void)
; {
	.dbline 351
; 	unsigned char i;
; 	unsigned char  temp;
; 	if(ReadResidueVal > 0){
	ldi R16,<L87
	ldi R17,>L87
	rcall lpm32
	lds R5,_ReadResidueVal+2+1
	lds R4,_ReadResidueVal+2
	lds R3,_ReadResidueVal+1
	lds R2,_ReadResidueVal
	cp R2,R16
	cpc R3,R17
	cpc R4,R18
	cpc R5,R19
	brne X3
	rjmp L85
X3:
	.dbline 351
	.dbline 352
; 		ReadResidueVal -= 64;
	ldi R16,<L88
	ldi R17,>L88
	rcall lpm32
	lds R5,_ReadResidueVal+2+1
	lds R4,_ReadResidueVal+2
	lds R3,_ReadResidueVal+1
	lds R2,_ReadResidueVal
	sub R2,R16
	sbc R3,R17
	sbc R4,R18
	sbc R5,R19
	sts _ReadResidueVal+1,R3
	sts _ReadResidueVal,R2
	sts _ReadResidueVal+2+1,R5
	sts _ReadResidueVal+2,R4
	.dbline 353
; 		temp = (unsigned char)(Flash_Read_Col + 64);
	lds R24,_Flash_Read_Col
	clr R25
	subi R24,192  ; offset = 64
	sbci R25,255
	mov R10,R24
	.dbline 354
; 		fCOMMAND = Flash_Read_Sec;
	lds R2,_Flash_Read_Sec
	sts 40960,R2
	.dbline 355
; 		fADD = Flash_Read_Col;
	lds R2,_Flash_Read_Col
	sts 36864,R2
	.dbline 356
; 		fADD = Flash_Read_addl;
	lds R2,_Flash_Read_addl
	sts 36864,R2
	.dbline 357
; 		fADD = Flash_Read_addh;
	lds R2,_Flash_Read_addh
	sts 36864,R2
	.dbline 358
; 		asm("nop \n nop");
	nop 
	 nop
L89:
	.dbline 359
L90:
	.dbline 359
; 		while(!fRB);
	sbis 0x10,4
	rjmp L89
	.dbline 360
; 		switch (Flash_Read_Sec)
	lds R12,_Flash_Read_Sec
	clr R13
	tst R12
	brne X4
	tst R13
	breq L95
X4:
	ldi R24,1
	ldi R25,0
	cp R12,R24
	cpc R13,R25
	breq L98
	rjmp L92
X2:
	.dbline 361
; 		{
L95:
	.dbline 363
; 			case 0x00:
; 				if(temp == 0)
	tst R10
	brne L96
	.dbline 364
; 				{
	.dbline 365
; 					Flash_Read_Sec = 0x01;
	ldi R24,1
	sts _Flash_Read_Sec,R24
	.dbline 366
; 					Flash_Read_Col = 0x00;
	clr R2
	sts _Flash_Read_Col,R2
	.dbline 367
; 				}else
	rjmp L93
L96:
	.dbline 368
; 				{
	.dbline 369
; 					Flash_Read_Col += 64;
	lds R24,_Flash_Read_Col
	subi R24,192	; addi 64
	sts _Flash_Read_Col,R24
	.dbline 370
; 				}
	.dbline 371
; 				break;
	rjmp L93
L98:
	.dbline 373
; 			case 0x01:
; 				if(temp == 0)
	tst R10
	brne L99
	.dbline 374
; 				{
	.dbline 375
; 					if(Flash_Read_addl == 255){
	lds R24,_Flash_Read_addl
	cpi R24,255
	brne L101
	.dbline 375
	.dbline 376
; 						Flash_Read_addl = 0x00;
	clr R2
	sts _Flash_Read_addl,R2
	.dbline 377
; 						Flash_Read_addh ++;
	lds R24,_Flash_Read_addh
	subi R24,255	; addi 1
	sts _Flash_Read_addh,R24
	.dbline 378
; 					}else
	rjmp L102
L101:
	.dbline 379
; 						Flash_Read_addl ++;
	lds R24,_Flash_Read_addl
	subi R24,255	; addi 1
	sts _Flash_Read_addl,R24
L102:
	.dbline 380
; 					Flash_Read_Sec = 0x00;
	clr R2
	sts _Flash_Read_Sec,R2
	.dbline 381
; 					Flash_Read_Col = 0x00;
	sts _Flash_Read_Col,R2
	.dbline 382
; 				}else
	rjmp L93
L99:
	.dbline 383
; 				{
	.dbline 384
; 					Flash_Read_Col += 64;
	lds R24,_Flash_Read_Col
	subi R24,192	; addi 64
	sts _Flash_Read_Col,R24
	.dbline 385
; 				}
	.dbline 386
; 				break;
L92:
L93:
	.dbline 389
; 		}
; 		
; 		D12_COMMAND = 0x05;//选择端点(指针指向0位置)
	ldi R24,5
	sts 31745,R24
	.dbline 390
; 		cwait;
	nop
	.dbline 391
; 		D12_COMMAND = 0xf0;//写缓冲区
	ldi R24,240
	sts 31745,R24
	.dbline 392
; 		cwait;
	nop
	.dbline 400
; 		/****************************
; 	  	  缓冲区数据结构:
; 	  	  字节1:保留,可为任意值
; 	  	  字节2:数据字节的数目/长度
; 	  	  字节3:数据字节1
; 	  	  字节4:数据字节2
; 		*****************************/
; 		D12_DATA = 0x00;//字节1
	clr R2
	sts 31744,R2
	.dbline 401
; 		cwait;
	nop
	.dbline 402
; 		D12_DATA = 64;//字节2
	ldi R24,64
	sts 31744,R24
	.dbline 403
; 		csram;
	sts 0xfc01,R22
	.dbline 403
	.dbline 404
; 		for(i=0;i<64;i++)
	clr R10
	rjmp L106
L103:
	.dbline 405
	.dbline 406
	lds R2,32768
	sts 31744,R2
	.dbline 407
	nop
	.dbline 408
L104:
	.dbline 404
	inc R10
L106:
	.dbline 404
	mov R24,R10
	cpi R24,64
	brlo L103
	.dbline 409
	ldi R24,250
	sts 31745,R24
	.dbline 410
	sts 0xfc01,R22
	.dbline 410
	.dbline 411
L85:
	.dbline -2
	.dbline 412
; 		{
; 			D12_DATA = fDATA;//写数据
; 			cwait;
; 		}
; 		D12_COMMAND = 0xfa;//设置缓冲区有效(满标志)
; 		csram;
; 	}
; }
L84:
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r temp 10 c
	.dbsym r i 10 c
	.area lit(rom, con, rel)
L88:
	.word 64,0
L87:
	.word 0,0
	.area data(ram, con, rel)
	.dbfile G:\source\NFlash32.c
L8:
	.blkb 18
	.area idata
	.byte 37,'x,44,37,'x,32,'e,'r,'a,'s,'e,32,'i,'s,32,37
	.byte 'x,0
	.area data(ram, con, rel)
	.dbfile G:\source\NFlash32.c

⌨️ 快捷键说明

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