[STM32G4]

写FLASH失败

[复制链接]
681|19
手机看帖
扫描二维码
随时随地手机跟帖
wbgbg20002000|  楼主 | 2024-8-8 14:55 | 显示全部楼层 |阅读模式
求助采用STM32G473CBT6,  写片内FLASH失败,代码如下:
        //.ROM_D0 :ER_IROM1 0x08000000 0x00020000
         __attribute__((section(".ROM_D0"))) static uint64_t Key_Flash=(uint64_t)(-1);  
    __IO  uint64_t  Key_ID=0x1234567812345678;
    __HAL_FLASH_PREFETCH_BUFFER_DISABLE();   //关闭FLASH预取缓冲区
    if((uint64_t)(-1)==Key_Flash)
    {               
        HAL_FLASH_Unlock();
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, (uint32_t)&Key_Flash, Key_ID);
        HAL_FLASH_Lock();
    }

使用特权

评论回复
laocuo1142| | 2024-8-8 17:08 | 显示全部楼层
检查Flash是否处于写保护状态

使用特权

评论回复
flycamelaaa| | 2024-8-8 18:00 | 显示全部楼层
检查Flash写入函数的实现

使用特权

评论回复
powerantone| | 2024-8-8 19:23 | 显示全部楼层
Flash区域未被正确擦除

使用特权

评论回复
probedog| | 2024-8-8 21:23 | 显示全部楼层
在Flash写入操作后,检查相关的错误标志(如FLASH_FLAG_PGERR、FLASH_FLAG_WRPRTERR等),以确定写入失败的具体原因。

使用特权

评论回复
classroom| | 2024-8-8 23:23 | 显示全部楼层
查阅STM32G473CBT6的官方数据手册和参考手册

使用特权

评论回复
xionghaoyun| | 2024-8-9 08:43 | 显示全部楼层
关闭保护再写

使用特权

评论回复
wbgbg20002000|  楼主 | 2024-8-9 08:51 | 显示全部楼层

没有任何写保护

使用特权

评论回复
wbgbg20002000|  楼主 | 2024-8-9 09:12 | 显示全部楼层
probedog 发表于 2024-8-8 21:23
在Flash写入操作后,检查相关的错误标志(如FLASH_FLAG_PGERR、FLASH_FLAG_WRPRTERR等),以确定写入失败的 ...

发生FLASH_FLAG_PGSERR,FLASH_FLAG_PGAERR

使用特权

评论回复
wbgbg20002000|  楼主 | 2024-8-9 09:14 | 显示全部楼层
powerantone 发表于 2024-8-8 19:23
Flash区域未被正确擦除

Key_Flash初始化为0xFFFFFFFFFFFFFFFFUL, 无需擦除?

使用特权

评论回复
stormwind123| | 2024-8-9 10:26 | 显示全部楼层
电源或时钟不稳定

使用特权

评论回复
wbgbg20002000|  楼主 | 2024-8-9 10:48 | 显示全部楼层
stormwind123 发表于 2024-8-9 10:26
电源或时钟不稳定

启动延时了100ms, 还是写不进去

使用特权

评论回复
dalong-168| | 2024-8-9 11:43 | 显示全部楼层
好帖,学习了

使用特权

评论回复
丙丁先生| | 2024-8-9 12:37 | 显示全部楼层
根据您提供的代码,您正在尝试将一个64位整数(Key_ID)写入片内FLASH。但是,您的代码中存在一些问题,可能导致写入失败。以下是一些建议:

1. 确保您已经正确配置了STM32G473CBT6的时钟和电源,以便正确访问片内FLASH。

2. 检查您的代码是否在正确的内存区域执行。`__attribute__((section(".ROM_D0")))`表示将变量存储在名为".ROM_D0"的内存区域。请确保这个区域是可写的,并且有足够的空间来存储您的数据。

3. 在写入FLASH之前,确保FLASH已经被解锁。您可以使用`HAL_FLASH_Unlock()`函数来实现这一点。

4. 在写入数据之前,清除任何可能的错误标志。您可以使用`__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR)`来实现这一点。

5. 使用`HAL_FLASH_Program()`函数将数据写入FLASH。请注意,您需要提供正确的参数,包括FLASH类型、地址和数据。在这个例子中,您应该使用`FLASH_TYPEPROGRAM_DOUBLEWORD`作为第一个参数,因为您正在写入一个64位整数。同时,确保地址参数是正确的。

6. 在完成写入操作后,锁定FLASH以防止意外写入。您可以使用`HAL_FLASH_Lock()`函数来实现这一点。

如果您仍然遇到问题,请检查硬件连接和调试器设置,以确保您的开发板可以正确访问片内FLASH。此外,您还可以尝试使用STM32CubeMX或其他工具生成初始化代码,以确保所有必要的配置都已正确设置。

使用特权

评论回复
呐咯密密| | 2024-8-9 15:43 | 显示全部楼层
写的地址是不是不合法

使用特权

评论回复
wbgbg20002000|  楼主 | 2024-8-9 17:56 | 显示全部楼层
本帖最后由 wbgbg20002000 于 2024-8-10 08:30 编辑
呐咯密密 发表于 2024-8-9 15:43
写的地址是不是不合法

调试跟踪,写入的地址是0x08007CA8

使用特权

评论回复
classroom| | 2024-8-10 17:00 | 显示全部楼层
查阅STM32G473CBT6的官方数据手册和参考手册

使用特权

评论回复
铁血丹心LLLL| | 2024-8-28 00:51 | 显示全部楼层
STM32的FLASH写入操作通常需要先将要写入的整个页面擦除,然后才能进行编程操作。

使用特权

评论回复
烟雨蒙蒙520| | 2024-8-28 12:14 | 显示全部楼层
确保写入地址是对齐的。HAL_FLASH_Program 函数要求地址对齐,通常为双字(8 字节)对齐。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

27

帖子

0

粉丝