你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 Flash 写入数据失败

[复制链接]
Ha~ha~ 提问时间:2024-12-5 14:40 / 未解决
    STM32F407VGT6 标准库
    往Flash中写入数据,写入完成后再次读取,发现没有写入成功。printf 打印擦除和写入的步骤发现,返回的 FLASH_Status 都是 7。关于错误码,在网上找到的一些解释都比较模糊,没有具体的案例说明问题出现的原因和解决方案。
    把其他的代码全部注释掉,只保留Flash和串口打印相关的代码,再次执行,发现返回值都是9,说明擦除和写入无异常。
    请问出现这种问题的原因在哪里?如果是程序的问题,该从哪方面排查?

部分代码:
/**************************************************************************
*函  数:给指定地址写入指定长度的数据
*参  数:
*        @address:要写入数据的首地址
*        @data:要写入的数据
*        @len:数据长度
*备  注:要实现确保写入数据的区域没有写入其他数据,如果有,会执行全扇区的擦除,
*        可能会导致其他数据丢失。
**************************************************************************/
void FLASH_WriteData(uint32_t address, uint8_t *data, uint32_t len)
{
        uint32_t end_address = address + len;
        uint32_t index_address = address;
        if(index_address < FLASH_BASE_ADDRESS || index_address > FLASH_END_ADDRESS)//地址不合法
        {
                return;
        }
        FLASH_Unlock();
        FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
        while(index_address < end_address)
        {
                if(*(vu32*)index_address != 0xFFFFFFFF)//内容不为0xFFFFFFFF
                {
                        FLASH_Status i = FLASH_EraseSector(FLASH_getSectorNum(index_address), VoltageRange_3);//擦除所在扇区
                        printf("Erase FLASH_Status: %d\n", i);
                        if(FLASH_getSectorNum(index_address) == FLASH_Sector_11)//是最后一个扇区
                        {
                                break;
                        }
                        index_address = FLASH_getSectorHeadAddress(index_address) + FLASH_getSectorSize(index_address);//所在扇区已经擦除,直接跳转到下一个扇区的首地址
                }
                else
                {
                        index_address += 4;
                }
        }
        index_address = address;
        while(index_address < end_address)//按8bit大小写入数据
        {
                FLASH_Status i = FLASH_ProgramByte(index_address, *data);
                printf("write FLASH_Status: %d\n", i);
                index_address ++;
                data++;
        }
        FLASH_DataCacheCmd(ENABLE);//FLASH擦除期间,必须禁止数据缓存
        FLASH_Lock();
}

收藏 评论2 发布时间:2024-12-5 14:40

举报

2个回答
废鱼 回答时间:2024-12-5 18:42:14

擦除之前是否进行了擦除操作,另外,擦除的时候尽量关闭一下中断功能。

xmshao 回答时间:2024-12-5 15:14:01
建议参考下例程的写法,按部就班来,这个是标准流程操作。


标准库里也有例程,写得很清晰的。


\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\FLASH\FLASH_Program


先验证sector擦除是否成功;


然后验证单位数据的写操作;


再就是注意那些基本的信息给对,比方地址啊、扇区号等。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版