OpenEdv-开源电子网

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

求flash模拟eeprom的擦除子函数,谢谢。

[复制链接]

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
发表于 2016-2-21 18:02:34 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2016-2-22 09:42:12 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-2-22 11:44:08 | 显示全部楼层
这是原子哥的
[mw_shl_code=c,true]//从指定地址开始写入指定长度的数据
//特别注意:因为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;        //写入的结束地址
        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();//上锁
} [/mw_shl_code]
回复 支持 反对

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
 楼主| 发表于 2016-2-22 18:57:29 | 显示全部楼层
止天 发表于 2016-2-22 09:42
为什么要擦除啊

不擦除 始终占内存啊
回复 支持 反对

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-1-18
在线时间
14 小时
 楼主| 发表于 2016-2-22 18:59:39 | 显示全部楼层
yyx112358 发表于 2016-2-22 11:44
这是原子哥的
[mw_shl_code=c,true]//从指定地址开始写入指定长度的数据
//特别注意:因为STM32F4的扇区实 ...

我想 找一份只有页擦除的  

void FLASH_Erase(u32 ADD)
{
                FLASH_Unlock();       
                FLASH_ErasePage(ADD);
          FLASH_Lock();
}

这是我写的  感觉不太好用


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-2-22 20:32:26 | 显示全部楼层
求助,不要发分享帖!!
回复 支持 反对

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2016-2-25 17:01:33 | 显示全部楼层
直接用就行  不一定要擦了在用
回复 支持 反对

使用道具 举报

7

主题

56

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-16
在线时间
23 小时
发表于 2016-11-30 17:36:44 | 显示全部楼层
LOVESTM32 发表于 2016-2-22 18:59
我想 找一份只有页擦除的  

void FLASH_Erase(u32 ADD)

这个帖子时间有点久了,但是我想说的就是F4没有页擦除操作的,只有扇区的,所以就像原子哥说的,比较蛋疼
回复 支持 反对

使用道具 举报

11

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2014-11-9
在线时间
228 小时
发表于 2017-6-20 20:05:50 | 显示全部楼层
我想请问一下怎么出来的,我现在也不行,擦出了子函数,程序运行不正常
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 21:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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