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

相关推荐
派勤电子1 小时前
嵌入式硬件选型|3.5寸工控板与Mini-ITX主板的扩展能力哪个更好?
嵌入式硬件·工控主板·嵌入式主板·工控主板扩展·3.5寸工控板·mini-itx·工业主板io接口
工业胶粘剂技术3 小时前
科耀K-8095M 单组分耐高温环氧 电机磁钢/新能源汽车高温结构粘接技术参数与选型
单片机·嵌入式硬件·汽车
李永奉8 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
大爱编程♡8 小时前
STM32-DMA
stm32·单片机·嵌入式硬件
云泽8089 小时前
STM32 USART 详解(三):硬件架构、内部寄存器与物理层收发原理
stm32·嵌入式硬件·硬件架构
天空'之城10 小时前
单片机基础核心知识点汇总(三十三)
数据库·单片机·嵌入式硬件
数字新视界11 小时前
机房动环监控的智能化管理与安全提升探索
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
@嵌入式扫地僧13 小时前
TFLite Micro STM32/ESP32 开箱即用推理骨架 + INT8 量化脚本实战:零调试跑通端侧 AI 推理完整步骤
人工智能·嵌入式硬件·tinyml·端侧ai·tflite micro
自小吃多13 小时前
高云FPGA ModelSim中的仿真
笔记·嵌入式硬件·fpga开发
单片机仿真设计13 小时前
基于 STM32 的家庭环境监测与火灾报警灭火系统(Proteus 仿真)
stm32·单片机·嵌入式硬件·proteus·毕设