×

STM32F7 TouchGFX固件更新系统

消耗积分:0 | 格式:zip | 大小:0.57 MB | 2023-02-02

h1654155275.6473

分享资料个

描述

介绍

*2021 年 9 月更新* Bootloader 和固件更新系统现在作为GitHub 上的STM32 Secure Patching Bootloader的一部分提供。

*更新于2020 年 12 月*演示现在使用引导加载程序中的嵌入式 USB 主机来使用 USB 闪存驱动器更新主应用程序。

每个物联网和嵌入式系统都需要一种在现场更新固件的方法。除了最简单的项目,添加功能、修复和推出更新已成为每个软件项目的常态,固件也不例外。

该项目描述并演示了适用于 STM32 MCU 的完整固件更新解决方案,提供行业领先的功能集,包括:

  • 加密
  • 验证
  • 增量修补
  • 双图像
  • 外部 (Q)SPI 闪存上的图像托管
  • 构建工具和 IDE 集成
  • 集成 USB 主机,用于使用 USB 闪存驱动器进行更新

该解决方案旨在支持现场更新最先进的固件应用程序——例如那些包含TouchGFX等 UI的应用程序。我们称之为多段的新功能使用 TouchGFX 实现固件应用程序的无缝启动、更新和修补,这些应用程序分布在内存映射的外部 SPI 闪存上——将内部和外部闪存的组合视为一个逻辑活动区域。

有了这个新功能,现在可以在 STM32 MCU 上为 8 MB GUI 应用程序系统中的单个 GUI 资产(比如 32 KB 图标)打补丁。该固件更新系统可以在您的应用程序没有任何限制的情况下做到这一点。

许多 STM32 MCU 包括具有主机功能的 USB OTG 内核(想想 L4、F4 等),因此 FM-SBSFU 与这种用户友好的更新方法相结合,广泛适用于采用 STM32 系列 MCU 的嵌入式设备。

此外,还有一些模块可用于通过几乎任何方法以 OTA 方式下载补丁,包括:

  • 蜂窝网络(HTTP/FTP - 适用于各种系统)
  • LoRaWAN(对于小型物联网项目,打补丁是必须的)
  • USB 闪存驱动器(在这个新的更新演示中有特色 - 最终用户的不错选择)
  • 非接触式 NFC(非常适合移动设备 - 万岁,不需要蓝牙!)
  • YMODEM over UART(在之前的演示中有特色,更具技术性)
  • 自定义(以太网等)

补丁和编程文件在每次构建结束时使用构建后 shell 和 python 脚本自动生成。我们已将其部署到 STM32CubeIDE。

如果您对此感兴趣,请继续阅读。我们将深入了解其工作原理。让我们从一个演示开始。

TouchGFX 固件更新演示

本demo在STM32F769I-DISCO上运行,将经历补丁更新应用程序的过程。该演示会将中间图像从“彩球”更改为水肺潜水员的图像。

要运行演示,您需要一个STM32F769I-DISCO板、一个 USB 闪存驱动器、STM32CubeProgrammer和两个演示文件:一个 main . hex编程文件和.sfbp更新补丁文件,位于该项目末尾的附件(“原理图”)部分:

  • SBSFU_MultiSegPatchDemo-USBFlash_STM32F7DISCO_v1.0.0.hex
  • MultiSegPatchDemo-USBFlash_STM32F7DISCO_v1.0.0_v2.0.0.sfbp

简而言之,要运行演示 1) 使用 STM32CubeProgrammer 加载 .hex 文件,以及 2) 将 .sfbp 放到 USB 记忆棒上,将其插入适配器,按下复位键。看到版本从 1 增加到 2,中间的图像由于安全补丁文件的内容而改变。详情如下。

sbsfu_multisegpatchdemo-usbflashdrive_GqlMY6T5lV.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
FM-SBSFU 演示设置为 STM32F769I-DISCO 使用 USB 闪存驱动器更新 TouchGFX
 

.hex文件每次构建结束时自动生成,并结合了安全引导加载程序、应用程序和 DISCO 的 QSPI 闪存的内容:分配给ExtFlashSection部分的所有内容。将所有元素组合到一个编程文件中,可以轻松地一步对您的设备进行编程。

.sfbp文件是一个安全补丁 -使用您自己的 AES 和 ECDSA 密钥加密和签名 - 仅包含设备内部和外部闪存上已有的内容与新版本之间的差异。这些差异应用于现有应用程序,以创建位于专用 QSPI 段中的第二个更新映像。在引导加载程序(再次)完全验证重建的更新映像之前,不会触及主应用程序。在此演示中,.sfbp文件仅包含新“水肺潜水员”图像的内容和一些应用程序字符串修改。

对.hex 文件进行编程

启动 STM32CubeProgrammer 并确保通过单击左下方区域的图标选择“ External Loader ”。为 STM32F769I-DISCO 选择加载程序。打开上面链接或附件中下载的hex文件进行烧录,点击program。编程过程擦除必要的内部和外部闪存扇区,然后将 hex 文件的内容写入正确的位置,包括引导加载程序、应用程序和 QSPI。

运行应用程序

重置威廉希尔官方网站 板(这在编程后自动发生)并观察此终端输出到 115200 N81 的 STLINK VCOM 端口。

= [SBOOT] RuntimeProtections: 0
= [SBOOT] System Security Check successfully passed. Starting...
          QSPI Init status=2

= [FWIMG] Slot #0 @: 8080000 / Slot #1 @: 90400000 / Block size: 40000


======================================================================
=                       Firmware Modules                             =
=                                                                    =
=              Secure Boot and Secure Firmware Update                =
=              With Delta Patching                                   =
=              for STM32F7                                           =
=                                                                    =
=                      *** Bootloader ***                            =
======================================================================
  Build Date: Dec 15 2020 10:03:36
  Build Version: v2.1.0-23-g5d206f7
  Anti-rollback: Enabled


= [SBOOT] STATE: WARNING: SECURE ENGINE INITIALIZATION WITH FACTORY DEFAULT VALUES!
= [SBOOT] STATE: CHECK STATUS ON RESET
          INFO: A Reboot has been triggered by a Software reset!
          Consecutive Boot on error counter reset
          Consecutive Boot on error counter = 0
          Consecutive Boot on error counter updated
          INFO: Last execution status before Reboot was:Checking Status on Reset.
          INFO: Last execution detected error was:No error. Success.
= [SBOOT] STATE: CHECK NEW FIRMWARE TO DOWNLOAD
= [SBOOT] STATE: CHECK FLASH MEDIA
= [SBOOT] No valid firmware found on flash media, status=1
= [SBOOT] STATE: CHECK USER FW STATUS
= [FWIMG] No valid header found in slot 1.
          A valid FW is installed in the active slot - version: 4096
= [SBOOT] STATE: EXECUTE USER FIRMWARE


======================================================================
=                   Firmware Modules FM-SBSFU                        =
=                  https://firmwaremodules.com                       =
=                                                                    =
=              Secure Boot and Secure Firmware Update                =
=              For STM32F7                                           =
=              Multi-Segment QSPI Delta Patch FM-SBSFU Demo          =
=              With USB Flash Loader                                 =
=                                                                    =
=                 *** Demonstration Application ***                  =
======================================================================
  FW Version: 1.0.0
  FW Build: v2.1.0-23-g5d206f7
  FW Tag: 0x6D70087E
  QSPI string: This is a message from QSPI!
  Images @ 0x90000000 0x9001c28a 0x90038514


=================== Main Menu ============================

  Download a new Fw Image ------------------------------- 1

  Read Application Info     ----------------------------- 2

在屏幕上您将看到版本 1 图像集:

sbsfu_demo_version1_images_Zm133HsZoD.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
固件模块 SBSFU QSPI Delta Update TouchGFX Demo Version 1 Display
 

每张图片大约 112 KB。.sfbp补丁文件更改了一些文本字符串和中间图像,因此大约为 113 KB。文本字符串驻留在 MCU 闪存中,而图像驻留在 QSPI 闪存中。

执行更新

要执行更新,请将更新补丁文件 MultiSegPatchDemo-USBFlash_STM32F7DISCO_v1.0.0_v2.0.0.sfbp 文件复制到 USB 闪存驱动器,将驱动器插入 USB micro-A 到 A 适配器并按下重置按钮。如文件名所示,此补丁用于将“v1.0.0”更新为“v2.0.0”。它非常精确:要更新的图像的 SHA-256 哈希标签和最终重建的图像包含在补丁文件中,以 100% 确定补丁过程每次都成功完成或根本不完成,以防万一补丁对于设备上的固件不正确。

传输补丁、重建最终更新映像以及复制主应用程序插槽 (SLOT 0) 的顶部都是通过 USB 闪存驱动器快速完成的,主要受限于所涉及的闪存扇区的擦除次数。按下重置按钮后,您将看到从头到尾的更新以及更新进度跟踪,如下所示:

= [SBOOT] STATE: CHECK NEW FIRMWARE TO DOWNLOAD
= [SBOOT] STATE: CHECK FLASH MEDIA
Open update file [MultiSegPatchDemo-USBFlash_STM32F7DISCO_v1.0.0_v2.0.0.sfbp] 115488 bytes
[                                ] 0%
[                                ] 1%
[.                               ] 2%
[.                               ] 3%
[.                               ] 4%
[..                              ] 5%
[..                              ] 6%
[..                              ] 7%
[...                             ] 8%
[...                             ] 9%
[...                             ] 10%
[....                            ] 11%
[....                            ] 12%
[....                            ] 13%
[....                            ] 14%
[.....                           ] 15%
[.....                           ] 16%
[.....                           ] 17%
[......                          ] 18%
[......                          ] 19%
[......                          ] 20%
[.......                         ] 21%
[.......                         ] 22%
[.......                         ] 23%
[........                        ] 24%
[........                        ] 25%
[........                        ] 26%
[.........                       ] 27%
[.........                       ] 28%
[.........                       ] 29%
[..........                      ] 30%
[..........                      ] 31%
[..........                      ] 32%
[...........                     ] 33%
[...........                     ] 34%
[...........                     ] 35%
[............                    ] 36%
[............                    ] 37%
[............                    ] 38%
[............                    ] 39%
[.............                   ] 40%
[.............                   ] 41%
[.............                   ] 42%
[..............                  ] 43%
[..............                  ] 44%
[..............                  ] 45%
[...............                 ] 46%
[...............                 ] 47%
[...............                 ] 48%
[................                ] 49%
[................                ] 50%

= [SBOOT] Firmware patched from flash media and ready to install, status=1
= [SBOOT] STATE: CHECK USER FW STATUS
= [FWIMG] Valid header found in slot 1. Version=8192 Size=390064
= [FWIMG] Valid installation trigger header found in slot 1.
          Potentially valid backup or update firmware present and ready in SLOT 1 - see if it needs to and can be installed.
= [SBOOT] STATE: INSTALL NEW USER FIRMWARE
[................                ] 50%
[................                ] 51%
[.................               ] 52%
[.................               ] 53%
[.................               ] 54%
[..................              ] 55%
[..................              ] 56%
[..................              ] 57%
[...................             ] 58%
[...................             ] 59%
[...................             ] 60%
[....................            ] 61%
[....................            ] 62%
[....................            ] 63%
[....................            ] 64%
[.....................           ] 65%
[.....................           ] 66%
[.....................           ] 67%
[......................          ] 68%
[......................          ] 69%
[......................          ] 70%
[.......................         ] 71%
[.......................         ] 72%
[.......................         ] 73%
[........................        ] 74%
[........................        ] 75%
[........................        ] 76%
[.........................       ] 77%
[.........................       ] 78%
[.........................       ] 79%
[..........................      ] 80%
[..........................      ] 81%
[..........................      ] 82%
[...........................     ] 83%
[...........................     ] 84%
[...........................     ] 85%
[............................    ] 86%
[............................    ] 87%
[............................    ] 88%
[............................    ] 89%
[.............................   ] 90%
[.............................   ] 91%
[.............................   ] 92%
[..............................  ] 93%
[..............................  ] 94%
[..............................  ] 95%
[............................... ] 96%
[............................... ] 97%
[............................... ] 98%
[................................] 99%
[................................] 100%

= [FWIMG] FW installation succeeded.
= [SBOOT] STATE: VERIFY USER FW SIGNATURE
= [SBOOT] STATE: EXECUTE USER FIRMWARE


======================================================================
=                   Firmware Modules FM-SBSFU                        =
=                  https://firmwaremodules.com                       =
=                                                                    =
=              Secure Boot and Secure Firmware Update                =
=              For STM32F7                                           =
=              Multi-Segment QSPI Delta Patch FM-SBSFU Demo          =
=              With USB Flash Loader                                 =
=                                                                    =
=                 *** Demonstration Application ***                  =
======================================================================
  FW Version: 2.0.0
  FW Build: v2.1.0-23-g5d206f7
  FW Tag: 0x7DCDB900
  QSPI string: This is a message from QSPI!
  Images @ 0x90000000 0x9001c28a 0x90038514

引导程序

FM-SBSFU 引导加载程序接管每个设备引导。它在Download SLOT 1中寻找有效的、完整的和重建的更新图像在 QSPI 闪存中。如果它找到这样的图像,就像它在执行补丁的 USB 闪存更新后所做的那样,它会将新固件的版本号与活动固件进行比较。如果新固件更高,例如 2.0.0 对 1.0.0 或 1.0.1 对 1.0.0,则执行更新:活动图像被擦除并复制新图像。如果活动映像已损坏且仅当新固件具有相同或更高版本时,才会执行更新。如果缺少活动图像,则从任何版本执行更新。活动图像标头位于设备的安全内部闪存内,无法操纵它来安装位于不安全外部闪存中的旧版本固件。

请注意,当我们使用此处介绍的 USB 闪存驱动器方法从 SBSFU(引导加载程序)执行更新时,补丁和更新过程是在线进行的,中间没有重置。新应用程序立即启动。另一方面,如果主应用程序正在使用某种 OTA 更新方法(例如通过蜂窝 HTTP)下载和安装补丁,它显然不能覆盖自身并且必须重置以便引导加载程序接管并执行如上所述的更新。

FM-SBSFU 引导加载程序的工作是确保有效且最新版本的固件在设备上处于活动状态。如果主应用程序因任何原因损坏,引导加载程序会通过重新安装主应用程序(受版本检查)来纠正该问题。引导加载程序使用 ECDSA 执行所有身份验证检查,以确保只有您的构建系统签名的固件才能进入您的设备。这些相同的检查由补丁系统和引导加载程序完成,以确保设备的最大安全性、正常运行时间和可用性

更新完成后,应用程序启动,在显示屏上您会注意到中间的图像已更改为水肺潜水员的图像!

sbsfu_demo_version2_images_6yN6wT7EkS.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
固件模块 SBSFU QSPI Delta Update TouchGFX Demo Version 2 Display
 

QSPI flash上​​TouchGFX应用的补丁更新已经顺利完成。想象一下如何将这些技术应用到具有外部 QSPI 闪存的物联网和嵌入式系统产品中!

演示 Flash 布局

现在您已经看到了演示应用程序,我们可以更详细地讨论一下 Flash 布局。demo应用程序按如下方式放置在MCU内部flash板卡QSPI flash中。此位置由构建工具自动设置,并包含在.hex文件和引导加载程序和补丁系统中。

ExtFlashSection(资源)内容映射到 MCU 内存地址(0x9000 0000),该地址在内存映射模式下为 QSPI 保留。内存映射模式允许固件指令从 QSPI 访问数据,就好像它在闪存 (0x0800 0000) 或 SRAM (0x2000 0000) 等任何其他内存空间中一样。好处是访问图像等 GUI 资源不必通过 SPI 闪存固件驱动程序层:STM32 MCU QSPI 外设负责处理。当 TouchGFX 在此模式下运行时,引导加载程序和修补系统使用直接 QSPI 模式执行读取、写入和擦除。

fm-sbsfu_multiseg_flash_layout_zmRxmkV7zY.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
FM-SBSFU STM32F769I-DISCO 演示闪存布局
 

概括

您已经了解了一系列先进技术,可以在结合内部和外部闪存以及 USB 主机以通过 USB 闪存驱动器进行更新的项目中,在现场无缝部署和更新固件。

如果您想了解更多信息和/或有兴趣以比自己安装更快且成本更低的方式安装此系统,

查看我们的 FM-SBSFU 项目:


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'STM32F7 TouchGFX固件更新系统',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);