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

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, 下载次数: 301)

评分

参与人数 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版