硬汉嵌入式论坛

 找回密码
 立即注册
查看: 754|回复: 4
收起左侧

STM32F429的内部FLASH写出错问题

[复制链接]

15

主题

30

回帖

75

积分

初级会员

努力做,耐心等

积分
75
发表于 2023-4-17 18:33:17 | 显示全部楼层 |阅读模式

大家好,我用的标准库,调试了发现是FLASH_EraseSector擦除的地方返回了错误状态具体就是这个函数FLASH_GetStatus()返回了FLASH_ERROR_PROGRAM,请问大家是什么问题啊?

//FLASH起始地址
#define STM32_FLASH_BASE 0x08000000         //STM32 FLASH的起始地址
#define FLASH_SAVE_ADDR  0X0800C004         //设置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();//上锁
}


回复

使用道具 举报

15

主题

30

回帖

75

积分

初级会员

努力做,耐心等

积分
75
 楼主| 发表于 2023-4-17 18:33:52 | 显示全部楼层
另外128K的是不是擦除要很久,我用了操作系统,在接收串口数据时写入flash,这个任务设了100ms
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-4-18 07:45:57 | 显示全部楼层
这个是我的,供参考

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

使用道具 举报

5

主题

65

回帖

80

积分

初级会员

积分
80
发表于 2023-4-22 13:45:27 | 显示全部楼层
100ms不够,128k得500ms以上,你的估计被打断了 读写的时候
回复

使用道具 举报

15

主题

30

回帖

75

积分

初级会员

努力做,耐心等

积分
75
 楼主| 发表于 2023-5-19 09:49:23 | 显示全部楼层
eric2013 发表于 2023-4-18 07:45
这个是我的,供参考

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

感谢硬汉哥
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 14:38 , Processed in 0.157012 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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