记一次SM32F407ZG死机原因分析

这篇具有很好参考价值的文章主要介绍了记一次SM32F407ZG死机原因分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主芯片:STM32F407ZG
产品软件架构:

  1. bootloader + upgrader / application (upgrader 是一个系统升级器,升级系统专用)
  2. 在bootloader模式下可以加载upgrader或application并启动
  3. 在upgrader模式下可以更新bootloader和整个application.
  4. upgrader和appplication同时只存在一个,由bootloader从文件系统载入STM32F407ZG应用区.

问题描述:两台故障产品在使用过程中意外死机,无法开机,分别编号为1号和2号。
故障机分析处理:
1号已经被重刷程序后修复,故障无法再复现,怀疑是STM32 flash程序区被改,所以首先分析了操作flash的代码,经查擦写flash只发生在成功开机进入系统或者在"系统升级"选项中进行操作时,其他使用过程中不涉及flash擦写。同时编写程序,每隔1秒擦除flash一次,一共执行2万次擦写, 在擦写期间进行各种操作,均无发现死机现象。
2号机拆机检查: 系统上电,STM32 3V3电压正常,但串口无法检测到系统log输出,无法正常开机。

尝试用Jlink Command测试:
撤掉USB和电池供电,飞线连接3V3,SWDIO,SWCLK,GND至JLink Command
执行connect指令,成功连接STM32F407ZG主控
执行halt停机指令,成功停机
J-Link>halt
PC = 08000294, CycleCnt = 00000000
R0 = 00000000, R1 = 00000000, R2 = 00000000, R3 = 00000000
R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 00000000
R8 = 00000000, R9 = 00000000, R10= 00000000, R11= 00000000
R12= 00000000
SP(R13)= 20013378, MSP= 20013378, PSP= 00000000, R14(LR) = FFFFFFFF
XPSR = 01000000: APSR = nzcvq, EPSR = 01000000, IPSR = 000 (NoException)
CFBP = 00000000, CONTROL = 00, FAULTMASK = 00, BASEPRI = 00, PRIMASK = 00
FPU regs: FPU not enabled / not implemented on connected CPU.
执行go全速运行,指令响应OK,但是产品仍无法成功进开机流程,再次执行halt指令:
J-Link>halt
PC = 0800022E, CycleCnt = 06EA7AC4
R0 = 0805A76C, R1 = 20001E78, R2 = 00011500, R3 = 00000000
R4 = 00000000, R5 = 00000000, R6 = 00000000, R7 = 08059AAF
R8 = 00000000, R9 = 00000000, R10= 08059AD0, R11= 08059AD0
R12= 00000000
SP(R13)= 20013378, MSP= 20013378, PSP= 00000000, R14(LR) = 0800019F
XPSR = 21000000: APSR = nzCvq, EPSR = 01000000, IPSR = 000 (NoException)
CFBP = 00000000, CONTROL = 00, FAULTMASK = 00, BASEPRI = 00, PRIMASK = 00
FPS0 = 00000000, FPS1 = 00000000, FPS2 = 00000000, FPS3 = 00000000
FPS4 = 00000000, FPS5 = 00000000, FPS6 = 00000000, FPS7 = 00000000
FPS8 = 00000000, FPS9 = 00000000, FPS10= 00000000, FPS11= 00000000
FPS12= 00000000, FPS13= 00000000, FPS14= 00000000, FPS15= 00000000
FPS16= 00000000, FPS17= 00000000, FPS18= 00000000, FPS19= 00000000
FPS20= 00000000, FPS21= 00000000, FPS22= 00000000, FPS23= 00000000
FPS24= 00000000, FPS25= 00000000, FPS26= 00000000, FPS27= 00000000
FPS28= 00000000, FPS29= 00000000, FPS30= 00000000, FPS31= 00000000
FPSCR= 00000000
初步发现PC和MSP数值正常,但PC停留在代码很靠前的部分,怀疑是反复重启,并且是指在很小一段代码内反复执行,尝试用savebin指令dump芯片内部flash,成功读取1MB的flash数据,经过对flash数据的分析,发现如下信息:
1. app程序区起始地址为0x8080000, 关键字符串upgrader,确定app区域存储的是升级程序upgrader, 版本未定
2. bootloader区起始地址为0x8000000, 经匹配,bootloader程序为xx.x.x版本,为产品发布的第一个正式版本。其中bootloader偏移0x4000-0x8000一共16KB的数据被改写,解析偏移16KB前64字节发现刚好与系统保存的参数格式匹配,但部分参数无法解析
3. 根据上述信息得知upgrader程序是新版本,参数区使用了flash偏移0x4000-0x8000的区域,那么原来的参数在偏移0x60000出原因该会有保留。尝试读取解析:

5E 4F B5 63 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 		FF FF FF FF FF FF FF 0F 00 00 00 38 30 30 31 30 31 59 44 33 31 30 36 30 39 38 37 00 AA AA

解析得到SN号:xxxxxxxxxxxxxxxx,其中生产日期为xxxx.xx.xx,可知原来app区域运行的是xxxx.xx.xx版本,现在已被upgrader程序代替.
4. 根据第3步得到的版本信息,查找对应版本的upgrader文件,与芯片dump出来的upgrader完全匹配得到上述信息后,查看该upgrader的MSP地址(0-3)和程序入口地址(4-7)分别为: 0x2000EA, 0x808029d,使用setPC指令重置MCU PC指针,然后执行go指令,成功跳过bootloader直接开机运行upgrader代码,成功进入upgrader后,通过串口可以登录系统,查看文件系统和关键文件,可以佐证前面步骤的信息

经过上述分析得知: 不开机的原因是bootloader被非法改写。
根据flash镜像的分析推测故障发生的场景: 用户版本为xxxx.xx.xx,用户想要升级系统到xxxx.xx.xy版本,其中upgrader程序已经成功刷到了MCU的应用区,新版本的upgrader会将参数保存在0x4000处,此处会破坏旧版本bootloader, 但是后续没有升级成功,新版本的bootloader没有被写入,此时用户关机、断电、重启等操作将会导致系统完全变砖。联想到最近由于软件架构调整,各个模块的flash地址偏移发生了很大变化,xxxx.xx.xx升级到xxxx.xx.xy及以上版本时存在参数区地址调整,存在此问题,xxxx.xx.xy及以上系统升级不存在这个问题。

解决办法: 修改upgrader程序,在新版本的bootloader成功升级前,不可操作新的参数区,避免旧版本bootloader被非法改写

总结:文章来源地址https://www.toymoban.com/news/detail-487302.html

  1. 针对这种需要修改底层bootloader和系统更新的系统,还是需要完善的测试
  2. flash空间的划分一定要慎重,避免在中途调整,本案例就是由于前期bootloader和application的地址空间分配不合理,application空间过小,需要缩小bootloader的空间来增大application空间,涉及到底层程序的更新,这给对已量产的产品带来很大风险。
  3. 善于使用工具,jlink command是个好东西
  4. 遇事不慌,仔细分析,芯片一般不会有问题,不稳定的外围电路和软件bug带来问题的可能性更大

到了这里,关于记一次SM32F407ZG死机原因分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F407的PWM

    泉水 STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。 高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。 通用定时器也能同时产生多达 4路的 PWM 输出 STM32F407 最多可以同时产生 30 路 PWM 输出! 这里我们仅利用 TIM14的 CH1 产生一路 PWM 输出。 如上所

    2024年02月17日
    浏览(35)
  • STM32F407 移植 FreeRTOS

    本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板 用于移植的基础工程(下面会讲) FreeRTOS源码(下面会讲) 本实验所有用到的代码:基于正点原子STM32F407的FreeRTOS移植工程.zip 1.1 移植前准备 1.1.1 基础工程 由于后续需要用到 LED、

    2024年02月08日
    浏览(55)
  • STM32F407 --USART使用

    目录 1. 串口配置--普通模式 2. 实现数据的传输主函数 1)单引号双引号的应用数组传输 2)将调试信息用串口打印传送到电脑上 1. 串口配置--普通模式 F407使用的M4内核与F103使用的M3内核不一样,导致在使用配置上有区别。需要在F103配置的基础上专门将GPIO的PIN配置成复用功能

    2024年02月16日
    浏览(42)
  • 初识 STM32和STM32F407简介

    2007 年 6 月,ST 在北京发布了全球第一款基于 ARM Cortex M3 内核的 32 位通用微控制 器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣 惊人,一发不可收拾,截止到 2020 年 6 月,STM32 累计出货量超过 45 亿颗。 战舰开发板使用的 STM32F103ZET6

    2023年04月08日
    浏览(58)
  • 基于STM32F407的智能门锁

            在消费升级渗透在各个领域的今天,国民消费发生着巨大的变化,与每个人息息相关的家居行业也是如此。现今,越来越多的智能家居产品出现在普通老百姓的生活中,智能照明、智能窗帘、智能扫地机器人等各种智能产品都给人们的生活带来了极大的便利。智能

    2024年02月11日
    浏览(54)
  • STM32F407添加DSP库

    编译程序出现以下报错 出现 “error: #5: cannot open source input file “arm_const_structs.h”: No such file or directory” 错误的原因是编译器无法找到名为 “arm_const_structs.h” 的头文件。 头文件路径错误 头文件未安装或丢失 编译器配置问题 添加DSP库 添加DSP库可以参考这篇博客: STM32CubeMX关

    2024年02月05日
    浏览(47)
  • STM32F407 滴答定时器

    介绍STM32F407滴答定时器配置方法、使用方式,封装延时函数得到精确的时间。 STM32F407参考手册中第10章介绍了滴答定时器的校准值。 M4权威指南介绍滴答定时器的章节,M3权威指南中与M4权威指南中的介绍一样。 在sys.c文件中增加滴答定时器的代码 在delay.c文件增加以下代码

    2024年02月11日
    浏览(38)
  • STM32F407 电机编码器测量

    STM32的定时器功能非常强大,根据官方手册,定时器的功能如下 高级定时器 TIM1 和 TIM8 主要特性 TIM1 和 TIM8 定时器具有以下特性: ● 16 位递增、递减、递增/递减自动重载计数器。 ● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于

    2023年04月08日
    浏览(41)
  • STM32F407移植OpenHarmony笔记1

    参考文档: OpenAtom OpenHarmony width=device-width,initial-scale=1.0 https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/get-code/gettools-acquire.md/ 搭建环境 安装linux系统: Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-91-generic x86_64) 下载源代码:我选择的是V3.2.4版本 https://repo.huaweicloud.com/openharmony/os/3.2.4/code-v3.2.4-Rele

    2024年01月25日
    浏览(44)
  • STM32F407串口IAP远程升级程序

    相关代码和工程文件链接:https://pan.baidu.com/s/1wN4THWJwqzjjIe7e2TENBA?pwd=o86o 提取码:o86o         STM32代码烧录主要有三种:ICP、ISP、IAP。         ICP(In Circuit Programing),在电路编程,通过JTAG或者SWD接口进行程序的烧录,就是平时利用ST-Link或者J-Link烧录程序;       

    2024年02月10日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包