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

相关推荐
Brilliantwxx15 分钟前
【STM32】RTC 完结篇:日期操作、闹钟中断与附录(时间戳 / 闹钟 / NTP)
服务器·c语言·stm32·单片机·嵌入式硬件·实时音视频
深圳老胡18 分钟前
STM32C5 应用阶段开发难点解析:从选型到量产的实战经验
笔记·stm32·单片机·代码规范
李永奉19 分钟前
杰理可视化SDK开发-【BUG】AC7006F8芯片开启一拖二和双麦通话语音算法后,设置触摸音在唤醒语音助手和通话时触摸音没作用问题
单片机·嵌入式硬件·mcu·物联网·电脑·bug
HQB202614 小时前
EG1198|屹晶微电子 120V 内置 MOS 异步降压 DC‑DC(高性价比)
嵌入式硬件·硬件工程
果壳science15 小时前
张祥前实验如何获取正电荷
笔记·科技·嵌入式硬件·硬件工程·制造
南山电子nscn15 小时前
中科芯CETC汽车电池管理系统BMS进口芯片国产型号替代指南
单片机·汽车·bms
沉淀的.晴天16 小时前
can总线
stm32
桀人16 小时前
认识AT24C02
stm32·单片机·嵌入式硬件
国科安芯17 小时前
星间激光通信终端CANFD控制网络的时延确定性与辐射可靠性
网络·嵌入式硬件·信息与通信·canfd·低轨卫星·商业航天·抗辐射
一直C17 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull