中易网

IAP15f2k61s2单片机 的EEPROM程序可以给借鉴一下吗

答案:1  悬赏:80  
解决时间 2021-01-18 07:05
  • 提问者网友:浪荡绅士
  • 2021-01-17 17:23
IAP15f2k61s2单片机 的EEPROM程序可以给借鉴一下吗
最佳答案
  • 二级知识专家网友:慢性怪人
  • 2021-01-17 18:59
你看下 这个是可以用的


#include "STC15F2Kxx.h"
#include "LED.H"
#include "Delay.h"
#include "intrins.h"

#define CMD_IDLE 0x00 //空闲模式
#define CMD_READ 0x01 //IAP字节读命令
#define CMD_PROGRAM 0x02 //IAP字节编程命令
#define CMD_ERASE 0x03 //IAP扇区擦除命令

//#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
//#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz

unsigned char IapReadByte(unsigned int addr);
void IapProgramByte(unsigned int addr, unsigned char dat);
void IapEraseSector(unsigned int addr);


void main(void)
{
unsigned int i=0;

Timer0_Init_Config();//定时器0 16位自动重载模式初始配置

while(1)
{

LED_ON();//点亮LED.P21
IapEraseSector(0x0000);//扇区擦除
Delay_Nms(10);//延时10ms
for(i=0; i<512; i++)//检测是否擦除成功(全FF检测)
{
if(IapReadByte(0x0000+i) != 0xff)//如果擦除失败
{
LED_OFF();//点亮LED.P21
goto ERROR;
}
}
Delay_Nms(10);//延时10ms
for(i=0; i<512; i++)//编程512字节
{
IapProgramByte(0x0000+i, (unsigned char)i);//写一字节数据到ISP/IAP/EEPROM指定地址

}
Delay_Nms(10);//延时10ms
for (i=0; i<512; i++)//校验512字节
{
if(IapReadByte(0x0000+i) != (unsigned char)i)//如果数据写入失败
{
LED_OFF();//点亮LED.P21
goto ERROR;
}
}
LED_OFF(); //点亮LED.P21
Delay_Nms(500);//延时10ms
}
ERROR://如果操作失败
while(1)
{
LED_ON(); //点亮LED.P21
Delay_Nms(250);//延时10ms
LED_OFF(); //点亮LED.P21
Delay_Nms(250);//延时10ms
}
}


void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}


unsigned char IapReadByte(unsigned int addr)
{
unsigned char dat; //数据缓冲区

IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //设置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; //返回
}


void IapProgramByte(unsigned int addr, unsigned char dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //设置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(unsigned int addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_ERASE; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息