STC15系列单片机内部集成了大容量的EEPROM,与其程序空间是分开的。利用ISP/IAP技术可将内部Data Flash当EEPROM,擦写次数在10W次以上。EEPROM可分为若干个扇区,每个扇区包含512字节。使用时,建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同扇区,不一定要用满。数据存储器的擦除操作是按扇区进行的。
EEPROM可用于保存一些需要在应用中修改并且掉电不易丢失的参数数据。在用户程序中,可以对EEPROM进行子节读/字节编程/扇区擦除操作。在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。
一、IAP及EEPROM相关寄存器
1.1 数据寄存器IAP_DATA
IAP_DATA是ISP/IAP操作时的数据寄存器。ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也许放在此处。
1.2 地址寄存器IAP_ADDRH和IAP_ADDRL
IAP_ADDRH,ISP/IAP操作时的地址寄存器高八位。
IAP_ADDRL, ISP/IAP操作时的地址寄存器高低位。
1.3 命令寄存器IAP_CMD
1.4 命令触发寄存器IAP_TRIG
IAP_TRIG是ISP/IAP操场时的命令触发寄存器。在IAPEN(IAP_CONTER.7) = 1时,对IAP_TRIG先写入5Ah,再写入A5h,ISP/IAP命令才会生效。ISP/IAP操作完成后,IAP地址高八位IAP_ADDRH、IAP地址低八位寄存器IAP_ADDRL和IAP命令寄存器IAP_CMD的内容不变。如果接下来要对下一个地址数据进行ISP/IAP操作,需手动将地址的高8位和低8位分别写入IAP_ADDRH和IAP_ADDRL寄存器。
每次IAP操作时,IAP_TRIG先写入5Ah,再写入A5h,ISP/IAP命令才会生效。每次在触发钱,需要重新发送字节读/字节编程/扇区擦除命令,在命令不改变时,不需要重新送命令。
1.5 命令寄存器IAP_CONTR
IAPEN:ISP/IAP功能允许位。
0:禁止IAP读/写/擦除Data Flash/EEPROM
1:允许IAP读/写/擦除Data Flash/EEPROM
0:软件选择复位后从用户应用程序区启动
1:还是从系统ISP检测程序区启动
SWRST:
0:不操作
1:软件控制产生复位,单片机自动复位
CMD_FAIL:如果IAP地址(由IAP地址寄存器IAP_ADDRH和IAP_ADDRL的值决定)指向了非法地址或者无效地址,并送了ISP/IAP命令,并对IAP_TRIG送5Ah/A5h触发失败,则CMD_FAIL为1,需要软件清零。
WT0~WT2控制等待时间:
1.6 工作电压过低判断 此时不需要EEPROM/IAP操作
PCON,电源控制寄存器:
LVDF:低压检测标志位,当工作电压Vcc低于低压检测门槛电压时,该位置1。该位要软件清0。当低压检测电路发现工作电压Vcc偏低时,不要进行EEPROM/IAP操作。
二、STC15单片机EEPROM空间大小及地址
这里,我们暂时只关注STC15W408AS即可。型号不一样记得看手册。
三、测试程序
#include "stc15.h"
#include "intrins.h"
void IapIdle();
uchar IapReadByte(uchar addr);
void IapProgramByte(uchar addr, uchar dat);
void IapEraseSector(uchar addr);
#define IAP_ADDRESS 0x0001
void main()
{
uchar ret;
uint i;
P1M0 = 0x02;
P1M1 = 0x00;
P11 = 0; // 先 关闭LED
// 这里最好加一点延时 方便查看现象
IapEraseSector(IAP_ADDRESS); // 擦除地址的数据 恢复初始值
IapProgramByte(IAP_ADDRESS,1); // 写入1
if(IapReadByte(IAP_ADDRESS) == 1)
{
P11 = 1; // 如果读取的数据是1 就点亮LED
}
while(1);
}
// 关闭IAP 寄存器设置成默认值
void IapIdle()
{
IAP_CONTR = 0; // 禁止IAP读/写/擦除Data Flash/EEPROM
IAP_CMD = 0; // 待机 无ISP操作
IAP_TRIG = 0; // 清除命令寄存器
IAP_ADDRH = 0x80; // 将地址位设置到非IAP区域
IAP_ADDRL = 0;
}
// 从ISP/IAP/EEPROM区域读取一字节
uchar IapReadByte(uchar addr)
{
uchar dat;
IAP_CMD = 0x01; //设置IAP命令 读
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; //返回
}
// 写一字节数据到ISP/IAP/EEPROM区域
void IapProgramByte(uchar addr, uchar dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_CMD = 0x02; //设置IAP命令 编程
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
// 擦除某一地址的数据
void IapEraseSector(uchar addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_CMD = 0x03; //设置IAP命令 擦除
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
上一篇:10.STC15W408AS单片机A/D转换器
下一篇:8.STC15W408AS单片机定时器/计数器
推荐阅读最新更新时间:2024-11-17 17:01
设计资源 培训 开发板 精华推荐
- CY4606 EZ-USB HX2LP 高速低功耗 USB 2.0 兼容 4 端口集线器参考设计套件
- 使用 Microchip Technology 的 LX1745-CPW 的参考设计
- 【ART-Pi】功能测试平台
- 使用 Endicott Research Group 的 SFD2KB4060F 的参考设计
- DER-637 - 35 W 高功率因数、隔离式反激式开关式谷填充 PFC LED 驱动器
- 基于 TD340 的低侧感应电机控制系统中的电流测量和限制
- 适用于 36V SLA 电池充电器的 LT3791HFE-1 2.5A 降压-升压 LED 驱动器的典型应用电路
- 使用 Analog Devices 的 LT1026CN8 的参考设计
- ADP7156ARDZ-1.8-R7 1.8V 输出电压、1.2A、超低噪声、高 PSRR、RF 线性稳压器的典型应用
- 德州仪器LMR23625
- 趣味电子技术史话栏目开播啦!第一集:白炽灯到底是谁发明的?
- 抢先体验:TI MSPM0L1306 LaunchPad开发套件,赢三模无线键盘
- EEWORLD社区月度奖励,赠E金币!
- 跟着电源达人一起动手做“高效率双向DC-DC变换器”
- 我与BeagleBone 有个约会!
- 安全在任何时候都是第一要素,你的嵌入式设计也是!诚邀参加英飞凌 OPTIGA™ Trust M 安全防御大揭秘!
- 6月4日上午10:00直播:英飞凌栅极驱动芯片的应用以及安富利对应的解决方案
- 【有奖活动】与春天有个约会--晒照片
- 有奖直播 | 罗彻斯特电子为您细说:半导体停产后的挑战与解决方案
- 【答题有礼】了解PI推出的全新LinkSwitch-XT2离线反激式开关电源IC产品系列