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

相关推荐
ipod7414 小时前
电子电路的元器件
单片机·嵌入式硬件
清风6666664 小时前
基于单片机的脉搏与呼吸监测报警设备设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Hello_Embed5 小时前
嵌入式上位机开发入门(十九):Socket 状态检测与断线重连
网络·单片机·网络协议·tcp/ip·嵌入式
foundbug9995 小时前
STM32 内部温度传感器测量程序(标准库函数版)
stm32·单片机·嵌入式硬件·算法
天狼IoT5 小时前
STM32-keil+CubeMX快速开发:新建项目
stm32·单片机·嵌入式硬件
Tomhex5 小时前
STM32型号命名解析
stm32
gihigo19986 小时前
量程自动切换数字电压表Proteus仿真+程序
单片机·嵌入式硬件·proteus
木燚垚6 小时前
基于STM32的智能衣柜系统设计与实现——温湿度调控+烟雾报警+远程监控
stm32·单片机·嵌入式硬件
才知道的7 小时前
stm32F407学习DAY.27 ADC
stm32·嵌入式硬件·学习
senijusene8 小时前
i.MX6ULL 裸机 ECSPI 驱动开发详解:
arm开发·驱动开发·嵌入式硬件