查看: 7337  |  回复: 3
STC15f内部EEPROM
Argon
9
主题
5
回复
发表于2018-12-29 13:37:22 | 显示全部楼层
1# 电梯直达

1.EEPROM我使用的时候查看了使用手册了解相关寄存器的使用(寄存器设置没看懂只是看着用)

查看例程只用擦除扇区函数,读和写操作,(都是可用的函数拿来就可以用),关闭IAP寄存器操作函数,在进行操作的时候初始化一边即可多次调用读写函数

我遇到的问题1.STC15F2K60S2只有2个扇区每个扇区512个字节,字节数1K,我当时不明白,在进行多个扇区读写失败 用IAP字节读时EEPROM起始扇区首地址: 0000h;用IAP字节读时EEPROM结束扇区末地址: 03FFh

2.不明白怎么调用读写函数

写入函数调用 void IapProgramByte( 扇区地址, 写入的数据)读写函数调用 unsigned char IapReadByte(想要读出数据的扇区地址) 总体而言开始之前我了解EEPROM的作用能做什么,然后我才想怎么开始使用,我看了看数据手册,看完我不懂,我随后百度查EERPOM的应用和初始化,以及函数的编写,最后是调用测试


在使用EEPROM 的时候操作步骤
先开始对EEPROM进行初始化操作
sfr IAP_DATA = 0xC2;  //IAP数据寄存器
sfr IAP_ADDRH = 0xC3; //IAP地址寄存器高字节
sfr IAP_ADDRL = 0xC4; //IAP地址寄存器低字节
sfr IAP_CMD = 0xC5;     //IAP命令寄存器
sfr IAP_TRIG = 0xC6;  //IAP命令触发寄存器
sfr IAP_CONTR = 0xC7; //IAP控制寄存器
#define CMD_IDLE 0     //空闲模式
#define CMD_READ 1  //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3       //IAP扇区擦除命令
注具体看使用手册
然后在进行编写函数操作
擦除函数(函数的格式是固定的)
void IapEraseSector(WORD addr)
{
       IAP_CONTR= ENABLE_IAP;      //使能IAP
       IAP_CMD= CMD_ERASE;                     //使能IAP命令
       IAP_ADDRL= addr;                      //设置IAP低地址
       IAP_ADDRH= addr >> 8;             //设置IAP高地址
       IAP_TRIG= 0x5a;                      //写触发命令0x5a
       IAP_TRIG= 0xa5;                      ///写触发命令0xa5
       _nop_();                                  //等待写ISP/IAP/EEPROM数据完成
       IapIdle();                        //关闭IAP功能
}
写入EEPROM区域数据函数(单字节写入)
void IapProgramByte(WORD addr, BYTE dat)
{
       IAP_CONTR= ENABLE_IAP; //使能IAP
       IAP_CMD= CMD_PROGRAM; //设置IAP命令
       IAP_ADDRL= addr;               //设置IAP低地址
       IAP_ADDRH= addr >> 8;      //设置IPA高地址
       IAP_DATA= dat;                   //写ISP/IAP/EEPROM数据
       IAP_TRIG= 0x5a;            //写触发命令0x5a
       IAP_TRIG= 0xa5;            //写触发命令0xa5
       _nop_();                         //等待写ISP/IAP/EEPROM数据完成
       IapIdle();                 //关闭IAP功能
}
读出单字节EEPROM区域数据
unsigned char IapReadByte(WORD addr)
{
       BYTE dat;                     //数据缓冲区
       IAP_CONTR= ENABLE_IAP;        //使能IAP
       IAP_CMD= CMD_READ;          //设置读取命令
       IAP_ADDRL= addr;                //设置IAP低八位地址
       IAP_ADDRH= addr >> 8;          //设置IAP高八位地址  
       IAP_TRIG= 0x5a;               //写触发命令(0x5a)
       IAP_TRIG= 0xa5;               //写触发命令(0xa5)
       _nop_();                       //等待ISP/IAP/EEPROM操作完成   
       dat= IAP_DATA;                //读ISP/IAP/EEPROM数据
       IapIdle();                      //关闭IAP功能
       return dat;                           //返回
}
关闭对IAP寄存器操作函数
void IapIdle()
{
       IAP_CONTR= 0;                  //关闭IAP功能 寄存器读写开关
       IAP_CMD= 0;                    //清除指令待机
       IAP_TRIG= 0;                   //清空触发器寄存器
       IAP_ADDRH= 0x80;               //地址寄存器高八位
       IAP_ADDRL= 0;                             //地址寄存器低八位
}


目的:

单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用内部EEPROM (EEPROM可以擦写100000)FLASHROM 等存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC 单片机中内置了EEPROM(其实是采用ISP/IAP技术读写内部FLASH 来实现EEPROM),正是因为有了IAP,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。这样就节省了片外资源,使用起来也更加方便。

下面就详细介绍STC 单片机内置EEPROM 及其使用方法

2STC15F2K60S2系列单片机的内部结构图

STC15F2K60S2系列单片机的内部结构框图如下图所示,STC15F2K60S2系列单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时器、IO口、高速A/D转换、看门狗、UART高速异步串行通信口1/串行通信口2,CCP/PWM/PCA,一组高速同步串行端口SPI,片内高精度R/C时钟及高可靠复位等模块,STC15F2K60S2系列单片机几乎包含了数据采集和控制中的所有单元模块。

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部