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

📄 block0.c

📁 一种用SST89系列单片机的用户程序存储量达到72K的方法,开发大的系统时,工程师就不用想法设法将代码空间缩小到64K之内了.
💻 C
字号:
/*

********超高性价比的51单片机--20元以下的可达72K程序空间及可在任何地址存储数据的增强性51单片机************
************采用超级FLASH存储器的超级51单片机---SST89E/V52-54-58-516RD,具有超级程序和数据空间的功能******

							香港弘微科技有限公司       田伯运
							andy.tian@spacltd.com.cn    0755-26010579
				


	1.片内的用户程序容量超过标准51单片机的极限--64K,单片最大可达72K的用户程序空间
	2.片内FLASH的任意地址均可作为数据或程序单元进行存储,具有超级的灵活性,这是其它51单片机所不能达到的极限.

	本例子,就简单说明了这些功能的实现:
	1.在SST89E516RD/564RD的BLOCK0(64K)内存放BLOCK0.C的程序文件,允许最大到64K;在BLOCK1(8K)内存放BLOCK1.C的
	  程序文件,最大到8K,通过KEIL C51的BANK分区指令,可有效将两个BLOCK的程序合在一起,互相调用,从而形成64+8=72K
 	  的程序容量空间.
	2.在两个BLOCK内都存放有FLASH的擦写指令,便可对72K内的任意非程序空间的剩余空间都作为DATA存储空间来用,从而
	  打破了在MCU片内最大只能64K数据空间的限制,数据存储片内也可超过64K.
	3.本示例采用最精简的函数和结构,主在说明在SST89E516/564RD的单片机内可实现超过64K的程序空间和任意地址存储数据
	  的功能.	

	*/

#include <SST89X5XXRD2.H>

extern void Flash_Block0_byte_program(unsigned short int dataAddr, unsigned char dataByte);

/***********************************************************************************************************
* 字节编程函数---Flash_Block1_byte_program()		//对MCU内部FLASH的Block1区域单字节编程函数
* 输入参数:     dataAddr---编程的字节地址
* 输入参数:     dataByte---编程的数据
***********************************************************************************************************/
void Flash_Block1_byte_program(unsigned short int dataAddr, unsigned char dataByte)
{
	unsigned short int destAddr = dataAddr;
	SFCF = SFCF | 0x41; // SFCF.6=1: IAP功能使能,   SFCF.0=1: 选择Block1
	SFAH = destAddr>>8; // 将扇区地址的高8位装入FLASH的高8位地址寄存器(SFAH)中
	SFAL = destAddr; 	// 将扇区地址的低8位装入FLASH的低8位地址寄存器(SFAL)中
	SFDT = dataByte; 	// 在FLASH的数据寄存器(SFDT)中填入编程的数据--dataByte
	SFCM = 0x0e; 	// 在FLASH的命令寄存器(SFCM)中填入字节编程命令--SFCM_PB=0X0E
	while (SFST&0x04); 		//SFST.2=0:IAP操作完成
	SFCF = SFCF & ~0x40; // SFCF.6=0: IAP功能禁止
	SFDT = 0;				//清除原来的FLASH数据寄存器,
}

void main(void)
{
	unsigned int addr_flash;
	unsigned char i;
	
	addr_flash=0x0800;				//针对SST89E516RD的BLOCK1的地址(0x0000-0x1fff);如是SST89E52-58RD,BLOCK1地址应在0xe000-0xffff之间
	for ( i=0; i<0x40; i++)		//对Block1的FLASH的0x0800--0x083f地址范围内单元连续写入0x21--0x60的数据,
	{							//运行后可用编程器查看FLASH编程的结果
		Flash_Block1_byte_program(addr_flash,i+0x21);
		addr_flash++;
		}

	addr_flash=0x0a00;
	for ( i=0; i<0x40; i++)		//对Block0的FLASH的0x0a00--0x0a3f地址范围内单元连续写入0x31--0x70的数据,
	{							//运行后可用编程器查看FLASH编程的结果
		Flash_Block0_byte_program(addr_flash,i+0x31);
		addr_flash++;
		}

	while(1)
	{
		P1=0x55;			//点亮P1口,指示编程完毕;
		}
	
}

⌨️ 快捷键说明

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