当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]大家好,我是bug菌!最近一些朋友在玩在线升级,所以这里bug菌挑选了一篇原理与实践结合的技术文章,在stm32上实现还是比较详细的,以前bug也跟大家介绍过这一块的设计方案:【重磅】剖析MCU的IAP升级软件设计(设计思路篇)【MCU】一种"灵活且省资源"的IAP升级方案当然目...

大家好,我是bug菌!

最近一些朋友在玩在线升级,所以这里bug菌挑选了一篇原理与实践结合的技术文章,在stm32上实现还是比较详细的,以前bug也跟大家介绍过这一块的设计方案:

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

【MCU】一种"灵活且省资源"的IAP升级方案

当然目前比较火热的OTA升级,为了保证升级过程的权限、完整性、稳定性等等,还需要做很多工作包括加密、压缩等等,可能会更加复杂一点,特别是差分升级,通过版本之间的差异来生成升级包进行升级,一方面可以节省空间,另一方面也能够加快升级速度,这一块bug菌后续整理一下~

好了,下面这篇文章,大家好好学习一下:

简介

本文主要讲解在线升级IAP的基础知识, 主要是针对IAP 原理分析分区划分, 到代码编写实验验证等过程阐述这一过程. 帮助大家加深对在线升级的认识.

1. 在线升级知识

什么是BootLoader?

BootLoader可以理解成是引导程序, 它的作用是启动正式的App应用程序. 换言之, BootLoader是一个程序, App也是一个程序,  BootLoader程序是用于启动App程序的.

STM32中的程序在哪儿?

正常情况下, 我们写的程序都是放在STM32片内Flash中(暂不考虑外扩Flash). 我们写的代码最终会变成二进制文件, 放进Flash中 感兴趣的话可以在Keil>>>Debug>>>Memory中查看, 右边Memory窗口存储的就是代码

接下来就可以进入正题了.

进行分区

既然我们写的程序都会变成二进制文件存放到Flash中, 那么我们就可以进一步对我们程序进行分区. 我使用的是F103RB-NUCLEO开发板,他的Flash一共128页, 每页1K.见下图:

以它为例, 我将它分为三个区.BootLoader区、 App1区、 App2区(备份区)具体划分如下图:

  • BootLoader区存放启动代码
  • App1区存放应用代码
  • App2区存放暂存的升级代码

总体流程图

  • 先执行BootLoader程序, 先去检查APP2区有没有程序, 如果有就将App2区(备份区)的程序拷贝到App1区, 然后再跳转去执行App1的程序.
  • 然后执行App1程序, 因为BootLoaderApp1这两个程序的向量表不一样, 所以跳转到App1之后第一步是先去更改程序的向量表. 然后再去执行其他的应用程序.
  • 在应用程序里面会加入程序升级的部分, 这部分主要工作是拿到升级程序, 然后将他们放到App2区(备份区), 以便下次启动的时候通过BootLoader更新App1的程序. 流程图如下图所示:

2. BootLoader的编写

本节主要讲解在线升级(OTA)的BooLoader的编写,我将以我例程的BootLoader为例, 讲解BootLoader(文末会提供免费的代码下载链接),其他的大体上原理都差不多。

流程图分析

以我例程的BootLoader为例:

我将App2区的最后一个字节(0x0801FFFC)用来表示App2区是否有升级程序, STM32在擦除之后Flash的数据存放的都是0xFFFFFFFF, 如果有, 我们将这个地址存放0xAAAAAAAA. 具体的流程图见下图所示

程序编写和分析

所需STM32的资源有:

  • 发送USART数据和printf重定向
  • Flash的读写
  • 程序跳转指令,可以参考如下代码:
1/* 采用汇编设置栈的值 */
2__asm void MSR_MSP (uint32_t ulAddr)
3{
4    MSR MSP, r0   //设置Main Stack的值
5    BX r14
6}
7
8
9/* 程序跳转函数 */
10typedef void (*Jump_Fun)(void);
11void IAP_ExecuteApp (uint32_t App_Addr)
12{
13  Jump_Fun JumpToApp;
14
15  if ( ( ( * ( __IO uint32_t * ) App_Addr ) 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭