如何解决交换闪存库时如何防止 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) 告诉我们:
- 解锁 OPTLOCK 位(如果尚未解锁)。
- 在 FLASH_OPTSR_PRG 寄存器中设置新的所需 SWAP_BANK_OPT 值。
- 通过设置 FLASH_OPTCR 寄存器中的 OPTSTART 位来启动选项字节更改序列。
- 一旦选项字节更改完成,FLASH_OPTSR_CUR 包含预期的 SWAP_BANK_OPT 值,但 FLASH_OPTCR 中的 SWAP_BANK 位尚未修改,并且存储体交换尚未生效。
- 强制系统复位或 POR。当reset 上升时,bank 交换生效(更新FLASH_OPTCR 中的SWAP_BANK 值)并执行新固件。
我认为我这样做是正确的。
我还检查了勘误表,发现旧的芯片在 bank 切换时存在问题,但我使用的是最新的 V
修订版。
希望有人能给我点建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。