【IoT】STC 内置 EEPROM 使用之 IAP
STC89C51、52 内部都自带有2K字节的 EEPROM,54、55和58都自带有 16K 字节的 EEPROM,STC单片机是利用 IAP 技术实现的 EEPROM,内部Flash擦写次数可达 100000 次以上。
1、ISP 与 IAP 介绍
ISP:
In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。
比如我们通过电脑给 STC 单片机下载程序,或给 AT89S51 单片机下载程序,这就是利用了 ISP 技术。
IAP:
In Application Programable 是指在应用编程,芯片提供一系列的机制(硬件/软件上的),当片子在运行程序的时候可以提供一种改变 flash 数据的方法,可以通过代码往程序存储器里写数据或修改数据。
这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的 ISP 功能就是通过 IAP 技术来实现的,即片子在出厂前就已经有一段小的 boot 程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。
2、示例
以 STC8F2K08S2 为例:
-
#include "reg51.h"
-
#include "intrins.h"
-
-
//测试工作频率为11.0592MHz
-
-
sfr IAP_DATA = 0xC2;
-
sfr IAP_ADDRH = 0xC3;
-
sfr IAP_ADDRL = 0xC4;
-
sfr IAP_CMD = 0xC5;
-
sfr IAP_TRIG = 0xC6;
-
sfr IAP_CONTR = 0xC7;
-
-
#define WT_30M 0x80
-
#define WT_24M 0x81
-
#define WT_20M 0x82
-
#define WT_12M 0x83
-
#define WT_6M 0x84
-
#define WT_3M 0x85
-
#define WT_2M 0x86
-
#define WT_1M 0x87
-
-
void IapIdle()
-
{
-
IAP_CONTR = 0; //关闭IAP功能
-
IAP_CMD = 0; //清除命令寄存器
-
IAP_TRIG = 0; //清除触发寄存器
-
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
-
IAP_ADDRL = 0;
-
}
-
-
char IapRead(int addr)
-
{
-
char dat;
-
-
IAP_CONTR = WT_12M; //使能IAP
-
IAP_CMD = 1; //设置IAP读命令
-
IAP_ADDRL = addr; //设置IAP低地址
-
IAP_ADDRH = addr >> 8; //设置IAP高地址
-
IAP_TRIG = 0x5a; //写触发命令(0x5a)
-
IAP_TRIG = 0xa5; //写触发命令(0xa5)
-
_nop_();
-
dat = IAP_DATA; //读IAP数据
-
IapIdle(); //关闭IAP功能
-
-
return dat;
-
}
-
-
void IapProgram(int addr, char dat)
-
{
-
IAP_CONTR = WT_12M; //使能IAP
-
IAP_CMD = 2; //设置IAP写命令
-
IAP_ADDRL = addr; //设置IAP低地址
-
IAP_ADDRH = addr >> 8; //设置IAP高地址
-
IAP_DATA = dat; //写IAP数据
-
IAP_TRIG = 0x5a; //写触发命令(0x5a)
-
IAP_TRIG = 0xa5; //写触发命令(0xa5)
-
_nop_();
-
IapIdle(); //关闭IAP功能
-
}
-
-
void IapErase(int addr)
-
{
-
IAP_CONTR = WT_12M; //使能IAP
-
IAP_CMD = 3; //设置IAP擦除命令
-
IAP_ADDRL = addr; //设置IAP低地址
-
IAP_ADDRH = addr >> 8; //设置IAP高地址
-
IAP_TRIG = 0x5a; //写触发命令(0x5a)
-
IAP_TRIG = 0xa5; //写触发命令(0xa5)
-
_nop_(); //
-
IapIdle(); //关闭IAP功能
-
}
-
-
void main()
-
{
-
IapErase(0x0400);
-
P0 = IapRead(0x0400); //P0=0xff
-
IapProgram(0x0400, 0x12);
-
P1 = IapRead(0x0400); //P1=0x12
-
-
while (1);
-
}
refer:
https://www.cnblogs.com/shiningrise/p/7906873.html
文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/liwei16611/article/details/93751033
- 点赞
- 收藏
- 关注作者
评论(0)