本帖最后由 Cliver1028 于 2018-1-11 23:30 编辑
STM8S因E2PROM不够,改用FLASH保存数据,但读数据时出错
1、使用FLASH最后256个字节保存数据,写入数据0~255,如下图,断电后用ST Visual Programmer也读取到相同数据,所以数据确实已写入且正确
2.jpg (126.93 KB, 下载次数: 0)
下载附件
2018-1-11 23:18 上传
读取数据代码如下:尝试过加延时或不加延时,没有使能读写保护选项,下面代码中注释掉的几行代码试过打开或不打开,结果都一样,每次出错的都是第96个字节到第127个字节
//FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
//FLASH_Unlock(FLASH_MEMTYPE_PROG);
for(stuOffset=0;stuOffset<=255;stuOffset++)
{
tstubuff[stuOffset]=FLASH_ReadByte(MCU_FLASH_START_ADDRESS+stuOffset);
Delay_1ms(10);
}
//FLASH_Lock(FLASH_MEMTYPE_PROG);
此问题已困扰多日,希望各位大侠能帮忙看看,感谢万分!!!!!!!!!!!!!
void Unlock(u32 address)
{ if(address >= FLASH_START)
{ FLASH_PUKR= 0x56;
FLASH_PUKR= 0xae;
}
else
{ FLASH_DUKR= 0xae;
FLASH_DUKR= 0x56;
}
}
/**************************************************/
void Lock(u32 address)
{ if(address >= FLASH_START)
{ FLASH_IAPSR_bit.PUL= 0;
}
else
{ FLASH_IAPSR_bit.DUL= 0;
}
}
/**************************************************/
void Read(u32 address,u8 *buf,u16 number)
{ u8 __far *ptr= (__far u8*) address;
for(u16 i=0;i<number;i++)
{ *buf++= *ptr++;
}
}
/**************************************************/
__ramfunc void ProgramBlock(u32 address,u8 *buf)
{ u8 __far *ptr= (__far u8*) address;
FLASH_CR2_bit.PRG= 1;
FLASH_NCR2_bit.NPRG= 0;
for(u8 i=0;i<BLOCK_SIZE;i++)
{ *ptr++= buf[i];
}
while(!FLASH_IAPSR_bit.HVOFF);
FLASH_CR2_bit.PRG= 0;
FLASH_NCR2_bit.NPRG= 1;
}
/**************************************************/
u8 VerifiyBlock(u32 address,u8 *buf,u16 number)
{ u8 __far *ptr= (__far u8*) address;
for(u8 i=0;i<number;i++)
{ if(*ptr++ != buf[i])
{ return false;
}
}
return true;
}
/**************************************************/
u8 ProgramAndVerifiyBlock(u32 address,u8 *buf)
{ u8 pass=false;
if(address>=FLASH_START && address<(FLASH_START+BOOT_SIZE)) return true;
if(VerifiyBlock(address,buf,BLOCK_SIZE)) return true;
Unlock(address);
for(u8 i=0;i<3;i++)
{ ProgramBlock(address,buf);
if(VerifiyBlock(address,buf,BLOCK_SIZE))
{ pass= true;
break;
}
}
Lock(address);
return pass;
}
/**************************************************/
u8 ProgramOptionByte(u16 address,u8 *buf,u16 number)
{ Unlock(address);
FLASH_CR2_bit.OPT= 1;
FLASH_NCR2_bit.NOPT= 0;
for(u16 i=0;i<number;i++)
{ *((u8*)(address+i)) = buf[i];
if(address+i > OPTION_END) return false;
}
while(!FLASH_IAPSR_bit.HVOFF);
FLASH_CR2_bit.OPT= 0;
FLASH_NCR2_bit.NOPT= 1;
Lock(address);
if(!VerifiyBlock(address,buf,number)) return false;
return true;
}
/**************************************************/
u8 Program(u32 address,u8 *buf,u16 number)
{ if(address>=OPTION_START && address<=OPTION_END)
{ if(!ProgramOptionByte(address,buf,number)) return false;
}
else
{ u8 temp[BLOCK_SIZE];
u32 blockaddr= address/BLOCK_SIZE;
blockaddr*= BLOCK_SIZE;
if(blockaddr != address)
{ Read(blockaddr,temp,BLOCK_SIZE);
for(u16 i=address;i<(blockaddr+BLOCK_SIZE) && number>0;i++)
{ temp[address-blockaddr]= *buf++;
address++;
number--;
}
if(!ProgramAndVerifiyBlock(blockaddr,temp)) return false;
}
while(number >= BLOCK_SIZE)
{ if(!ProgramAndVerifiyBlock(address,buf)) return false;
address+= BLOCK_SIZE;
buf+= BLOCK_SIZE;
number-= BLOCK_SIZE;
}
if(number > 0)
{ Read(address,temp,BLOCK_SIZE);
for(u16 i=0;i<number;i++)
{ temp[i]= *buf++;
}
if(!ProgramAndVerifiyBlock(address,temp)) return false;
}
}
return true;
}
/**************************************************/
因为是当E2PROM使用,所以是有需要时就会读取,并不是写的时候读
回头试下你的代码,谢谢
一周热门 更多>