代码之家  ›  专栏  ›  技术社区  ›  burnersk

如何为STM32F4微控制器的闪存组实现OTA更新故障切换方案?

  •  1
  • burnersk  · 技术社区  · 6 年前

    我用的是32位的手臂 STM32F439ZI 我的项目的微控制器。正如数据表所指出的,微控制器有2兆的闪存被组织成2组,每组1兆,用于同时读写/擦除。

    我想为微控制器介绍空中传送(OTA)固件更新。

    当然,我只能使用引导加载程序闪存下载更新二进制文件。不过,我想介绍一个安全网,使用两个1兆闪存组作为故障保护功能。

    例如:

    1. 应用程序将新的OTA固件包下载到外部存储器上。
    2. 应用程序使用内部闪存(模拟EEPROM)设置一个标志,作为引导加载程序的信息,以从外部存储器加载OTA固件包。
    3. 引导加载程序检查哪个“分区”(闪存组A或B)处于活动状态,切换状态并将OTA固件包闪存到刚刚激活的闪存组上。
    4. 引导加载程序检测到气缸组B是活动气缸组,并将其内容作为固件加载。
    5. 当出现看门狗事件或崩溃时,引导加载程序会检测寄存器标志并切换到包含以前固件版本的闪存组。

    STM32F4系列是否可能或推荐该过程?有更好的方法吗?引导加载程序调度调用(对活动flashbank的主函数)是什么样子的(ansic)?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Amit    5 年前

    我不确定,如果我完全理解“双引导”,但如果它是关于在闪存中有两个版本的固件(当前工作的一个要更换,新的固件),那么最简单的方法是让引导加载程序在启动OTA之前在闪存的一个单独区域中备份应用程序固件,但是,这会减少可用闪存的总量。我的硕士论文( Fail-proof over the air firmware upgrade for embedded systems )是关于一个非常相似的话题。你也许想看看。

        2
  •  0
  •   valenok    5 年前
    1. https://mongoose-os.com https://github.com/cesanta/mongoose-os . 引导程序repo位于 https://github.com/mongoose-os-apps/bootloader

    2. 对于没有内置连接的STM32设置,另一种方法是使用 https://vcon.io . 也就是说,一个ESP32/ESP8266通信模块(以太网、WiFi、蜂窝),它可以对任何连接的STM32微控制器进行OTA,并通过各种模式(例如透明UART桥)提供连接。