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

2019-08-19 18:55发布

使用的是 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,  也都是偶数地址 .       但是感觉失败率很高.
特别是基底地址设不同时,  就有不同结果 .      请教各位不知道怎么来追查这个问题  ??    感谢 !!!

























友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-08-19 23:51
 精彩回答 2  元偷偷看……
liuje
2楼-- · 2019-08-20 02:17
谢谢板主提供建议!

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

看来我得再找找其它办法 ..
liuje
3楼-- · 2019-08-20 06:28
今天再测试, 当基底位置使用 "#define FLASH_SAVE_ADDR  0X0800C400" 时,  可以正常记忆18个按键值 (每个按键150个字节) .

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

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

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

原因为何?     我还没有找到 !!    提供做参考 .
nonplus
4楼-- · 2019-08-20 09:49
谢谢提醒 .

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

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

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

就是抓不到问题,  写入不稳定.   只能再找时间试看看别的FLASH读写函式库来验证看看是否为战舰版函式的问题 .
liuje
5楼-- · 2019-08-20 13:21
每页前面?4?字节保留,其中前?2?字节是该页状态标志。 有没有可能是这个原因?
luole700
6楼-- · 2019-08-20 18:48
 精彩回答 2  元偷偷看……

一周热门 更多>