晶华微SD93F115B远程升级应用方案

描述

SD93F115B远程升级应用方案

01概述

在传统嵌入式开发中,固件在设备出厂时即被固化,其生命周期的功能也随之被定格。这导致任何后续的功能迭代、优化都无法有效部署,极大地限制了产品市场的竞争力。远程对设备的固件进行更新可以持续为用户提供新功能和体验,降低运维成本和潜在风险。因此,远程升级功能是嵌入式设备中的核心基础功能。

02方案介绍

SD93F115B的Flash一共有120K,将这120K分为3个区域,Bootloader分12K,Flag分1K,APP分107K。Bootloader是固件更新是用到的程序,Flag用于存放固件更新状态的标志,APP是应用程序。

bootloader

内存分配框架

一般状态下,固件更新是由APP区域的代码发起的,当APP收到固件更新命令后就可以跳转至Bootloader区进行固件更新。如果固件更新时发生断电或其他错误,再重新上电后Bootloader也会检查当前固件以及标志位的状态,检查到错误也会执行固件更新功能。

Bootloader区的代码用于在收到固件命令或检查到当前固件错误时更新当前的固件。芯片上电后是否进行固件更新由Flag区域的标志位确定。

03方案功能说明

APP功能

APP区域主要用于编写应用程序,当程序运行在此区域时收到固件更新命令后,其主要功能为:

更新Flag区的标志位,保证后续跳转至Bootloader区后固件更新命令的顺序执行

在收到固件更新命令后跳转至Bootloader区,以启动更新流程

Flag功能

Flag区不需要存储代码,而是专门用于记录固件更新的状态(例如:更新中、更新成功和更新失败)以及固件的校验码等其他信息。

Bootloader功能

在芯片上电时,会先启动Bootloader,对Flag区域进行检查以确定当前固件是否需要升级,如果需要就跳到升级功能,等待接收新固件,否则就直接跳转到APP执行应用程序。

在整个固件更新过程中,Bootloader会动态更新Flag区的标志位,如果因为中途断电导致更新失败,再次上电时,Bootloader能通过Flag区的标志位识别到当前状态不是“更新成功”,从而再次执行固件更新功能,防止设备不能正常使用。

固件更新整体流程如下:

bootloader

远程升级流程图

启动文件

正常情况下芯片上电会先执行main函数,想要实现以上方案,需要修改启动文件。将固件更新函数的执行放在main函数之前。改写内容如下图。

bootloader

启动文件 Startup_xxx.S

在SD93F115B的启动文件system_SD93F115B.c中添加CPUInit函数和SystemInit函数,并在system_sd93f115b.h中声明。以上函数需要设置在Bootloader区,以保证上电时芯片能够正确初始化。函数内容如下图。

bootloader

CPUInit函数

bootloader

SystemInit函数

04方案特点

不需要同时保存两个版本的固件,最大化利用芯片的Flash空间;

更新失败后可以重新更新,防止设备更新失败后无法使用;

可以根据需要选择固件更新的协议。

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

全部0条评论

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

×
20
完善资料,
赚取积分