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

写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();
}

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

举报

16个回答
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版