chenweigang 发表于 2023-4-17 18:33:17

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();//上锁
}


chenweigang 发表于 2023-4-17 18:33:52

另外128K的是不是擦除要很久,我用了操作系统,在接收串口数据时写入flash,这个任务设了100ms

eric2013 发表于 2023-4-18 07:45:57

这个是我的,供参考

http://www.armbbs.cn/static/image/filetype/zip.gifV6-027_内部Flash模拟EEPROM.7z (1.23MB)

xhc281358765 发表于 2023-4-22 13:45:27

100ms不够,128k得500ms以上,你的估计被打断了 读写的时候

chenweigang 发表于 2023-5-19 09:49:23

eric2013 发表于 2023-4-18 07:45
这个是我的,供参考

V6-027_内部Flash模拟EEPROM.7z (1.23MB)

感谢硬汉哥
页: [1]
查看完整版本: STM32F429的内部FLASH写出错问题