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条回答
liuje
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" 这样的地址.

原因为何?     我还没有找到 !!    提供做参考 .

一周热门 更多>