
1、问题如标题 2、描述:通过双bank来实现远程升级,当程序在bank1运行时可以擦除bank2的内容,并重新写入代码。但是当程序在bank2运行时却不能擦除bank1的内容,写入失败。 3、步骤和现象:使用代码对bank1进行批量或页擦除,提示是擦除成功了,用JFLASH读擦除区域显示是FF,但是在代码里面读flash再打印到串口却显示非FF,然后写入flash失败。查看寄存器提示写入时非FF。这说明确实是擦除失败了。尝试了官方的代码库也依然如此。 这个问题困扰了我大半个月了,项目一点进展也没有。也向代理商反应过,看看原厂能否提供帮助,却没有得到回应。有没有哪位小伙伴遇到同样的问题? |
关于STM32G474 双BANK的测试问题
STM32G474CBT6上电瞬间用示波器测得io口产生较大电压(浪涌电压)
STM432G4单片机IAP程序+上位机
STM32G473 flash擦除时程序卡死
STSPIN32G4内部驱动电压输出问题
comp输出用于tim1刹车,消隐源和pwm输出是不是得是同一个TIM?
STM32G431内部运放1和2输出连接的ADC为什么不是OPAMP?
workbench6.3.2生成的代码,无法用pilot电机参数识别,无法通讯
stm32G474的flash模式如何判定?single bank 和dual bank
STM32G474高精度定时器HRTIM配置死区互补PWM极端输出问题
用官方例程测试了一下,没问题。
这里需要注意: 1.设置bank2 启动
2. 修改好加载的地址(0x0804000)开始程序加载到bank2
楼主用烧录器看过是FF,但实际操作是又不是,这的确太奇怪了。通常烧录器看到的是比较准确的。
建议:1 验证一下,代码配置只执行一次BANK1部分擦除,避免复位或上电反复擦除写坏FLASH.
2. 在烧录界面和调试界面检查一下是否擦除成功。
如是有bootloader的时候应该可以实现的 如果是没有的话是不是有可能是因为在运行bank2的时候是不能够擦除或写入从0x8000000到到bank2首地址之间的数据的(猜的)。
[md]如果不能擦除或写bank1,岂不是有违设计者的初衷,那跟普通芯片也就没区别了,我猜大概率不应该
我也很奇怪,但现象确实如此,反复验证了好几次都是这样。
芯片被锁会不会引起这个现象,因为实验过程中我可能误操作了读写保护,打算换一颗芯片再试。
感谢大佬回复,我现在有一点没有搞明白,就是关于BANK1和BANK2到底对应哪个地址的问题。看过网上文章如下描述。
问题:结合官方例程,对于擦除时确实交换了bank1和bank2的地址,例程中没有明确说明写flash的时候也要交换地址。我做了实验尝试,却出现了另一个问题。在修改OPTR选项字节中BFB2时,强制跳转后却死机了,为此我不知道是程序写失败了,还是选项字节强制载入失败。导致我的实验也没有进展。我现在打算先写一个测试程序用JFLASH分别烧录到bank1和bank2中,让他们互相跳转,然后再实验当运行到bank2中擦除bank1的操作。
请问大佬,你用的官方例程具体是哪一个?我这边看到软件库里面有好几个,他们之间都有差异,搞得我很迷茫。
1. 两块可以独立的区域,独立启动,单独boot(通过option byte 配置)。 具体参考产品参考手册
2. 独立区开是对应APP的向量表。
3. 另外软件不能擦除当前使用的向量表,如果有中断就跑飞了~~
我参考的例程是下面这个,根据上面的基本原则改了一下配置和地址,改成从BANK2 启动擦除BANK1
STM32Cube_FW_G4_V1.5.0\Projects\NUCLEO-G474RE\Examples\FLASH\FLASH_EraseProgram
另外DUAL BANK的启动也有一个例程,就是更改optionbyte 再加载一下,这样复位后运行另一BANK的完整的APP。
经过多方努力,终于解决问题。感谢代理商的FAE提供支持,感谢各位大佬帮助。对比了FAE提供的代码,目前我也没看出来差别在哪儿。我也是同样的的操作就是不行,FAE的代码就可以。搞不懂,难道是人品问题。