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这个参数设置错误,修改之后在测试,正常了。

相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11015 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元5 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133975 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315205 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书5 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang5 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟5 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126915 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机