查看: 4286|回复: 8

flash用作eeprom偶尔会出错为何?

[复制链接]

9

主题

18

帖子

133

积分

中级工程师

Rank: 2

积分
133
发表于 2022-8-19 21:10:20 | 显示全部楼层 |阅读模式
flash用作eeprom偶尔会读取错误 不知为何,真是受够了这款单片机了,毛病多的数不胜数,这么大一个论坛,没有一个flash读取例程,版主也是一笔带过,感觉人人都是高手一样,哎
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2022-8-22 08:44:18 | 显示全部楼层
就一个指针就能读取,可能是觉得太简单了。大家都忽略了。

uint32_t data;
data = (*(uint32_t*)0x00004000);//其中 0x0x00004000 是flash地址

这样就能把flash的数据取出来了。
回复

使用道具 举报

9

主题

18

帖子

133

积分

中级工程师

Rank: 2

积分
133
 楼主| 发表于 2022-9-2 17:17:33 | 显示全部楼层
当我要得到两个char时,该如何实现?
        uint32_t data;
         data = (*(uint32_t*)FLASH_PROG_ADDR+4);
         time=(uint8_t)data;
         data = (*(uint32_t*)FLASH_PROG_ADDR+8);
         time2=(uint8_t)data;

这样读出来是错误的,为何?
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2022-9-5 10:19:45 | 显示全部楼层
pkeuus 发表于 2022-9-2 17:17
当我要得到两个char时,该如何实现?
        uint32_t data;
         data = (*(uint32_t*)FLASH_PROG_ADDR+4);

uint8_t data,data1;
data = (*(uint8_t*)0x00004000);//其中 0x0x00004000 是flash地址
data1 = (*(uint8_t*)0x00004001);//其中 0x0x00004001 是flash地址
那就用u8寄存器和指针去读呗
回复

使用道具 举报

9

主题

18

帖子

133

积分

中级工程师

Rank: 2

积分
133
 楼主| 发表于 2022-9-5 12:22:34 | 显示全部楼层
#define FLASH_PROG_ADDR         0x0000A000
uint8_t  data=66;
if(FL_FLASH_PageErase(FLASH, FLASH_PROG_ADDR)!=FL_FAIL)
        {
        FL_FLASH_Program_Word(FLASH, FLASH_PROG_ADDR, (uint32_t)data);
         }

uint8_t data2;
data2 = (*(uint8_t*)FLASH_PROG_ADDR);

这里data2 读取出来是错的?为何?
LC043
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2022-9-6 10:29:28 | 显示全部楼层
pkeuus 发表于 2022-9-5 12:22
#define FLASH_PROG_ADDR         0x0000A000
uint8_t  data=66;
if(FL_FLASH_PageErase(FLASH, FLASH_PR ...

你这个程序。我这试下来是对的。
1、你是不是没接reset 线。仿真需要5线连接。
2、你有没有全编译。不要用增量编译。你这个写法在keil 里编译不过的,因为数据定义放在了程序中间。其他编译器我不清楚。
3、如果出现key-err ,请完全下电。不然会一直错误
回复

使用道具 举报

9

主题

18

帖子

133

积分

中级工程师

Rank: 2

积分
133
 楼主| 发表于 2022-9-6 11:02:35 | 显示全部楼层
uint32_t FLASH_PROG_ADDR=0x0000A000;
uint8_t  data[2]={66,33};
uint8_t  data2[2];
if(FL_FLASH_PageErase(FLASH, FLASH_PROG_ADDR)!=FL_FAIL)
        {
        FL_FLASH_Program_Word(FLASH, FLASH_PROG_ADDR, (uint32_t)data[0]);
         FL_FLASH_Program_Word(FLASH, FLASH_PROG_ADDR+1, (uint32_t)data[1]);
         }


data2[0] = (*(uint8_t*)FLASH_PROG_ADDR);
data2[1] = (*(uint8_t*)FLASH_PROG_ADDR+1);
这里data2[] 读取出来是错的?为何?
这里如果地址+4也是错的?
LC043
回复

使用道具 举报

9

主题

18

帖子

133

积分

中级工程师

Rank: 2

积分
133
 楼主| 发表于 2022-9-6 11:04:56 | 显示全部楼层
确认接了reset线,确认全编译了,确认没有出现key-error ,而且上电为了保证电压稳定,给了相应的延时才读取的
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2022-9-7 08:34:36 | 显示全部楼层
pkeuus 发表于 2022-9-6 11:04
确认接了reset线,确认全编译了,确认没有出现key-error ,而且上电为了保证电压稳定,给了相应的延时才读 ...

1、写是最小4字节的,你用单字节写当然出错。
2、读可以单字节读
uint32_t FLASH_PROG_ADDR=0x0000A000;
uint32_t  data[1]={0x00003366};
uint8_t  data2[2];
if(FL_FLASH_PageErase(FLASH, FLASH_PROG_ADDR)!=FL_FAIL)
        {
        FL_FLASH_Program_Word(FLASH, FLASH_PROG_ADDR, data);
         }
data2[0] = (*(uint8_t*)FLASH_PROG_ADDR);
data2[1] = (*(uint8_t*)FLASH_PROG_ADDR+1);
回复

使用道具 举报

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

本版积分规则

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