OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13597|回复: 8

STM32 内部 FLASH 模拟 EEPROM的怪问题请教

[复制链接]

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
发表于 2013-5-27 17:35:29 | 显示全部楼层 |阅读模式
使用的是 STM32F103C8xx  (64K FLASH) ,  引用mini的FLASH读写代码  .

写入代码 :

#define FLASH_SAVE_ADDR  0X0800C800     //使用50K以后的地址(上限为64K)
...
u16  IR_BUFFER[150];       //一次读写150字节 ,  而实际将会占用300个字元地址.
u8   item,index;
u32  addr;
...
addr=(item-1)*600+(index-1)*300+100;    // item与index的变化顺序为 item=1,index=1 -> item=1,index=2 -> item=2,index=1 -> item=2,index=2 .......item=9,index=2
                                                           //  +100是为了保留了前面50个字节储放特别参数用
STMFLASH_Read(FLASH_SAVE_ADDR+addr,&IR_BUFFER[0],150);       // 写入放于IR_BUFFERP[]接收到的150个字节的红外码高低电平
........
.......


读取代码 :
...
addr=(item-1)*600+(index-1)*300+100;    // item与index的变化顺序为 item=1,index=1 -> item=1,index=2 -> item=2,index=1 -> item=2,index=2 .......item=9,index=2
STMFLASH_Read(FLASH_SAVE_ADDR+addr,&IR_BUFFER[0],150);   //将已储存的对应组资料(150个字节)读入至IR_BUFFER[]
...


整个源代码使用MDK4.12编译如下, 整个代码空间使用不到15K .
Build target 'Target 1'
linking...
Program Size: Code=8650 RO-data=1682 RW-data=20 ZI-data=1948  
FromELF: creating hex file...
"TEST.axf" - 0 Error(s), 0 Warning(s).



问题 :

    1.   FLASH可写入启始位置(
0X0800C800), 为什么设不一样时, 能成功写进再成功读出完全相同数据的机会不一样 . 
         (如果用0X800C800, 可以成功写入10组以上数据 , 以上item及index组合共18组,  如果基底地址改成
0X800C000或0X800D000或其它64K范围内地址,
         大概只能 "写入及读取成功" 不到5组 ,  不知道是为什么?)

    2.  单步仿真来看,  每一组都有做 FLASH写入的动作.    但追踪读出的部份,  很多全是只会读到一整片0Xffff  .

目前计划是找别的flash读写函式库再套上去试看看.   我确定读写地址一定没有超过64K,  也都是偶数地址 .       但是感觉失败率很高.
特别是基底地址设不同时,  就有不同结果 .      请教各位不知道怎么来追查这个问题  ??    感谢 !!!

























正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-28 00:16:34 | 显示全部楼层
我们的战舰板有个flash模拟eeprom的例程,楼主参考下试试吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
 楼主| 发表于 2013-5-28 07:09:54 | 显示全部楼层
谢谢板主提供建议!

但我的FLASH代码就是直接使用战舰版的,  完全未改过 .

看来我得再找找其它办法 ..
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
 楼主| 发表于 2013-5-28 12:59:35 | 显示全部楼层
今天再测试, 当基底位置使用 "#define FLASH_SAVE_ADDR  0X0800C400" 时,  可以正常记忆18个按键值 (每个按键150个字节) .

如果使用 "#define FLASH_SAVE_ADDR  0X0800C800",  最后一组按键记忆读回来永远是0XFFFF .

又如果使用 "#define FLASH_SAVE_ADDR  0X0800D000" 这地址,  则中间的按键值有好几个读回来永远是0XFFFF .

所以,  如果需要使用1K以上的FLASH空间当成EEPROM, 建议基地地址最好是设为 "0X0800C400" 或 "0X0800C800" 这样的地址.

原因为何?     我还没有找到 !!    提供做参考 .
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2013-5-28 19:11:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
 楼主| 发表于 2013-5-28 22:10:37 | 显示全部楼层
谢谢提醒 .

C800(16) = 51200(10) = 50K 开始的地址 .

每个KEY占用150字节 = 300字元 .

64-50 = 14 (K)  / 300 = 47  ,  至少可以记忆47组数据 .  实际我只用了18组 .  

就是抓不到问题,  写入不稳定.   只能再找时间试看看别的FLASH读写函式库来验证看看是否为战舰版函式的问题 .
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-6-18
在线时间
0 小时
发表于 2013-6-18 14:18:34 | 显示全部楼层
每页前面?4?字节保留,其中前?2?字节是该页状态标志。 有没有可能是这个原因?
回复 支持 反对

使用道具 举报

4

主题

119

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-6
在线时间
3 小时
 楼主| 发表于 2013-6-19 09:43:32 | 显示全部楼层
回复【7楼】luole700:

每页前面 4 字节保留,其中前 2 字节是该页状态标志。 有没有可能是这个原因?

---------------------------------

我再一次看了一遍原子关于FLASH模拟EEPROM的章节,  似乎完全没有提到 "每页前面4字节"  为保留字节.
事实像普通EEPROM及NAND FLASH也没听说需要这种机制,  不知道兄台是在哪里看到的 ?    可以贴出连结吗      感谢 !
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2017-5-3
在线时间
37 小时
发表于 2017-5-9 13:52:03 | 显示全部楼层
为啥STM32不带EEPROM呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 11:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表