OpenEdv-开源电子网

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

探索者F4开发板单片机内部flash写数据必须先擦除扇区吗

[复制链接]

25

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-1-17
在线时间
67 小时
发表于 2017-9-28 11:42:36 | 显示全部楼层 |阅读模式
10金钱
我想在stm32f407单片机flash扇区10里存一些参数,我将下面这个写flash的函数里的擦除扇区部分屏蔽掉,来改写扇区内的个别参数,结果有时成功,有时不成功。
难道每次写参数都得擦除整个扇区再写吗,这样的话如果有一个参数需要改动,其他的就都得改?


//从指定地址开始写入指定长度的数据
//特别注意:因为STM32F4的扇区实在太大,没办法本地保存扇区数据,所以本函数
//         写地址如果非0XFF,那么会先擦除整个扇区且不保存扇区数据.所以
//         写非0XFF的地址,将导致整个扇区数据丢失.建议写之前确保扇区里
//         没有重要数据,最好是整个扇区先擦除了,然后慢慢往后写.
//该函数对OTP区域也有效!可以用来写OTP区!
//OTP区域地址范围:0X1FFF7800~0X1FFF7A0F
//WriteAddr:起始地址(此地址必须为4的倍数!!)
//pBuffer:数据指针
//NumToWrite:字(32位)数(就是要写入的32位数据的个数.)
void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)       
{
  FLASH_Status status = FLASH_COMPLETE;
        u32 addrx=0;
        u32 endaddr=0;       
  if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;        //非法地址
        FLASH_Unlock();                                                                        //解锁
  FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
               
        addrx=WriteAddr;                                //写入的起始地址
        endaddr=WriteAddr+NumToWrite*4;        //写入的结束地址
        //9月27日屏蔽,不擦除扇区,直接写,有待验证是否有问题
        if(addrx<0X1FFF0000)                        //只有主存储区,才需要执行擦除操作!!
        {
                while(addrx<endaddr)                //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
                {
                        if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
                        {   
                                status=FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
                                if(status!=FLASH_COMPLETE)break;        //发生错误了
                        }else addrx+=4;
                }
        }
        if(status==FLASH_COMPLETE)
        {
                while(WriteAddr<endaddr)//写数据
                {
                        if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
                        {
                                break;        //写入异常
                        }
                        WriteAddr+=4;
                        pBuffer++;
                }
        }
  FLASH_DataCacheCmd(ENABLE);        //FLASH擦除结束,开启数据缓存
        FLASH_Lock();//上锁
}

最佳答案

查看完整内容[请看2#楼]

写之前,看是不是全部是oxff,如果是,则直接写 如果不是,则先需要擦除(擦除前需要对已存在信息备份),才能写
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2017-9-28 11:42:37 | 显示全部楼层

写之前,看是不是全部是oxff,如果是,则直接写
如果不是,则先需要擦除(擦除前需要对已存在信息备份),才能写
学无止境
回复

使用道具 举报

1

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1461
金钱
1461
注册时间
2011-12-1
在线时间
110 小时
发表于 2017-9-28 11:50:13 | 显示全部楼层
不需要,你用单个字节的擦除就好。
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2017-9-28 13:08:51 | 显示全部楼层
xlong_06 发表于 2017-9-28 11:50
不需要,你用单个字节的擦除就好。

有这样的操作?
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2017-9-28 13:28:37 | 显示全部楼层
xlong_06 发表于 2017-9-28 11:50
不需要,你用单个字节的擦除就好。

flash要擦,必须擦一个扇区,什么时候可以擦单字节了?
学无止境
回复

使用道具 举报

25

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-1-17
在线时间
67 小时
 楼主| 发表于 2017-9-28 13:51:58 | 显示全部楼层
jermy_z 发表于 2017-9-28 13:30
写之前,看是不是全部是oxff,如果是,则直接写
如果不是,则先需要擦除(擦除前需要对已存在信息备份) ...

多谢大神指点
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2017-9-28 17:03:38 | 显示全部楼层
jermy_z 发表于 2017-9-28 11:42
写之前,看是不是全部是oxff,如果是,则直接写
如果不是,则先需要擦除(擦除前需要对已存在信息备份) ...

原子的代码不就是这样做的嘛
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12995
金钱
12995
注册时间
2012-11-26
在线时间
3790 小时
发表于 2017-9-28 17:13:48 | 显示全部楼层
钩月黄昏 发表于 2017-9-28 17:03
原子的代码不就是这样做的嘛

是的
学无止境
回复

使用道具 举报

13

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2017-7-7
在线时间
42 小时
发表于 2017-10-30 09:58:06 | 显示全部楼层
楼主,你的问腿解决没有,我也是想和你一样想直接写入,但是我的把擦除部分屏蔽就写不进去了,能不能分享一下你的写入函数
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5259
金钱
5259
注册时间
2012-8-25
在线时间
1025 小时
发表于 2017-11-3 13:31:21 | 显示全部楼层
还有数据缓存啊? FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
我怎么从来没用过,好像也没问题
回复

使用道具 举报

5

主题

41

帖子

0

精华

高级会员

Rank: 4

积分
676
金钱
676
注册时间
2017-9-22
在线时间
240 小时
发表于 2017-11-3 16:17:27 | 显示全部楼层
不管是F几的,FLASH扇区里只要有数据,写前必须先擦除吧,他的的器件手册写的很清楚。
回复

使用道具 举报

25

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2017-1-17
在线时间
67 小时
 楼主| 发表于 2017-11-10 11:25:12 | 显示全部楼层
HXDZ 发表于 2017-11-3 16:17
不管是F几的,FLASH扇区里只要有数据,写前必须先擦除吧,他的的器件手册写的很清楚。

谢谢 我后来明白了 flash只能由1写0,不能由0写1,所以写之前必须先擦除,即扇区恢复全1状态,然后再写才能保证写入正确
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-12-30
在线时间
2 小时
发表于 2021-4-22 14:07:14 | 显示全部楼层
xlong_06 发表于 2017-9-28 11:50
不需要,你用单个字节的擦除就好。

在这胡说八道
回复

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-4-22 17:37:08 | 显示全部楼层
FLASH只能由1写0,不能由0写1,所以写之前必须先擦除,即扇区恢复全1状态,然后再写才能保证写入正确
海纳百川者,荣耀伴一生!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-28 00:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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