一步一步实现STM32-FOTA系列教程之STM32-FLASH分区说明

一步一步实现STM32-FOTA系列教程之STM32-FLASH分区说明

前言

如果想在 STM32 上面实现 FOTA功能,就需要对 STM32 的 FLASH 分区有一定的了解,要搞明白运行在 STM32 上的固件都是如何在 FLASH 上存储的,才能够非常灵活的实现 FOTA 。本教程是在 STM32F103RCT6 单片机上实现的 FOTA,因此会对这款单片机的片上FLAH分区进行说明。
转载请注明出处

STM32 FLASH 地址空间介绍

STM32 系列单片机型号众多,不同型号单片机的 FLASH 容量也有所不同。笔者所使用的 STM32F103RCT6 单片机的 FLASH 大小为 256KB,属于 STM32F103 系列单片机中大容量产品。这款单片机的 FLASH 分区结构如下图所示。

从图中可以看出,FLASH 主存储器的起始地址就是 0x0800 0000 主存储器地址空间被划分为了256夜,每页长度为2KB,在 BOOT0、BOOT1 启动方式选择引脚都接地的情况下,就是从该地址开始运行代码的。
由于这款单片机的 FLASH 大小为 256KB,FLASH 主存储器的空间大小为 0x4 0000 ,即从 0x0800 0000 开始,到 0x0803 FFFF 结束。

对于不需要实现 FOTA 功能的 单片机开发而言,可以不用过多的对 FLASH 地址空间进行详细的了解。直接将程序烧写到 FLASH 中运行即可。但是如果要实现 FOTA 功能,则需要对单片机的片上 FLASH 进行在线编程。因此,必须对 FLASH 地址空间的利用有非常明晰的定义,才能够实现在线 FLASH 编程,这样所运行的代码才能准确无误的在单片机上运行。

Bootloader 和 FLASH 分区说明

熟悉 Linux 开发的开发者都知道,运行 Linux 嵌入式平台的硬件系统一般都有一个 Bootloader 程序去引导和加载 Linux 系统运行,并且还能够烧写 Linux 系统,在嵌入式系统中常用的 Booloader 程序是 uboot,这是一款体积小巧,功能强大的开源 Bootloader 代码。

而在 STM32 的开发中,由于所开发的单片机代码功能简单小巧,常常可以不需要 Boodloader 代码,直接将程序烧录到 FLASH 中运行即可。

由于FOTA 是进行远程升级的。也就是说,所有的升级操作需要单片机中的程序自主完成,包括检查固件版本、拉取固件、烧写固件到 FLASH 、重启运行新版本等。因此,能够想到的很简单的方式就是在已有的代码上加入FOTA升级功能的代码。

如果单单只在 FLASH 中运行一段简单的带有FOTA功能的代码的话,如果在进行远程升级的过程中失败了,由于在升级过程中会对已存在的FLASH分区的代码进行改写,一旦重启,则程序就再也运行不起来了,那对于运行在外场的设备而言,这台设备也就挂了,除非人为的将设备拆卸下来人为的进行烧录。那么对于FOTA部分功能的开发,则已经失去了意义。

为了防止以上问题的出现,现在主流的 FOTA 方案大都是进行交叉备份升级,即在 FLASH 中 存放两套可执行文件,FLASH分区可以如下图所示。

从图中可看出来,FLASH 主存储区域被人为的分成了4块,分别为Bootloader区、主分区、备份分区和静态区。其中Boodloader区占有 64KB ,静态区占 32KB,主分区和备份分区分别占80KB,主分区和备份分区即为之前所运行的单片机功能代码,在进行FOTA 升级时,两个分区会进行交替式升级,这种升级方案的有点是至少保证FLASH空间中有一个分区的代码是能够正常运行的,因此被广泛应用。缺点也非常明显了,开发复杂,占用FLASH 空间资源大。

Bootloader 的必要性

一旦采用了这种交叉备份升级方式,则必须为单片机额外单独开发一个 Bootloader ,这是因为单片机在硬件确定从FLASH启动的情况下,每次上电都会从 0x0800 0000 这个地址开始运行,如果采用了主分区和备份分区这种方式,则还需要一段程序用于上电跳转运行,而这段程序就是 Bootloader了。因此,必须要为单片机重新开发一款 Bootloader代码才行。

这个Bootloader代码的功能可以非常简单,就是在单片机上电之后,判断要从哪一个分区开始运行。当然,还需要在静态区中设置一个上电启动标志位,在单片机上电之后,Bootloder 会从 FLASH 静态区中读取启动标志位,并根据标志位的值选择相应的分区实现跳转。

当然,也可以在Bootloader里面增加一些比较复杂的功能,比如上电从远程服务器获取版本信息、串口IAP、USB IAP等等,这个就根据项目需求自行开发就好。本教程实现的Bootloader非常简单,就是一个简单的分区引导。

Bootloader 运行流程

一步一步实现STM32-FOTA系列教程之STM32-FLASH分区说明_第1张图片
Bootloader 实现请看下一篇文章

参考文档

正点原子 STM32 系列开发板IAP实验

你可能感兴趣的:(STM32开发,物联网平台)