请选择 进入手机版 | 继续访问电脑版

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

写FLASH失败

[复制链接]
wbg 提问时间:2024-8-1 11:37 / 未解决
__attribute__((section(".ROM_D0")))  static const uint64_t Key_Flash[1]={0xFFFFFFFFFFFFFFFFUL};
__IO  uint64_t  Key_ID=0x1234567812345678;
__IO  uint64_t  Key=*(__IO uint64_t*)Key_Flash;
__HAL_FLASH_PREFETCH_BUFFER_DISABLE();       //关闭FLASH预取缓冲区
if(0xFFFFFFFFFFFFFFFFUL==Key)
{
    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();
}

收藏 评论19 发布时间:2024-8-1 11:37

举报

19个回答
xmshao 回答时间:2024-8-2 15:54:32

wbg 发表于 2024-8-2 15:06
没有任何写保护

我刚才测试发现,基于常量方式写FF还有局限性,有坑~!。比方这样定义常量,然后不擦除就写,行不通。我第一个双字不是全F,后面几个都是全F,不擦的话都写不了。

image.png

如果像下面这里有,前两个双字可以写,后面的也写不了。

image.png

所以你要换个写法。

==》这个地方我要补充下。~~~~

应该是当时我误会了,没有坑的说法。 通过常量定义预留的全FF单元是后期可以改写的。我当时是因为对非FF单元做写操作出错了,导致其他地方都没法写了,是误会。后来我有测试了,只要是通过常量定义预留的全FF单元都是可以改写的。比方下图贴出的情形。【当然,基本编程规则和对齐都是要遵守的】

image.png

image.png
image.png
xmshao 回答时间:2024-8-2 11:15:18

我刚基于G474RE开发板和现有例程,对第254页做了数据写操作,写了16个字节。

image.png

![image.png](data/attachment/forum/202408/02/111301f2v3xipsu48bqqic.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300

"image.png")

image.png

可以成功擦、写。 这里因为到第254页,我将BANK号改为BANK2了,其它都沿用现有写法。

wbg 回答时间:2024-8-2 08:42:39

我就是参考了TM32Cube_FW_G4_V1.6.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram这个例程,还进行了双BANK升级,写入成功,但具体到这里的程序代码,要求写入单个64位数据,就会失败,调了很长时间也没成功。区别是,这里是在程序执行BANK中写入,升级是在后备BANK中写入。

知足- 回答时间:2024-8-1 16:32:25

建议仔细阅读函数的说明。

image.png

xmshao 回答时间:2024-8-1 18:11:50
对于G4系列你可以参考这个例程。


TM32Cube_FW_G4_V1.6.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram


这个操作肯定是没问题的,我这边测试过了的。


你注意在调用函数时,参数别给错了,到底地址指针还是地址数据这些小细节要注意。


还有,这个例程是默认根据双BANK设计的,当地址范围超过1个bank后,它的页地址又重0开始计算的,这时基于现有例程的话,BANK号
改为FLASH_BANK_2,这个地方也要注意。
xmshao 回答时间:2024-8-2 09:50:53

wbg 发表于 2024-8-2 08:42
我就是参考了TM32Cube_FW_G4_V1.6.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram这个例 ...

[md]那你检查下if条件到底能不能成立?再就是要写的地方是否为擦过了。

wbg 回答时间:2024-8-2 11:40:38
xmshao 发表于 2024-8-2 11:15
[md]我刚基于G474RE开发板和现有例程,对第254页做了数据写操作,写了16个字节。

![image.png](data/attac ...

我的代码,1.没有擦除,因为要写的地址里是0xFFFFFFFFFFFFFFFF;2. 只定义了1个数据;3. 要写的地址是`0x08007bb0`在BANK1。所以才失败吗?
xmshao 回答时间:2024-8-2 12:01:30

wbg 发表于 2024-8-2 11:40
我的代码,1.没有擦除,因为要写的地址里是0xFFFFFFFFFFFFFFFF;2. 只定义了1个数据;3. 要写的地址是`0x0 ...

写之前应该擦除过的就行,不能是写过的。

如果基于常量定义双字为全F,经测试 写入是没有问题的。当然,还要注意地址的双字对齐。

xmshao 回答时间:2024-8-2 12:01:50
1、你保证欲写的地方 是擦除过了的;
2、你定义几个变量按理跟这个写没啥关系;
3、bank1 bank2都是可以写的。你的地址目前落在第15页,我基于例程稍作调整进行验证没问题。


while (Address < 0x08007bb0+16)
{
   if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, Address, DATA_64) ==HAL_OK)
   {
     Address = Address + 8;  /* increment to next double word*/
   }
  else
   {。。。。。。。。。。。





注意这是的bank编号是BANK1.
wbg 回答时间:2024-8-2 13:26:15

xmshao 发表于 2024-8-2 12:01</p>
<p>写之前应该擦除过的就行,不能是写过的。

[md]会不会写保护,所以失败?

xmshao 回答时间:2024-8-2 14:03:40

wbg 发表于 2024-8-2 13:26
会不会写保护,所以失败?

你通过STM32CubeProgrammer连接后看看,或者自己代码里读相关页的些保护标志位来判断。

wbg 回答时间:2024-8-2 15:06:45

xmshao 发表于 2024-8-2 14:03
你通过STM32CubeProgrammer连接后看看,或者自己代码里读相关页的些保护标志位来判断。
...

没有任何写保护

微信图片_20240802150540.png
wbg 回答时间:2024-8-2 16:33:52

xmshao 发表于 2024-8-2 15:54</p>
<p>我刚才测试发现,基于常量方式写FF还有局限性,有坑~!。比方这样定义常量,然后不擦除就写,行不通。 ...

[md]看错误代码说是要写的FLASH地址与双字不对齐,但系统分配的地址是对齐的,整不会了

xmshao 回答时间:2024-8-2 16:35:48

wbg 发表于 2024-8-2 16:33
看错误代码说是要写的FLASH地址与双字不对齐,但系统分配的地址是对齐的,整不会了
...

呵呵 这里的flash编程遵守双字对齐是必须的了。

12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版