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

📄 flashburn.asm.bak

📁 C54xx通用Flash烧写工具1 已经经过测试
💻 BAK
字号:
*烧写8位Flash
			.mmregs
			
			.global	CodeStart	
			.global BurnData
			.global TotalNum

			.copy "FlashBurnDef.asm"
StartAddrH 	.set (StartAddr & 0FFH)
StartAddrL 	.set StartAddr>>8		
DATA_POLLING .set 1		;1:通过检查D7的办法 0:用延时
;宏定义
PROG_CMD	.macro		;编程命令的前导指令
			ST	#00AAH,*(0D555H)
			ST	#0055H,*(0AAAAH)
			ST	#00A0H,*(0D555H)
			.endm
ERASE_CMD	.macro 		;擦写命令的前导指令
			ST	#00AAH,*(0D555H)
			ST	#0055H,*(0AAAAH)
			ST	#0080H,*(0D555H)
			ST	#00AAH,*(0D555H)
			ST	#0055H,*(0AAAAH)
			.endm

ERASE_CHIP_CMD	.macro	;擦写整个chip
			ERASE_CMD
			ST	#0010H,*(0D555H)	
			.endm	
		
DELAY_PRG	.macro ;写数据时延时20us以上
			RPT #10000;假设时钟为100M
			NOP
			.endm

CHECK_CHIP_ERASE .macro 	;通过检查8000H的D7是否擦写完成
wait?:		LD 		*(#8000H),A
			AND 	#80H,A
			BC 		wait?,AEQ	
			.endm

CHECK_PRG 	.macro DataWrite,DataRead 		;通过检查写入地址的D7看是否写入完成
				rpt #9
				nop	
CheckAgain?:LD 		:DataRead:,A
			XOR 	:DataWrite:,A
			.if FlashWidth=8
			AND 	#0FFH,A 		;如果是8位Flash,屏蔽掉高8位
			.else
			AND 	#0FFFFH,A	;16位也有可能因为符号位扩展导致高位16不为0
			.endif			
			BC 		CheckAgain?,ANEQ;如果不相同则重复检查			
			.endm
						
			.text
CodeStart:
STACK_SIZE	.set 20H		
STACK:		.usect "STACK",STACK_SIZE			
			STM 	#STACK+STACK_SIZE,SP		

			.copy "BeforeFlashBurn.asm"
*8位Flash烧写
	.if FlashWidth=8
			;chip erase or sector erase
			ERASE_CHIP_CMD
			.if DATA_POLLING=1
				CHECK_PRG #0FFH,*(8000H)
			.else
				CALL DELAY_FUNC
			.endif
		.if BOOTTABLE=1
			;写boottable的起始地址
			PROG_CMD					;写地址低8位
			ST 		#StartAddrL,*(#0FFFFH)
			.if DATA_POLLING=1			
				CHECK_PRG #StartAddrL,*(#0FFFFH)
			.else	
				DELAY_PRG
			.endif
			
			PROG_CMD					;写地址高8位
			ST 		#StartAddrH,*(#0FFFEH);
			.if DATA_POLLING=1			
				CHECK_PRG #StartAddrH,*(#0FFFEH)
			.else	
				DELAY_PRG
			.endif
		.endif
			
			;写Boottable
			STM		#StartAddr,AR3;
			STM		#TotalNum,AR2
			STM 	#BurnData,AR5
BURN8:		PROG_CMD;写高8位
			LD 		*AR5,B
			SFTL 	B,-8,B
			STL		B,*AR3
			.if DATA_POLLING=1
				CHECK_PRG B,*AR3
			.else
				DELAY_PRG
			.endif
			MAR 	*AR3+
			 
			PROG_CMD;写低8位
			LD 		*AR5+,B
			AND 	#00FFH,B
			STL		B,*AR3
			.if DATA_POLLING=1
				CHECK_PRG B,*AR3
			.else
				DELAY_PRG
			.endif
			MAR 	*AR3+

			BANZ	BURN8,*AR2-
*16位Flash烧写
	.else
			;chip erase or sector erase
			ERASE_CMD
			ST 		#10H,*(0D555H) ;chip erase
			.if DATA_POLLING=1
				CHECK_PRG #0FFFFH,*(8000H)
			.else
				CALL DELAY_FUNC
			.endif
		.if BOOTTABLE=1			
			;写boottable的起始地址
			PROG_CMD
			ST 		#StartAddr,*(#0FFFFH);
			.if DATA_POLLING=1		
				CHECK_PRG #StartAddr,*(#0FFFFH)
			.else	
				DELAY_PRG
			.endif
		.endif	
		
			;写Boottable
			STM		#StartAddr,AR3;
			STM		#TotalNum,AR2
			STM 	#BurnData,AR5
BURN16:		PROG_CMD;写高8位
			.if DATA_POLLING=1
				MVDD 	*AR5,*AR3
				CHECK_PRG *AR3,*AR5
				MAR 	*AR3+
				MAR 	*AR5+ 
			.else
				MVDD 	*AR5+,*AR3+
				DELAY_PRG
			.endif
			BANZ	BURN16,*AR2-
	.endif		 					

			.copy "AfterFlashBurn.asm"
BurnFinished:	nop
END:		nop
			B END

*延时子程序
DELAY_FUNC:			
			;延时25ms以上
			PSHM AR1
			STM #6000,AR1
DelayLoop:	rpt #5000
			nop
			BANZ	DelayLoop,*AR1-	
			POPM AR1
			RET
			.end			
			

⌨️ 快捷键说明

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