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

2019-08-17 06:20发布

求flash模拟eeprom的擦除子函数,谢谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
止天
1楼-- · 2019-08-17 07:22
 精彩回答 2  元偷偷看……
yyx112358
2楼-- · 2019-08-17 09:45
这是原子哥的
[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]
LOVESTM32
3楼-- · 2019-08-17 10:59
止天 发表于 2016-2-22 09:42
为什么要擦除啊

不擦除 始终占内存啊
LOVESTM32
4楼-- · 2019-08-17 14:05
yyx112358 发表于 2016-2-22 11:44
这是原子哥的
[mw_shl_code=c,true]//从指定地址开始写入指定长度的数据
//特别注意:因为STM32F4的扇区实 ...

我想 找一份只有页擦除的  

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

这是我写的  感觉不太好用


正点原子
5楼-- · 2019-08-17 17:04
求助,不要发分享帖!!
止天
6楼-- · 2019-08-17 21:01
 精彩回答 2  元偷偷看……

一周热门 更多>