stm32进阶-OTA升级功能的完善

1、以往简单的实现

以前自己也做了IAP升级,但是以往的流程是

应用层选择程序进行串口升级

  1. 串口接收完毕后存放到指定分区后断电
  2. 断电,判断是否有升级标记位
  3. 不升级就跳转到正常运行区,升级就开始复制数据到运行区
  4. 跳转前检查是否有运行成功标记位,有的话才跳转
  5. 没有运行成功标记位则报错,提示单片机启动失败
  6. 跳转运行成功,赋值成功标记位
  7. 跳转失败程序已经跑飞,也恢复不了,只能关机从2开始再次执行

这里面的缺点就是对于数据没有保护

网上看了一下,主要看这篇博客OTA远程升级固件安全验证流程,

2、添加加密算法

准备工作就是windows先生成密钥对,下位机存储公钥数据

添加以后的流程大概就是:

  1. 上位机对升级文件进行计算生成哈希值
  2. 上位机对生成的哈希值进行加密生成数字签名
  3. 上位机执行升级命令,将发送数字签名和升级文件
  4. 下位机接收完成后存储重启
  5. 重启以后先检查标记位,查看是否有升级命令
  6. 有升级则取出公钥进行验签,通过则跳转,不通过继续执行之前的代码
  7. 无升级就进行运行区的内容计算校验,查看是否存在存储损坏,某一个bit跳变的情况
  8. 一切正常则跳转,跳转后设置程序当前运行区和启动状态

在启动过程中,上下位机需要建立及时的通讯机制以及报错机制,在出现问题时帮助其他工程师排除问题

3、具体实现

Flash分了五个区,

  1. bootloader,
  2. App1,
  3. App2
  4. publickey
  5. config

每次假设运行区在App1,接收的升级数据就存放在App2中,相关的数字签名就存放在Config区,验签所需要的公钥存储在publickey区

因为跟项目相关就不贴代码了,但是把代码的执行流程说一下

3.1、上电启动,执行时钟和外设初始化

3.2、进入while循环,等待上位机程序启动成功

3.3、收到上位机启动成功后程序开始运行命令

3.4、开始运行,先查看上次的启动状态标记位是否正常启动

3.4.1、未正常启动,查看未启动成功次数,

  • 如果超过三次就停止跳转,等待重新升级,同时上报错误
  • 未超过三次则继续跳转到上次的启动区域

3.4.2、如果是启动成功,则判断config区是否有升级标记位更新

假设此时App1有升级标记位,则进行数据验签,

  • 通过则跳转到App1的地址运行,同时记录当前的运行区域,更改标记位,当前App1的Flash内容的校验和存储进Config区,避免遇到内存损坏
  • 未通过则上报错误,询问上位机是等待升级还是重新运行上一个区域,等待上位机返回

3.5、跳转前将启动状态标记位改为异常,等到正常的App启动以后改为正常,等待App启动

3.6、App启动成功

在bootloader里面最好每一个功能步骤都向上位机发送一个状态位

相关推荐
一条破秋裤13 分钟前
STM32 学习笔记:GPIO 输出实验——LED 闪烁、流水灯与蜂鸣器
笔记·stm32·学习
单片机仿真设计1 小时前
【proteus仿真】基于 51 单片机距离传感器警报装置设计(仿真图+程序)
单片机·嵌入式硬件·51单片机·proteus·毕设
一条破秋裤2 小时前
STM32 学习笔记:GPIO 输出原理与硬件设计
笔记·stm32·学习
单片机仿真设计3 小时前
【proteus仿真设计】基于 STM32 单片机火灾监测报警系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
一条破秋裤3 小时前
STM32 学习笔记:OLED 调试工具与 Keil 在线调试
笔记·stm32·学习
一条破秋裤3 小时前
STM32 学习笔记:中断系统与 EXTI 外部中断
笔记·stm32·学习
jianqiang.xue3 小时前
低功耗产品架构专项优化:电池供电设备休眠、唤醒、漏电流、待机功耗极致优化
stm32·单片机·mcu·物联网·架构·esp32
Mount2564 小时前
STM32CubeIDE使用教程(自用)
stm32·嵌入式硬件
ACP广源盛139246256734 小时前
端侧 AI 硬件架构实践@ACP#中端边缘整机 PCIe 扩展与 IX7012 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构
ACP广源盛139246256734 小时前
端侧 AI 硬件架构探讨@ACP#多外设高密度整机 PCIe 扩展与 IX7024 器件分析
大数据·数据库·人工智能·嵌入式硬件·开源·硬件架构