单片机EEPROM读写程序

合集下载

24C02读写程序

24C02读写程序

HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。

HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。

HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。

一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。

另外两个管脚为电源脚VCC,VSS。

用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。

引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。

stc单片机eeprom读写程序

stc单片机eeprom读写程序

stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。

eeprom读写程序详解

eeprom读写程序详解

eeprom读写程序详解EEPROM(Electrically Erasable Programmable Read-Only Memory) 是一种可编程只读存储器,可以在电信号的作用下进行擦写和改写。

它通常用于存储单片机或其他嵌入式系统中的数据、设置参数、配置文件等。

对于 EEPROM 的读写程序,需要考虑以下几个方面:1. 读操作:读操作通常包括以下步骤:- 等待上次读操作完成。

- 获取要读取的数据的单元地址。

- 将 EEPGD 位和 CFGS 位清零。

- 启动读操作控制位 RD。

- 等待本次读操作完成。

- 将该单元地址中对应的数据返回。

在读取 EEPROM 数据时,为了避免芯片在一瞬间无法获取到数据,需要给芯片一定的时间来稳定获取数据。

因此,在读取操作中需要加入等待步骤。

2. 写操作:写操作通常包括以下步骤:- 等待上次写操作完成。

- 获取要写的数据的单元地址。

- 将要写的数据写入 EEPROM 的单元中。

- 将 EEPGD 位和 CFGS 位清零。

- 启动写操作控制位 WP。

- 等待写操作完成。

在写操作中,为了确保数据的可靠性,需要将要写的数据写入EEPROM 的单元中,并等待写操作完成。

同时,在写操作过程中,需要注意避免对无关的单元进行写操作,以免损坏 EEPROM 芯片。

3. 中断处理:在 EEPROM 的读写操作中,通常需要加入中断处理机制,以便在读写过程中及时响应和处理异常情况。

例如,在读取 EEPROM 数据时,如果 EEPROM 芯片出现故障,可能会导致读取失败。

为了避免这种情况,可以在读取操作中加入中断处理机制,在读取失败时及时报警或采取相应的应对措施。

总之,EEPROM 读写程序的实现需要考虑多个方面的因素,包括读操作、写操作、中断处理等。

同时,需要考虑 EEPROM 芯片的特性和限制,以便实现高效、稳定、可靠的 EEPROM 读写操作。

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。

因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。

一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。

与Flash存储器相比,EEPROM具有更快的写入和擦除速度。

在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。

二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。

通过设置相关寄存器,设置I2C 总线的速度和地址。

2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送读命令:向EEPROM发送读命令,以启动读操作。

5. 读取数据:从EEPROM中读取数据,并保存到变量中。

6. 结束读操作:完成读操作后,关闭I2C总线。

三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。

2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。

3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。

4. 发送写命令:向EEPROM发送写命令,以启动写操作。

5. 写入数据:将要写入EEPROM的数据发送到I2C总线。

6. 结束写操作:完成写操作后,关闭I2C总线。

四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。

AVR单片机EEPROM读写过程

AVR单片机EEPROM读写过程

EEPROM: 单片机内部可用软件读写的数据存储空间,掉电后数据不丢失,可擦写10万次。

ATmega16 内部有512字节的EEPROM数据空间,地址空间由0-511,由EEPROM 地址寄存器EEAR指定,数据寄存器EEDR用于存储要读写的数据。

写操作步骤:
一、查询上一个数据是否写完:while (EECR&(1<<EEWE)) ; //如果EEWE位为1,就在原地等待
二、将要写如数据的地址送到EEAR: EEAR=address(范围0-0x1ff) ;
三、把要写入的数据送到EEDR: EEDR=data;
四、主机写入允许:EECR|=(1<<EEMWE);
五、启动写入:EECR|=(1<<EEWE);
读操作步骤:
一、等待上一个数据写完:while(EECR&(1<<EEWE));
二、指定要读出数据的地址:EEAR=adress;
三、使能读:EECR|=(1<<EERE);
四、从EEDR中读取数据:data=EEDR;
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。

51单片机EEPROM的读写

51单片机EEPROM的读写

51单片机EEPROM的读写D#include "my51.h"/******************定义命令字节******************/#define read_cmd 0x01 //字节读数据命令#define wirte_cmd 0x02 //字节编程数据命令#define erase_cmd 0x03 //扇区擦除数据命令/****************特殊功能寄存器声明****************/sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;/*定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数******************///#define enable_waitTime 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值#define enable_waitTime 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define enable_waitTime 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值void ISP_IAP_disable(void) //关闭ISP_IAP{EA=1; //恢复中断ISP_CONTR = 0x00;ISP_CMD = 0x00;ISP_TRIG = 0x00;}void ISP_IAP_trigger() //触发{EA=0;//下面的2条指令必须连续执行,故关中断ISP_TRIG = 0x46; //送触发命令字0x46ISP_TRIG = 0xB9; //送触发命令字0xB9}void ISP_IAP_readData(u16 beginAddr, u8* pBuf, u16 dataSize) //读取数据{ISP_DATA=0; //清零,不清也可以ISP_CMD = read_cmd; //指令:读取ISP_CONTR = enable_waitTime; //开启ISP_IAP,并送等待时间while(dataSize--) //循环读取{ISP_ADDRH = (u8)(beginAddr >> 8); //送地址高字节I SP_ADDRL = (u8)(beginAddr & 0x00ff);//送地址低字节ISP_IAP_trigger(); //触发beginAddr++; //地址++*pBuf++ = ISP_DATA; //将数据保存到接收缓冲区}ISP_IAP_disable(); //关闭ISP_IAP功能}void ISP_IAP_writeData(u16 beginAddr,u8*pDat,u16 dataSize) //写数据{ISP_CONTR = enable_waitTime; //开启ISP_IAP,并送等待时间ISP_CMD = wirte_cmd; //送字节编程命令字while(dataSize--){ISP_ADDRH = (u8)(beginAddr >> 8); //送地址高字节ISP_ADDRL = (u8)(beginAddr & 0x00ff);//送地址低字节ISP_DATA = *pDat++; //送数据beginAddr++;ISP_IAP_trigger(); //触发}ISP_IAP_disable(); //关闭}void ISP_IAP_sectorErase(u16 sectorAddr) //扇区擦除{ISP_CONTR = enable_waitTime; //开启ISP_IAP;并送等待时间ISP_CMD = erase_cmd; //送扇区擦除命令字ISP_ADDRH = (u8)(sectorAddr >> 8);//送地址高字节ISP_ADDRL = (u8)(sectorAddr & 0X00FF);//送地址低字节ISP_IAP_trigger(); //触发ISP_IAP_disable();//关闭ISP_IAP功能}void main() //测试{u8 buf[3]={0}; //接收数据缓冲区u8dat[5]={b(111010),b(1001),b(1),b(1011),b( 1110)};//我写成二进制是为观察led灯ISP_IAP_sectorErase(0x2000); //扇区擦除,一块512字节ISP_IAP_writeData(0x21f0,dat,sizeof(dat));//写EEPROMISP_IAP_readData(0x21f0,buf,sizeof(buf)); //读取P1=buf[2];//在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010while(1); //所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先擦除为0xff}#ifndef _MY51_H#define _MY51_H#include <reg52.h>//#include <math.h>#include <intrins.h>#include <stdio.h>#include "mytype.h"/*************二进制输入宏****************************/#ifndef _LongToBin_#define _LongToBin_#define LongToBin(n) \( \((n >> 21) & 0x80) | \((n >> 18) & 0x40) | \((n >> 15) & 0x20) | \((n >> 12) & 0x10) | \((n >> 9) & 0x08) | \((n >> 6) & 0x04) | \((n >> 3) & 0x02) | \((n ) & 0x01) \)#define bin(n) LongToBin(0x##n##l)#define BIN(n) bin(n)#define B(n) bin(n)#define b(n) bin(n)#endif/*************单个数据位的置位宏*********************/#ifndef _BIT_#define _BIT_#define BIT(n) (1<<n)#define bit(n) BIT(n)#endif#define high 1 //高电平#define low 0 //低电平#define led P1 //灯总线控制sbit led0=P1^0; //8个led灯,阴极送低电平点亮sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定sbit beep=P2^3; //蜂鸣器void delayms(u16 ms);//void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085///////////////////////////////////////// ////////////////////////////////////#endif。

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。

首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。

在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。

然后,可以使用相应的读写函数对AT24C02进行读写操作。

对于读操作,需要指定读取的地址和数据长度。

可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。

读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。

对于写操作,同样需要指定写入的地址和数据。

可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。

写入操作完成后,要记
得进行等待,等待数据写入完成。

需要注意的是,AT24C02有一定的写入周期,写入速度较慢。

因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。

本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。

总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。

通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。

51单片机读写内部EEPROM详解

51单片机读写内部EEPROM详解
*/
程序2:
/***************************************************************
作品:EEPROM实验,开机还原关电前LED的亮灭状况
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
#define uchar unsigned char
#define uint unsigned int
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
{
uchar V;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
V = dcx(0x2002);// 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2){LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uint iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清空低 3 位 */
/* 指向下一个字节 */
/* ========================= 扇区读出 ========================= */
/* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */
void ArrayRead(uint begin_addr, uchar len){
// uchar xdata data_buffer[];
/* 整个扇区读取缓存区 */
uint iSectorAddr;
uint i;
iSectorAddr = begin_addr; // & 0xfe00;
/* 取扇区地址 */
ISP_IAP_enable(); for(i = 0; i < len; i++){
ISP_DATA = 0;
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
Ttotal[i] = ISP_DATA; iSectorAddr++; } ISP_IAP_disable(); }
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 比较对错 */ if(ISP_DATA != array[i]){
ISP_IAP_disable(); return Error; } in_addr++; } ISP_IAP_disable(); return Ok; }
return Error;
}
in_addr = begin_addr;
/* 逐个写入并校对 */
ISP_IAP_enable();
/* 打开 IAP 功能 */
for(i = 0; i< len; i++){
/* 写一个字节 */
ISP_ADDRH = (uchar)(in_addr >> 8);
ISP_ADDRL = (uchar)(in_addr & 0x00ff);
/* 关闭 IAP 功能 */
/* ==============================================================
从 eeprom 中读取数据
=================================================打开 ISP,IAP 功能 */
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
}
/* ==================== 字节读 ======================== */ uchar byte_read(uint byte_addr){
#define WaitTime 0x01
/* ================ 打开 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void){
EA = 0;
/* 关中断
*/
ISP_CONTR = ISP_CONTR & 0x18;
/* 0001,1000 */
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 取地址 */ ISP_ADDRL = (uchar)(byte_addr & 0xff);
ISP_CMD = ISP_CMD & 0xf8; ISP_CMD = ISP_CMD | PrgCommand; ISP_DATA = original_data;
ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
ISP_CONTR = ISP_CONTR | 0x80;
/* ISPEN=1
*/
}
/* =============== 关闭 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void){
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令 3 */
ISPgoon(); ISP_IAP_disable();
/* 触发执行
*/
/* 关闭 ISP,IAP 功能 */
}
/* ==================== 字节写 ======================== */ void byte_write(uint byte_addr, uchar original_data){
uint i; uint in_addr;
/* 判是否是有效范围,此函数不允许跨扇区操作 */
if(len > PerSector){
return Error;
}
in_addr = begin_addr & 0x01ff;
/* 扇区内偏移量 */
if((in_addr + len) > PerSector){
ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = (uchar)(iSectorAddr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
/* 写命令 2 */
ISP_DATA = original_data;
/* 写入数据准备 */
ISPgoon(); ISP_IAP_disable(); }
/* 触发执行
*/
/* 关闭 IAP 功能 */
/* =================== 字节写并校验 =================== */ uchar byte_write_verify(uint byte_addr, uchar original_data){
void DataRestore()
{
EepromPtr = BaseAddr;
/* 触发 ISP_IAP 命令字节 1 */ /* 触发 ISP_IAP 命令字节 2 */
/* 读回来 */ ISP_DATA = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | RdCommand;
/* 读命令 1 */
if(ISP_DATA == original_data){ return Ok;
} else{
return Error; } }
/* 读写数据校验 */ /* 返回校验结果 */
/* ===================== 数组写入 ===================== */ uchar ArrayWrite(uint begin_addr, uint len, uchar *array){
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
0x08,
0x09,
0x0a,
0x0b,
0x0c,
0x0d,
0x0e,
0x0f,
};
uint timerForDelay, i, EepromPtr;
/* 专供延时用的变量 */
/* 循环变量
*/
/* eeprom 读写指针 */
/* --------------- 命令定义 --------------- */
ISP_DATA = array[i];
/* 取数据 */
ISP_CMD = ISP_CMD & 0xf8;
/* 清低 3 位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();
ISP_ADDRH = (uchar)(byte_addr >> 8); /* 地址赋值 */ ISP_ADDRL = (uchar)(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(uint sector_addr){
相关文档
最新文档