stm32u575从bank2启动,擦写bank1失败

问题描述

在做双bank远程升级功能时,遇到的一个现象,程序从bank1启动运行,通过远程升级将升级文件写到bank2,然后切换成bank2启动,设备重启,重启后程序从bank2运行,正常,但是当程序需要向bank1的参数存储区写入参数时,问题就出现了,现象就是程序卡死。

问题排查

程序升级完成后,看运行指示灯是正常的,与后台的通信也是正常的,通过调试接口也可以确定程序确实是从bank2启动的,说明升级过程是正常的。

但是在给设备配置参数时,设备无响应,led等还表现为正常,说明程序中的某个任务阻塞了,并不是整个程序崩溃。

通过进一步分析,发现读取参数正常,只有配置参数时才会表现出异常,重启设备可以恢复,因为在调试双bank切换时踩过逻辑地址的坑,当时也遇到过flash相关问题,结合当前现象,初步推断问题是flash写操作导致的,而flash的读和写的差别在于flash的擦除。

为进一步确认,因为我不知道程序从bank2运行时如何进行单步调试,就用笨办法,在flash擦除的位置前后加入led指示,最终确认程序卡死在flash擦除的函数HAL_FLASHEx_Erase(&FlashEraseInit, &SectorError)。

程序从bank1运行时是正常的,可以确定问题就是由bank2启动导致的,那么bank2启动和bank1启动有什么区别呢?难道需要特殊配置?

我上网搜,发现也有人遇到同样的问题,但是都是提问的,没有解决办法,唉,咋搞,困了几天了已经。如果是需要特殊配置,那我实在没辙,看手册也没找到相关内容,我不可能自己把需要的配置想出来,不得已我给st的技术支持发了邮件,期待有回复。但同时,如果不需要特殊的配置呢,那就是代码有问题,同步的,我又开始抠代码,没想到真找到原因了。

解决办法

c 复制代码
	FlashEraseInit.TypeErase = FLASH_TYPEERASE_PAGES; // 擦除类型,扇区擦除
	FlashEraseInit.Banks = GetBank(addrx);
	FlashEraseInit.Page = GetPage(addrx);
	FlashEraseInit.NbPages = 1;
    if (HAL_FLASHEx_Erase(&FlashEraseInit, &SectorError) != HAL_OK)
    {
        break; // 发生错误了
    }

在看flash擦除的相关代码的时候,突然有个疑问,这里的Banks是物理的还是逻辑的?

查询之后知道这里的Banks是物理的,而我在bank2启动时,按照逻辑地址的转换逻辑,将bank2当做逻辑上的bank1处理了,所以在擦除flash的时候卡死,因为Banks这个参数设置错误,修改之后在测试,正常了。

相关推荐
周洲083014 小时前
STM32 串口底层深度解析|USART 中断标志、硬件 FIFO,乱码根源底层定位
stm32·单片机·嵌入式硬件
女神下凡19 小时前
芯参谋(29):UFS UMCP 软件设计规范
arm开发·单片机·嵌入式硬件
李日华大战鸡红19 小时前
IC-MU128编码器使用教程
stm32
周洲083019 小时前
STM32片内Flash读写深度详解|掉电参数保存、底层原理
linux·前端·stm32
RISCV_Explorer20 小时前
RISC-V电源管理与低功耗实战——WFI指令、电源域划分与唤醒路径设计
单片机·嵌入式硬件·risc-v
zd84510150020 小时前
支持双向输入信号的开关量电路
单片机·嵌入式硬件
齐落山大勇20 小时前
【裸机程序】IMX 6ULL的中断机制的理解
单片机·嵌入式硬件
cu14321 小时前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
HRTOS1 天前
HRTOS 任务优先级与调度模式说明
单片机·嵌入式硬件·系统架构·51单片机
cu1431 天前
细谈GM7123C的具体功能与其应用
c语言·c++·人工智能·嵌入式硬件