📄 block0.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 + -