当前位置:首页 > 单片机 > 单片机
[导读] STC90/89系列内部EEPROM放数据(C语言)#include#include/*use_nop_()function*///sfr16DPTR=0x82;/*新增特殊功能寄存器定义*/sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sf

STC90/89系列内部EEPROM放数据(C语言)

#include
#include/*use_nop_()function*/

//sfr16DPTR=0x82;

/*新增特殊功能寄存器定义*/
sfrISP_DATA=0xe2;
sfrISP_ADDRH=0xe3;
sfrISP_ADDRL=0xe4;
sfrISP_CMD=0xe5;
sfrISP_TRIG=0xe6;
sfrISP_CONTR=0xe7;

/*定义命令*/
#defineREAD_AP_and_Data_Memory_Command0x01/*字节读数据存储区*/
#definePROGRAM_AP_and_Data_Memory_Command0x02/*字节编程数据存储区*/
#defineSECTOR_ERASE_AP_and_Data_Memory_Command0x03/*扇区擦除数据存储区*/

typedefunsignedcharINT8U;/*8bit无符号整型*/
typedefunsignedintINT16U;/*16bit无符号整型*/
#defineDELAY_CONST60000

/*定义常量*/
#defineERROR0
#defineOK1

sbitBegin_LED=P1^0;
sbitERROR_LED=P1^3;
sbitOK_LED=P1^7;

/*定义Flash操作等待时间*/
#defineMCU_CLOCK_40MHz
//#defineMCU_CLOCK_20MHz
//#defineMCU_CLOCK_10MHz
//#defineMCU_CLOCK_5MHz
#ifdefMCU_CLOCK_40MHz
#defineWAIT_TIME0x00
#endif
#ifdefMCU_CLOCK_20MHz
#defineWAIT_TIME0x01
#endif
#ifdefMCU_CLOCK_10MHz
#defineWAIT_TIME0x02
#endif
#ifdefMCU_CLOCK_5MHz
#defineWAIT_TIME0x03
#endif

/*调试控制项*/
//#defineDEBUG_STC89C_LE58RD+

#defineDEBUG_STC89C_LE52RC

//#defineUSED_BYTE_QTY_IN_ONE_SECTOR1
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR2
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR4
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR8
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR16
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR32
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR64
#defineUSED_BYTE_QTY_IN_ONE_SECTOR128
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR256
//#defineUSED_BYTE_QTY_IN_ONE_SECTOR512

INT8Uxdataprotect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];

#ifdefDEBUG_STC89C_LE58RD+//STC89C58RD+,89LE58RD+
#defineDEBUG_AP_Memory_Begin_Sector_addr0x0000
#defineDEBUG_AP_Memory_End_Sector_addr0x7e00
#defineDEBUG_AP_Memory_End_Byte_addr0x7fff

#defineDEBUG_Data_Memory_Begin_Sector_addr0x8000
#endif
#ifdefDEBUG_STC89C_LE52RC//STC89C52RC,89LE52RC
#defineDEBUG_AP_Memory_Begin_Sector_addr0x0000
#defineDEBUG_AP_Memory_End_Sector_addr0x1e00
#defineDEBUG_AP_Memory_End_Byte_addr0x1fff

#defineDEBUG_Data_Memory_Begin_Sector_addr0x2000
#endif


/*打开ISP,IAP功能*/
voidISP_IAP_enable(void)
{
EA=0;/*关中断*/
ISP_CONTR=ISP_CONTR&0x18;/*0001,1000*/
ISP_CONTR=ISP_CONTR|WAIT_TIME;
ISP_CONTR=ISP_CONTR|0x80;/*1000,0000*/
}

/*关闭ISP,IAP功能*/
voidISP_IAP_dISAble(void)
{
ISP_CONTR=ISP_CONTR&0x7f;/*0111,1111*/
ISP_TRIG=0x00;
EA=1;/*开中断*/
}

/*字节读*/
INT8Ubyte_read(INT16Ubyte_addr)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/

ISP_IAP_enable();

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();

ISP_IAP_disable();
return(ISP_DATA);
}

/*扇区擦除*/
INT8Usector_erase(INT16Usector_addr)
{
INT16Uget_sector_addr=0;
get_sector_addr=(sector_addr&0xfe00);/*1111,1110,0000,0000;取扇区地址*/
ISP_ADDRH=(INT8U)(get_sector_addr>>8);
ISP_ADDRL=0x00;

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/

ISP_IAP_enable();
ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

ISP_IAP_disable();
returnOK;
}

/*字节编程*/
INT8Ubyte_program(INT16Ubyte_addr,INT8Uoriginal_data)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_DATA=original_data;

ISP_IAP_enable();
ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

ISP_IAP_disable();
returnOK;
}

/*字节编程并校验*/
INT8Ubyte_program_and_verify(INT16Ubyte_addr,INT8Uoriginal_data)
{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/
ISP_DATA=original_data;

ISP_IAP_enable();

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();

ISP_DATA=0x00;

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

ISP_IAP_disable();

if(ISP_DATA==original_data)
returnOK;
else
returnERROR;
}

/*写数据进数据Flash存储器,只在同一个扇区内写,不保留原有数据*/
/*begin_addr,被写数据Flash开始地址;counter,连续写多少个字节;array[],数据来源*/
INT8Usequential_write_flash_in_one_sector(INT16Ubegin_addr,INT16Ucounter,INT8Uarray[])
{
INT16Ui=0;
INT16Uin_sector_begin_addr=0;
INT16Usector_addr=0;

/*判是否是有效范围,此函数不允许跨扇区操作*/
if(counter>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
in_sector_begin_addr=begin_addr&0x01ff;/*0000,0001,1111,1111*/
if((in_sector_begin_addr+counter)>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;

/*擦除要修改/写入的扇区*/
sector_addr=(begin_addr&0xfe00);/*1111,1110,0000,0000;取扇区地址*/
ISP_ADDRH=(INT8U)(sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/

ISP_IAP_enable();
ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

for(i=0;i{
/*写一个字节*/
ISP_ADDRH=(INT8U)(begin_addr>>8);
ISP_ADDRL=(INT8U)(begin_addr&0x00ff);
ISP_DATA=array[i];
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

/*读回来*/
ISP_DATA=0x00;

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

/*比较对错*/
if(ISP_DATA!=array[i])
{
ISP_IAP_disable();
returnERROR;
}
begin_addr++;
}
ISP_IAP_disable();
returnOK;
}

/*写数据进数据Flash存储器(EEPROM),只在同一个扇区内写,保留同一扇区中不需修改的数据*/
/*begin_addr,被写数据Flash开始地址;counter,连续写多少个字节;array[],数据来源*/
INT8Uwrite_flash_with_protect_in_one_sector(INT16Ubegin_addr,INT16Ucounter,INT8Uarray[])
{
INT16Ui=0;
INT16Uin_sector_begin_addr=0;
INT16Usector_addr=0;
INT16Ubyte_addr=0;

/*判是否是有效范围,此函数不允许跨扇区操作*/
if(counter>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;
in_sector_begin_addr=begin_addr&0x01ff;/*0000,0001,1111,1111*/
/*假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写*/
if((in_sector_begin_addr+counter)>USED_BYTE_QTY_IN_ONE_SECTOR)
returnERROR;

/*将该扇区数据0-(USED_BYTE_QTY_IN_ONE_SECTOR-1)字节数据读入缓冲区保护*/
sector_addr=(begin_addr&0xfe00);/*1111,1110,0000,0000;取扇区地址*/
byte_addr=sector_addr;/*扇区地址为扇区首字节地址*/

ISP_IAP_enable();
for(i=0;i{
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/

ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();

protect_buffer[i]=ISP_DATA;
byte_addr++;
}

/*将要写入的数据写入保护缓冲区的相应区域,其余部分保留*/
for(i=0;i{
protect_buffer[in_sector_begin_addr]=array[i];
in_sector_begin_addr++;
}

/*擦除要修改/写入的扇区*/
ISP_ADDRH=(INT8U)(sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/*0000,0011*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

/*将保护缓冲区的数据写入DataFlash,EEPROM*/
byte_addr=sector_addr;/*扇区地址为扇区首字节地址*/
for(i=0;i{
/*写一个字节*/
ISP_ADDRH=(INT8U)(byte_addr>>8);
ISP_ADDRL=(INT8U)(byte_addr&0x00ff);
ISP_DATA=protect_buffer[i];
ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;/*0000,0010*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

/*读回来*/
ISP_DATA=0x00;

ISP_CMD=ISP_CMD&0xf8;/*1111,1000*/
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;/*0000,0001*/

ISP_TRIG=0x46;/*触发ISP_IAP命令*/
ISP_TRIG=0xb9;/*触发ISP_IAP命令*/
_nop_();

/*比较对错*/
if(ISP_DATA!=protect_buffer[i])
{
ISP_IAP_disable();
returnERROR;
}
byte_addr++;
}
ISP_IAP_disable();
returnOK;
}

/*测试常量数组*/
INT8UcodeTest_array_total[512]=
{
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,
0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,
0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,
0xc8,0xc9,0xca,0xcb,0xCC,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,
0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,
0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,
0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,
0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8,
0xe7,0xe6,0xe5,0xe4,0xe3,0xe2,0xe1,0xe0,
0xdf,0xde,0xdd,0xdc,0xdb,0xda,0xd9,0xd8,
0xd7,0xd6,0xd5,0xd4,0xd3,0xd2,0xd1,0xd0,
0xcf,0xce,0xcd,0xcc,0xcb,0xca,0xc9,0xc8,
0xc7,0xc6,0xc5,0xc4,0xc3,0xc2,0xc1,0xc0,
0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
0xb7,0xb6,0xb5,0xb4,0xb3,0xb2,0xb1,0xb0,
0xaf,0xae,0xad,0xac,0xab,0xaa,0xa9,0xa8,
0xa7,0xa6,0xa5,0xa4,0xa3,0xa2,0xa1,0xa0,
0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,
0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,
0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,
0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6f,0x6e,0x6d,0x6c,0x6b,0x6a,0x69,0x68,
0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,
0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,
0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,
0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,
0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,
0x33,0x36,0x35,0x34,0x33,0x32,0x31,0x30,
0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,
0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,
0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,
0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,
0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,
0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00
};

voiddisplay_Begin_LED(void)
{
Begin_LED=0;/*Begin_LEDon*/
}
voidoff_Begin_LED(void)
{
Begin_LED=1;/*Begin_LEDoff*/
}
voiddisplay_OK_LED(void)
{
OK_LED=0;/*OK_LEDon*/
}
voidoff_OK_LED(void)
{
OK_LED=1;/*OK_LEDoff*/
}

voiddisplay_ERROR_LED(void)
{
ERROR_LED=0;/*ERROR_LEDon*/
}
voidoff_ERROR_LED(void)
{
ERROR_LED=1;/*ERROR_LEDoff*/
}

voiddelay(INT16Ucounter)
{
INT16Utemp=0;
for(temp=counter;temp>0;temp--)
{
_nop_();
_nop_();
_nop_();
}
}

voidmain()
{
//sbitBegin_LED=P1^0;
//sbitERROR_LED=P1^3;
//sbitOK_LED=P1^7;

display_Begin_LED();
delay(DELAY_CONST);

sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);
if(byte_program_and_verify(DEBUG_Data_Memory_Begin_Sector_addr,0x55)==OK)
display_OK_LED();
else
display_ERROR_LED();

/*
if(sequential_write_flash_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr,USED_BYTE_QTY_IN_ONE_SECTOR,Test_array_total))
display_OK_LED();
else
display_ERROR_LED();
*/
/*
if(write_flash_with_protect_in_one_sector(DEBUG_Data_Memory_Begin_Sector_addr+0x3,USED_BYTE_QTY_IN_ONE_SECTOR-0x30,Test_array_total))
display_OK_LED();
else
display_ERROR_LED();
*/
while(1);
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭