如何用单片机读写FLASH?

2025-01-06 12:57:51
推荐回答(1个)
回答1:

就是这段程序了。我一直用的。不懂的可以找我

#define CMD_IDLE 0
#define CMD_READ 1
#define CMD_PROGRAM 2
#define CMD_ERASE 3
#define ENABLE_IAP 0X82// SYSCLK<24M
#define IAP_ADDRESS 0X0000

void IAP_Disable()//Make MCU if safe state
{
//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
IAP_CONTR = 0; //关闭IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
IAP_ADDRH = 0x80; // ??? 0x80 ????
IAP_ADDRL = 0;
}
//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
uchar Byte_Read(uint addr)
{
IAP_CONTR=ENABLE_IAP; //打开IAP 功能, 设置Flash 操作等待时间
IAP_CMD=CMD_READ; //IAP/ISP/EEPROM 字节读命令
IAP_ADDRL=addr; //设置目标单元地址的高8 位地址
IAP_ADDRH=addr>>8; //设置目标单元地址的低8 位地址
IAP_TRIG=0X5A;//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG=0XA5;//送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
IAP_Disable();//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态
return IAP_DATA;
}

//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
void Byte_Program(uint addr,uchar dat)
{
IAP_CONTR=ENABLE_IAP;//打开 IAP 功能, 设置Flash 操作等待时间
IAP_CMD=CMD_PROGRAM;//IAP/ISP/EEPROM 字节编程命令
IAP_ADDRL=addr;//设置目标单元地址的高8 位地址
IAP_ADDRH=addr>>8; //设置目标单元地址的低8 位地址
IAP_DATA=dat;//要编程的数据先送进IAP_DATA 寄存器
IAP_TRIG=0X5A;//先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
IAP_TRIG=0XA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
_nop_();
IAP_Disable();//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
}
void Sector_Erase(uint addr) //擦除扇区, 入口:DPTR = 扇区地址
{
IAP_CONTR=ENABLE_IAP;
IAP_CMD=CMD_ERASE;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
IAP_Disable();
}