交换闪存库时如何防止 STM32H7 崩溃

问题描述

我使用的是具有两个闪存组的 STM32H753。对于我的固件更新,我使用了银行交换功能,以便 mcu 启动到正确的版本。

当我交换银行时,微控制器崩溃了。没有硬故障或任何其他异常。 调试器告诉我 PC 位于 0x72c269e,SP 位于 0xbf00d7b4,但之前这些地址不同,我假设这些地址是随机的。

最终看门狗启动并重置 mcu,然后交换银行,所以它确实起作用了。 当我换回银行时,没有崩溃,一切正常。

这是执行此操作的代码

pub fn swap_bank(flash: &mut stm32h7xx_hal::stm32::FLASH) -> Result<(),&'static str> {
    assert!(flash.optcr().read().optlock().bit_is_clear());

    // Get the current config
    let current_bank = get_current_bank(flash) != 1;
    let swapped_bank = !current_bank;

    // Config the new bank
    flash
        .optsr_prg()
        .modify(|_,w| w.swap_bank_opt().bit(swapped_bank));

    // Start the config write
    flash.optcr().modify(|_,w| w.optstart().set_bit());
    
    // Wait for the change to propegate
    while flash.optsr_cur().read().opt_busy().bit_is_set() {
        cortex_m::asm::nop();
    }

    // We're done,Now we need to reboot
    Ok(())
}

pub fn get_current_bank(flash: &mut stm32h7xx_hal::stm32::FLASH) -> u8 {
    flash.optcr().read().swap_bank().bit() as u8 + 1
}

如果我在 while 循环之前放了一条 bkpt 指令,它会被两次命中(如果我继续的话,两次都不会崩溃)。
如果我在 while 循环后放一条 bkpt 指令,第一次交换时它不会被命中。

reference manual (4.3.13) 告诉我们:

  1. 解锁 OPTLOCK 位(如果尚未解锁)。
  2. 在 FLASH_OPTSR_PRG 寄存器中设置新的所需 SWAP_BANK_OPT 值。
  3. 通过设置 FLASH_OPTCR 寄存器中的 OPTSTART 位来启动选项字节更改序列。
  4. 一旦选项字节更改完成,FLASH_OPTSR_CUR 包含预期的 SWAP_BANK_OPT 值,但 FLASH_OPTCR 中的 SWAP_BANK 位尚未修改,并且存储体交换尚未生效。
  5. 强制系统复位或 POR。当reset 上升时,bank 交换生效(更新FLASH_OPTCR 中的SWAP_BANK 值)并执行新固件。

我认为我这样做是正确的。 我还检查了勘误表,发现旧的芯片在 bank 切换时存在问题,但我使用的是最新的 V 修订版。

希望有人能给我点建议。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)