你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103C8T6 FLASH读写问题

[复制链接]
AngryCat 提问时间:2018-8-15 18:46 /
把STM32F103C8T6 多余的FLASH (((uint32_t)0x0800FC00)) 拿来做存储(在这认为就是EEPROM了),上电后正常读写EEPROM,不掉点情况下复位 能正常读取之前保存的数据;  但是,如果是重新上电(掉电)的话,初始化读取出来的数据全都是FF 了。
有人遇到过这种情况吗?
收藏 评论7 发布时间:2018-8-15 18:46

举报

7个回答
huangyanga 回答时间:2018-8-15 19:28:50
FLASH是有读写次数的哟,好像是只有1万次,你看下超过了没有

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-8-15 19:33:36
这个应该使用ST官方推出的EEPROM仿真例程:
EEPROM_Emulation.rar (9.6 KB, 下载次数: 320)

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

AngryCat 回答时间:2018-8-15 22:43:35
huangyanga 发表于 2018-8-15 19:28
FLASH是有读写次数的哟,好像是只有1万次,你看下超过了没有

新的主芯片,而且试了5、6片都一样。应该是10万次吧。
feixiang20 回答时间:2018-8-15 22:59:22
看看你的初始化和配置,是不是重新上电被清除了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

AngryCat 回答时间:2018-8-15 23:18:48
feixiang20 发表于 2018-8-15 22:59
看看你的初始化和配置,是不是重新上电被清除了

可是不断电的情况下是可以正常读取的(也就是说没有被清除)。
#define         EEPROM_START_ADDR    ((uint32_t)0x0800FC00)                        //  63/63
#define                EEPROM_SIZE                                                256                       
/*               
================================================================================
描述 : 读取模拟eeprom中的数据
输入 : start_addr--模拟的EEPROM地址,从0开始
输出 :
================================================================================
*/
void EEPROM_Read(u32 start_addr, u32 size, u8 *out_buff)
{
        static u8 back_up_buff[EEPROM_SIZE]={0};
        u32 i,read_data;
        if(start_addr+size>EEPROM_SIZE)//范围检查
        {
                return;
        }
        for(i=0; i<EEPROM_SIZE; i+=4)
        {
                read_data=*(vu32*)(EEPROM_START_ADDR+i);
                memcpy(&back_up_buff, &read_data, 4);
        }       
       
        memcpy(out_buff, &back_up_buff[start_addr], size);
//        printf_hex(back_up_buff, sizeof(back_up_buff));
}



/*               
================================================================================
描述 : 往模拟EEPROM中写数据
输入 : start_addr--模拟的EEPROM地址,从0开始
输出 :
================================================================================
*/
void EEPROM_Write(u32 start_addr, u8 *buff, u32 size)
{
        u32 i;
        if(start_addr+size>EEPROM_SIZE)//范围检查
        {
                return;
        }       
        FLASH_Unlock();//解锁       
        EEPROM_Read(0, EEPROM_SIZE, g_u8BackUp);//备份       
        memcpy(&g_u8BackUp[start_addr], buff, size);//复制替换
        FLASH_ErasePage(EEPROM_START_ADDR);//擦除
        for(i=0; i<EEPROM_SIZE; i+=4)
        {
                FLASH_ProgramWord(EEPROM_START_ADDR+i, *(vu32*)&g_u8BackUp);
        }       
//        printf_hex(g_u8BackUp, sizeof(g_u8BackUp));
        FLASH_Lock();//锁定
}
罹凝寒冰 回答时间:2019-5-29 16:36:31
最后怎么解决了?我也是C6T6,仿真看我flash的确写成功了,也读出来是对的 ,但是重新上电的话我写的东西就没了 变成了程序默认的数据
AngryCat 回答时间:2019-6-6 15:39:54
罹凝寒冰 发表于 2019-5-29 16:36
最后怎么解决了?我也是C6T6,仿真看我flash的确写成功了,也读出来是对的 ,但是重新上电的话我写的东西就 ...

后来发现是 调试用的串口线在捣鬼,因为usb转TTL的串口线中TX是有一定的驱动能力的,如果设备断电后,但是串口线还插着,那么这时候的flash就会被擦除(固件的flash不会被擦除,仅仅是模拟eeprom那部分的flash)。我只是观察到有这个现象,但是根本原因不详。另外,解决的办法就是串口的TX、RX接上拉电阻就行了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版