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

📄 main.asm

📁 实现写字功能,可以单个字,也可以多个字.功能挺多的.
💻 ASM
字号:
//======================================================
//  The information contained herein is the exclusive property of
//  Sunnnorth Technology Co. And shall not be distributed, reproduced,
//  or disclosed in whole in part without prior written permission.
//             (C) COPYRIGHT 2006  SUNNORTH TECHNOLOGY CO.
//                          ALL RIGHTS RESERVED
//  The entire notice above must be reproduced on all authorized copies.
//========================================================
//============================================================
//	工程名称:	Exa09_Flash_ASM
//	功能描述:	Flash模式设置、擦除操作、写单字操作
//	以及写多字操作的子程序段
//	组成文件:	main.asm
//				spmc75f2413a.inc
//	硬件连接:	SPMC75F2413A的新版EVM板
//	完成日期:	2006-3-17
//============================================================
//============================================================
.INCLUDE spmc75f2413a.inc
.CODE
//======================================================
//	主函数
//======================================================
.PUBLIC _main
_main:

	r1 = 0x00ff
	[P_IOD_Dir] = r1		//IOD[0~7]设置为输出
	r1 = 0x00ff
	[P_IOD_Attrib] = r1		//IOD[0~7]设置为非反向
	r1 = 0x0000
	[P_IOD_Buffer] = r1		//IOD[0~7]输出为0
		
	r5 = 0x00ff				//出错标志位初始化
	call _Flash_RW_Enable	//FLASH写使能设置
	
	r1 = 0xf000				//擦除块的首地址
	call _FlashErase		//擦除第14页第一块
	
	r1 = 0xf000				//擦除块的首地址
	r3 = 256				//读出的数据个数寄存器	
?_VerifyErase:				//擦除块中数据读出校验				
	r4 = [r1]				//读数据
	cmp r4,0xffff			//判断是否擦除
	jz ?_ReadErase			//对了则跳转
	r5 &= 0xfffe			//错了则错误标志位第0位清0
?_ReadErase:				//没有写错
	r1 += 1					//地址加1
	r3 -= 1					//读出数据计数器减1
	jnz ?_VerifyErase		//256个数据没读完则跳转
			
	r1 = 0xf000				//要写入数据的Flash首地址
	r2 = 0					//要写入的数据
	r3 = 10					//写入数据个数计数器
?_WriteWord:				//单字写入
	call _FlashWriteWord	//将r2里面的数据写入r1地址中
	r1 += 1					//地址加1
	r2 += 1					//数据加1
	r3 -= 1					//写入数据个数计数器减1
	jnz ?_WriteWord			//写完10个数据了吗
	
	r1 = 0xf000				//写入数据的块的首地址
	r2 = 0					//校验数据初始化
	r3 = 10					//读出的数据个数寄存器		
?_VerifyWord:				//单字写入的数据读出校验				
	r4 = [r1]				//读数据
	cmp r4,r2				//判断是否写错
	jz ?_ReadWord			//写对了则跳转
	r5 &= 0xfffd			//写错了则错误标志第1位清0
?_ReadWord:					//没有写错
	r1 += 1					//地址加1
	r2 += 1					//数据加1
	r3 -= 1					//读出数据计数器减1
	jnz ?_VerifyWord		//单字写入的10个数据没读完
			
	r1 = 0xf00a				//多字写入的首地址
	r2 = 10					//写入数据初始化
	r3 = 30 				//要写入的数据个数寄存器
	call _FlashWritePage	//多字写入
	
	call _Flash_RW_Disable	//Flash些功能禁止
		
	r1 = 0xf00a				//多字写入的数据读出校验
	r2 = 10
	r3 = 30
?_VerifyPage:
	r4 = [r1]
	cmp r4,r2
	jz ?_ReadPage	
	r5 &= 0xfffb			//错误则错误标志第2位清0
?_ReadPage:		
	r1 += 1
	r2 += 1
	r3 -= 1
	jnz ?_VerifyPage
	
	[P_IOD_Buffer] = r5		//显示错误状态,没有错误则LED全亮
	
?_Loop:
	nop
	jmp ?_Loop	
//======================================================
// 汇编格式: 	_Flash_RW_Disable
// 实现功能: 	FLASH卸功能禁止
// 入口参数: 	无
// 出口参数: 	无
// 破坏寄存器: 	无
//======================================================
.PUBLIC _Flash_RW_Disable
_Flash_RW_Disable:
	push r1 to [sp]
	
	r1 = 0x5a5a
	[P_Flash_RW] = r1		//第一次写入控制命令
	r1 = 0x4000
	[P_Flash_RW] = r1		//第二次写入设置字,只读
	
	pop r1 from [sp]
	retf	

//======================================================
// 汇编格式: 	_Flash_RW_Disable
// 实现功能: 	FLASH卸功能使能
// 入口参数: 	无
// 出口参数: 	无
// 破坏寄存器: 	无
//======================================================
.PUBLIC _Flash_RW_Enable
_Flash_RW_Enable:
	push r1 to [sp]
	
	r1 = 0x5a5a
	[P_Flash_RW] = r1		//第一次写入控制命令	
	r1 = 0x0000
	[P_Flash_RW] = r1		//第二次写入设置字,读写
	
	pop r1 from [sp]
	retf	
//======================================================
//	语法格式:		_FlashErase
//	功能描述:		擦除一块flash
//	参数:			r1--要擦除的块中的任意一个地址
//	返回值: 		无
//  出口参数: 		无
//  破坏寄存器: 	无
//======================================================
.PUBLIC _FlashErase	
_FlashErase:	
	push r2 to [sp]	
	
	r2 = 0xAAAA	
	[P_Flash_Cmd] = r2		//写入控制命令
	r2 = 0x5511
	[P_Flash_Cmd] = r2		//写入擦除命令
	[r1] = r1				//向要擦除块中任一地址地址写入0
	pop r2 from [sp]
	retf	
//======================================================
//	语法格式:		_FlashWrite
//	功能描述:		向指定地址写入指定的数
//	参数:			r1--要写入数据的地址,r2--要写入的数据
//	返回值: 		无
//  破坏寄存器: 	无
//  注意:			写入前保证对应地址已擦除
//======================================================
.PUBLIC _FlashWriteWord
_FlashWriteWord:
	push r4 to [sp]	
	
	r4 = 0xAAAA	
	[P_Flash_Cmd] = r4		//写入控制命令
	r4 = 0x5533
	[P_Flash_Cmd] = r4		//写入单字编程命令
	[r1] = r2 				//向sectorAddress地址写入数据word

	pop r4 from [sp]
	retf
//======================================================
//	语法格式:		_FlashWrite
//	功能描述:		向指定地址写入多个数据
//	参数:			r1--要写入的数据块的首地址,
//					r2--要连续写入数据的初值
//					r3--要写入数据的个数				
//	返回值: 		无
//  破坏寄存器: 	无
//  注意:			写入前保证对应地址已擦除
//======================================================
.PUBLIC _FlashWritePage
_FlashWritePage:
	push r4 to [sp]	
	
	r4 = 0xAAAA							
	[P_Flash_Cmd] = r4		//写入控制命令
	
?_Write:
	r4 = 0x5544
	[P_Flash_Cmd] = r4		//写入多字编程命令
	[r1] = r2				//将数据写入目标地址
	r1 += 1					//地址加1
	r2 += 1					//数据加1
	r3 -= 1					//写入数据计数器减1
	jnz ?_Write

	r4 = 0xFFFF
	[P_Flash_Cmd] = r4		//结束连续字写入操作
	
	pop r4 from [sp]
	retf
//======================================================
//======================================================
.END	

⌨️ 快捷键说明

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