之前写STM32F4的IAP升级的时候就想写篇博客记录一下,但因为懒就一直没有实施,这次项目用到了STM32H750的IAP升级,所以就趁这次机会记录一下H7的IAP算是补上了。

  1. STM32H750芯片概述
    H750芯片内部存储空间只有128KByte,也就是1个扇区,其工作频率最高可达400MHz,并且配有QSPI与外部FLASH通信,可以直接将内存地址映射到外部FLASH,也就是说可以像读取内部FLASH直接取地址那样去读取外设FLASH(如*(u32*)0x9000 0000)。

  2. 情况分析
    IAP升级主要由跳转处理程序和主程序构成,跳转程序我们称为Bootloader,主程序称为APP。假设APP主程序大小大于128K,也就是说单靠内部FLASH是不够运行的,所以加一个外部FLASH采用内部+外部的方式运行APP,把关键代码运行在内部,剩余的运行在外部。这样运行APP没问题了,那要做IAP升级的话又是什么情况呢?
    要让程序运行在外部FLASH,必须把接口配置为QSPI的内存映射模式,但从参考手册中看到这么一句话:

    也就是说程序运行过程中对QSPI FLASH只能读不能写,H750内部FLASH只有一个扇区,我们知道存储器的擦除是以扇区为单位的,写入内部的话运行在内部的程序也会被擦除掉,所以内部也不能写。那我们升级过程中接收到的app程序要存到哪里呢?那只能是加多一块外部FLASH了。(有更好的想法欢迎评论区讨论!)

  3. IAP设计思路
    综上所述这次H750的IAP升级用到了两片1M的外部FLASH存储芯片(w25q80)。一片主要配合内部FLASH运行APP程序,称为QSPI FLASH。另外一片主要用来存储数据和程序,称为SPI FALSH。128K的内部FLASH分为两段,前20K用来运行Bootloader1,剩下的运行APP的内部程序段(APP1-1)。QSPI FLASH也分成两段,前20K用来存放(这里不是运行)Bootloader2,剩下的运行APP的外部程序段(APP1-2)。上面加粗的字段在下面的内存分配图和流程图中会用到,要看懂流程图还得知道这些字段代表什么东西。

各个存储器的使用分配情况,如下图所示:

其中Bootloader1负责将待更新的app外部程序段(app2-2)从 SPI FLASH 拷贝到 QSPI FLASH的APP1-2中,并且将Bootloader1读出拷贝到SPI FLASH的 bootloader1备份 中。Bootloader2负责将待更新的app内部程序段(app2-1)从 SPI FLASH 拷贝到内部FLASH的APP1-1中,同时将bootloader1备份拷贝回内部FLASH的Bootloader1中。如下图:

分配好内存之后就可以设计程序了,程序分为四个部分,流程图如下:


其中前两个,烧录程序和boot1需要用烧录器(如ST-Link/V2)烧录到单片机中。
首先左边第一个烧录程序:
是用来将Bootloader2和第一个APP程序烧录进对应的外部FLASH存储区的,这里需要用到另外一个工具(点击进我博客下载)将APP和Bootloader2的bin文件转换成c语言数组形式,然后在程序中定义成数组,接着就是把数组里的数据写进对应存储区了,最后设定一个更新标志写进外部SPI FLASH的必要状态标志中,以便Bootloader1中读取判断。芯片的SRAM大小必须大于所有定义数组的总和,不然无法采用这种方法。

第二个程序BOOT1:
运行在内部FLASH中,这个程序的两个功能前面说过:第一个将app外部程序段(app2-2)从 SPI FLASH 拷贝到 QSPI FLASH的APP1-2中,第二个功能将Bootloader1读出拷贝到SPI FLASH的 bootloader1备份 中,最后读取存放在QSPI FLASH中的Bootloader2到SRAM(定义的数组默认地址为SRAM)并跳转运行。需要说明一下,由于单片机每次断电或复位重启后都是从内部FLASH的地址0x0800 0000处开始运行的,意味着单片机每次上电或重启后都会先运行Bootloader1,所以设定了一个更新标志是为了防止每次上电都擦除和读写FLASH,毕竟FLASH都是有擦写寿命的,设定更新标志后,bootloader1只会在第一次运行的时候执行擦写操作,app没有更新的情况下都不会执行擦写操作了。

第三个程序BOOT2:
前面说到这个程序只是存放(不是运行)在QSPI FLASH,理论上来说运行中的程序直接跳转到QSPI FLASH运行应该是可以实现的,但我在测试过程一直没有成功,找不到原因所以改了方案,把BOOT2拷贝到SRAM运行了。BOOT2主要就是往内部FLASH写数据了,写完后直接跳转到APP1-1(0x0800 5000)运行主程序。

第四个程序APP中的接收处理:
出于程序的安全考虑,需要上位机下发APP固件之前先发送APP的长度,网口接收到数据长度和数据之后进行长度校验,校验成功才置位更新标记并重启(软复位函数:NVIC_SystemReset())。重启后单片机又会从BOOT1(0x0800 0000)处开始运行,再次执行前面的步骤完成更新!

STM32H750 iap固件升级相关推荐

  1. RS485接口的IAP固件升级工具

    RS485接口的IAP固件升级工具 文章目录 RS485接口的IAP固件升级工具 前言 一.概述 二.IAP技术原理 三.IAP编程实现 1.bootloader程序 2.APP程序 四.上位机的编写 ...

  2. iap升级问题 stm32f103r8_STM32的基于串口的IAP固件升级与加密

    大家好,我是川楠,最近,在问答频道上看到有人对IAP升级心存疑惑.恰好,我本人在这方面的做过功课,也实战使用到很多的项目上,所以我就来为大家做个抛砖引玉吧. 本次例程,我用的是STM32F103VET ...

  3. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 1. service用法 oneshot DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex ...

  4. 嵌入式固件的自校验方案(keil + arm)

    嵌入式固件的自校验方案 背景 环境 方案 步骤 背景 嵌入式项目大多都有iap固件升级功能,而网络传输过程文件损坏,升级这些损坏的固件很有可能导致仪器死机成砖的情况,这样在无人值守的情况下,仪器死机会 ...

  5. 安富莱v6开发板网口通讯_【STM32-V6】STM32F429BIT6开发板开源, 丰富软件资源, 强劲硬件配置, 配套600多实例, 17套手册持续更新中2020-12-14...

    STM32-V6 开发板HAL版教程 ********************************************************************************* ...

  6. Ymodem下载协议

    背景 这里的Ymodem是YMODEM-1K(除此还有Ymodem-g(没有CRC校验,不常用)),经常使用在IAP固件升级中.是X-modem协议升级过来的,每一包数据可以达到1024字节,比X-m ...

  7. 基于IAP实现的STM32F系列固件升级(远程升级 + SD卡升级)

    谈到STM32固件更新,首先就要了解一下固件的概念.固件是指下载到芯片里面去运行的二进制代码数据,是代码工程编译之后生成的,大家如果用的是MDK Keil的话,点了那个编译之后,就会生成固件,点击下载 ...

  8. CRC校验原理及STM32 IAP在线升级程序

    CRC校验原理: 什么是CRC校验? CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数据传输检错功能,对数据 ...

  9. STM32通过USB实现Bootlader/IAP功能

    前沿: 最近在做STM32的USB Bootlader/IAP功能,也就是通过USB实现固件升级,本文介绍下实现的基本思路,希望对实现IAP的同学一个参考,改方法已经在产品中得到实际应用并验证是比较合 ...

最新文章

  1. Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)
  2. Windows 8.1 新增控件之 DatePicker
  3. 沟通CTBS助六和集团实现财务集中管理
  4. java jdk win10安装_Java 安装 JDK WIN10
  5. 【指标需求思考】如何做好指标类需求建设
  6. 阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景
  7. dicom虚拟打印服务器,DICOM打印服务器软件
  8. (王道408考研数据结构)第六章图-第四节3:最短路径之BFS算法(思想、代码、演示、答题规范)
  9. Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
  10. 让visual连接sqlserver数据库
  11. webstorm 配置sass
  12. SmartUpload
  13. python中的计数函数_Python Numpy统计函数
  14. Python求指定范围内质数与合数-详解
  15. 2018,我的这一年
  16. 【matlab】 matlab的输入和输出
  17. VMware:继续使用 Adob​​e Flash 管理您的 vCenter
  18. [单片机框架] [drivers] [hc4051] 8路模拟分流器
  19. HOKA ONE ONE宣布潘俊帆成为品牌飞耀大使
  20. android.view.InflateException: Binary XML file 解决方

热门文章

  1. 网络上如何区分不同计算机,什么是耦合度?按耦合度的不同,如何区分计算机网络和其他计算机系统?...
  2. 正则表达式 圆括号 方括号_使用正则表达式解决平衡括号问题
  3. ChartCtrl-Hight-Speed 学习(一)
  4. C# 异步委托 BeginInvoke EndInvoke
  5. Java压缩Zip格式提速
  6. 京东放弃快递员最佳雇主,人工智能如何变革13万亿物流产业?
  7. 攻防世界 welpwn WP
  8. NUC 11构建 ESXi 7.0.3f安装网卡驱动-V2(2022年7月升级版)
  9. 医院网络编辑规范标准
  10. 统计机器翻译词对齐模型IBM-model1