请教:STM8S因E2PROM不够,改用FLASH保存数据,但读数据时出错

2020-01-11 18:15发布

本帖最后由 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);       

此问题已困扰多日,希望各位大侠能帮忙看看,感谢万分!!!!!!!!!!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
way2888
1楼-- · 2020-01-11 19:58
/**************************************************/
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;
}
/**************************************************/
kebaojun305
2楼-- · 2020-01-12 01:31
 精彩回答 2  元偷偷看……
Cliver1028
3楼-- · 2020-01-12 06:26
kebaojun305 发表于 2018-1-12 08:55
你时啥时候读的。

因为是当E2PROM使用,所以是有需要时就会读取,并不是写的时候读
Cliver1028
4楼-- · 2020-01-12 11:26
way2888 发表于 2018-1-12 07:00
/**************************************************/
void Unlock(u32 address)
{   if(address >= FLAS ...

回头试下你的代码,谢谢

一周热门 更多>