打印
[STM32F0]

STM32F030模拟EEpROM存储问题

[复制链接]
3801|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Othink|  楼主 | 2015-11-16 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Othink 于 2015-11-16 16:47 编辑

我利用官方的EEPROM的例程,存储11个数据,发现再次上电时出现读取不正确,在别的项目中我存三个数据好像没出现这样的问题,请问有人遇到过么??
单片机是STM32F030 64脚的那款
沙发
Othink|  楼主 | 2015-11-16 16:51 | 只看该作者

用的是ST官方的AN2594这个例程

使用特权

评论回复
板凳
lanlan| | 2015-11-18 15:47 | 只看该作者
能多给一些信息吗?比如EEPROM的Flash 开始位置定义,写的是什么数,什么格式,有没有对函数的返回值进行分析,断电前是否对写入的数据读出来验证过,当时是否是对的。重新上电后读到的是什么数呢?

使用特权

评论回复
地板
diweo| | 2015-11-18 16:35 | 只看该作者
用编程器直接读取,看看确实是写错了,还是你的读程序的问题。

使用特权

评论回复
5
lu50211| | 2015-11-19 13:28 | 只看该作者
uint32_t EEP_Read_Byte(uint32_t Address)
{
    uint32_t Temp = *(__IO uint32_t *)Address;
    return Temp;
}

void EEPROM_Init(void)
{
    uint8_t  i,Flag;
    uint32_t Address;
    uint32_t Temp[4];
    Address = EEP_Start_Address;
    Temp[0] = *(__IO uint32_t *)Address;
    Flag = (Temp[0] & 0xff000000) >> 24;
    if(Flag != 0x55)
    {
        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR);
        FLASH_ErasePage(EEP_Start_Address);
        Address = EEP_Start_Address;
        FLASH_ProgramWord(Address,0x55050505);
        for(i = 0;i < 3;i++)
        {
            Address += 4;
            FLASH_ProgramWord(Address,((170 << 16) + 170));   
        }
        FLASH_Lock();
    }

    Address = EEP_Start_Address;
    for(i = 0;i < 4;i++)
    {
        Temp[i] = *(__IO uint32_t *)Address;
        Address += 4;
    }
    Set_Time_Heat[0] = (Temp[0] & 0x000000ff);
    Set_Time_Heat[1] = (Temp[0] & 0x0000ff00) >> 8;
    Set_Time_Heat[2] = (Temp[0] & 0x00ff0000) >> 16;
    Set_Temp[0] = Temp[1] >> 16;
    Set_Temp[1] = Temp[1] & 0xffff;
    Set_Temp[2] = Temp[2] >> 16;
    Set_Temp[3] = Temp[2] & 0xffff;
    Set_Temp[4] = Temp[3] >> 16;
    Set_Temp[5] = Temp[3] & 0xffff;
}
//====================================================================
void EEPROM_Write_Byte(void)
{
    uint8_t  i;
    uint32_t Address,Temp;
    FLASH_Unlock();
    FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPERR);
    FLASH_ErasePage(EEP_Start_Address);
    Address = EEP_Start_Address;
    Temp = ((0x55             << 24) + \
            (Set_Time_Heat[2] << 16) + \
            (Set_Time_Heat[1] << 8 ) + \
             Set_Time_Heat[0]);
    FLASH_ProgramWord(Address,Temp);
    for(i = 0;i < 3;i++)
    {
        Address += 4;
        FLASH_ProgramWord(Address,((Set_Temp[i * 2] << 16) + Set_Temp[(i * 2) + 1]));         
    }
    FLASH_Lock();
}

使用特权

评论回复
6
ereck| | 2016-1-18 10:04 | 只看该作者
5楼的程序,验证过吗

使用特权

评论回复
7
天灵灵地灵灵| | 2016-1-18 13:34 | 只看该作者
扩展-IAP主要用于产品出厂后应用程序的更新作用。。估计就是这个功能。在软件里可以操作Flash

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

39

帖子

0

粉丝