OpenEdv-开源电子网

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

H743 内部FLASH读写函数的一点小问题

[复制链接]

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2020-2-26
在线时间
30 小时
发表于 2022-7-29 13:06:00 | 显示全部楼层 |阅读模式
原子哥提供的代码中:
if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//写入数据                                               
{
break;        //写入异常
}

直接循环写入256bit的数据

在我的项目中,要存储数据前,先把已经存在里面的数据读取出来,然后擦除扇区,然后再把新的数据加进去,然后再把更新后的数据写回去。

写的过程中,出现了只能写入几个256bit的问题。找了一天半的原因,从hal库到各种代码,到其它平台上的验证。在F103战舰上移植了一段是成功的,F103的STMFLASH.c文件写的与H743是不一样的。最终找到了原因,造成写入失败的原因可能是在连续写入过程中,写入并没有完全结束的时候,又开始写下一个256bit的数据。这个原因我是不确定的,不知道有没有大佬知道为什么。

但是,我通过在HAL_FLASH_Program后面加一个delay_us的延时后,确实是解决了。而且随着延时时间的增加,从90%写失败,到50%,到10%,到完全成功。
if(FlashStatus==HAL_OK)
        {
                while(WriteAddr<endaddr)//写数据
                {
                        HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer);
                        delay_us(us_16);
                        FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);       //等待上次操作完成
                        WriteAddr+=32;
                        pBuffer+=8;
                }
        }

通过在每次写256bit后加一个延时,这个问题好歹是解决了。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2022-7-29 13:54:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-8 01:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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