【IoT】STC 内置 EEPROM 使用之 IAP

简介: 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);

}

卫朋

人人都是产品经理受邀专栏作家,CSDN 嵌入式领域新星创作者、资深技术博主。2020 年 8 月开始写产品相关内容,截至目前,人人都是产品经理单渠道阅读 56 万+,鸟哥笔记单渠道阅读200 万+,CSDN 单渠道阅读 210 万+,51CTO单渠道阅读 180 万+。

卫朋入围2021/2022年人人都是产品经理平台年度作者,光环国际学习社区首批原创者、知识合作伙伴,商业新知 2021 年度产品十佳创作者,腾讯调研云2022年达人榜第三名。

文章被人人都是产品经理、CSDN、华为云、运营派、产品壹佰、鸟哥笔记、光环国际、商业新知、腾讯调研云等头部垂直类媒体转载。文章见仁见智,各位看官可策略性选择对于自己有用的部分。

相关文章
|
8月前
|
网络协议 数据处理 数据格式
51单片机ESP8266云端通信的实现
51单片机ESP8266云端通信的实现
463 1
|
8月前
|
存储 安全 物联网
MCU
MCU
65 1
|
8月前
|
C# 内存技术
|
8月前
|
存储 传感器 算法
【Arduino环境下驱动合宙esp32c3单片机基本外设】
【Arduino环境下驱动合宙esp32c3单片机基本外设】
531 1
|
传感器 存储 芯片
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
361 0
|
智能硬件
STM32智能家居(4)ESP8266连接WIFI
STM32智能家居(4)ESP8266连接WIFI
728 0
|
传感器 芯片
可编程 USB 转串口适配器开发板 与温湿度传感器芯片
SHT3x-DIS 是 IIC 接口的温度、湿度传感器芯片,可工作于单次测量或连续自动测量模式。USB2S 已有 1 片 SHT31-DIS 芯片,芯片地址为 0x88。
可编程 USB 转串口适配器开发板 与温湿度传感器芯片
|
物联网
【ESP8266-NodeMCU软硬串口通讯】
【ESP8266-NodeMCU软硬串口通讯】
395 0