STM32F429的内部FLASH写出错问题
大家好,我用的标准库,调试了发现是FLASH_EraseSector擦除的地方返回了错误状态具体就是这个函数FLASH_GetStatus()返回了FLASH_ERROR_PROGRAM,请问大家是什么问题啊?
//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址
#define FLASH_SAVE_ADDR0X0800C004 //设置FLASH 保存地址(必须为偶数,且所在扇区,要大于本代码所占用到的扇区.否则,写操作的时候,可能会导致擦除整个扇区,从而引起部分程序丢失.引起死机.
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擦除期间,必须禁止数据缓存
FLASH_ClearFlag( FLASH_FLAG_EOP |FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);//23-4-17
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();//上锁
}
另外128K的是不是擦除要很久,我用了操作系统,在接收串口数据时写入flash,这个任务设了100ms 这个是我的,供参考
http://www.armbbs.cn/static/image/filetype/zip.gifV6-027_内部Flash模拟EEPROM.7z (1.23MB)
100ms不够,128k得500ms以上,你的估计被打断了 读写的时候 eric2013 发表于 2023-4-18 07:45
这个是我的,供参考
V6-027_内部Flash模拟EEPROM.7z (1.23MB)
感谢硬汉哥
页:
[1]