请教51单片机内部EEPROM的应用
意法半导体(中国)投资有限公司
2023-06-12
展开全部
展开全部
不知道你用的是那种51单片机,我就当是STC89C51系列的了。
这问题涉及方面还挺多,这样一一回答还真不好弄,我给你几个方向看看能不能帮到你。
参考手册(附件我以上传)第9章。
官方已给了例程,你可以参考一下,最下面我给你,我已复制在下面。
注意扇区问题(分区,地址,擦除时间等)
存储前要先擦除扇区
下面示例一下基本使用
num = byte_read(0x2000); //读取EEPROM中地址0x2000数据,赋值给num
SectorErase(0x2000); //擦除第1扇区
byte_write(0x2000, num); //将num数据写入EPROM地址0x2000中
# include <reg52.h>
# include <intrins.h>
# define RdCommand 0x01 //定义ISP的操作命令
# define PrgCommand 0x02
# define EraseCommand 0x03
# define WaitTime 0x01 //定义CPU的等待时间 @11.0592MHz
# define Error 1
# define Ok 0
sfr ISP_DATA = 0xE2; //寄存器申明
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;
void ISP_IAP_enable(void) // 打开 ISP,IAP 功能
{
EA = 0; // 关中断
ISP_CONTR = ISP_CONTR & 0x18; // 0001,1000
ISP_CONTR = ISP_CONTR | WaitTime; // 写入硬件延时
ISP_CONTR = ISP_CONTR | 0x80; // ISPEN=1
}
void ISP_IAP_disable(void) // 关闭 ISP,IAP 功能
{
ISP_CONTR = ISP_CONTR & 0x7F; // ISPEN = 0
ISP_TRIG = 0x00;
EA = 1; // 开中断
}
void ISPgoon(void) // 公用的触发代码
{
ISP_IAP_enable(); // 打开 ISP,IAP 功能
ISP_TRIG = 0x46; // 触发ISP_IAP命令字节1
ISP_TRIG = 0xB9; // 触发ISP_IAP命令字节2
_nop_(); // 延时一个机器周期
}
unsigned char byte_read(unsigned int byte_addr) // 读字节
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 地址赋值
ISP_ADDRL = (unsigned char)(byte_addr & 0x00FF);
ISP_CMD = ISP_CMD & 0xF8; // 清除低3位
ISP_CMD = ISP_CMD | RdCommand; // 写入读命令
ISPgoon(); // 触发执行
ISP_IAP_disable(); // 关闭ISP,IAP功能
return (ISP_DATA); // 返回读到的数据
}
void SectorErase(unsigned int sector_addr) //扇区擦除
{
// unsigned int iSectorAddr;
// iSectorAddr = (sector_addr & 0xFE00); // 取扇区地址
// ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
// ISP_ADDRL = 0x00;
ISP_ADDRH = (unsigned char)(sector_addr >> 8); // 取扇区地址高8位
ISP_ADDRL = (unsigned char)sector_addr; // 取扇区地址低8位
ISP_CMD = ISP_CMD & 0xF8; // 清空低3位
ISP_CMD = ISP_CMD | EraseCommand; // 擦除命令3
ISPgoon(); // 触发执行
ISP_IAP_disable(); // 关闭ISP,IAP功能
}
void byte_write(unsigned int byte_addr, unsigned char original_data) // 写字节
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8); // 取地址
ISP_ADDRL = (unsigned char)(byte_addr & 0x00FF);
ISP_CMD = ISP_CMD & 0xF8; // 清低3位
ISP_CMD = ISP_CMD | PrgCommand; // 写命令2
ISP_DATA = original_data; // 写入数据准备
ISPgoon(); // 触发执行
ISP_IAP_disable(); // 关闭IAP功能
}
意法半导体(中国)投资有限公司
2020-01-15 广告
2020-01-15 广告
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询