前言

在学习OTA之前,请先参考上两篇博客写的关于SPI设备及W25Q128的使用方法,传送门:

https://blog.csdn.net/tigerots/article/details/107423633
https://blog.csdn.net/tigerots/article/details/107933991

如何使用OTA

一. 制作BootLoader

  1. 打开Bootloader 在线获取地址,注册,并根据RT-thread官方文档生成BootLoader,官方文档已经写的很清楚,再此不在复述。

Bootloader 在线获取地址: http://iot.rt-thread.com

此处需要格外注意三点:
第一, 要根据自己的硬件实际情况配置端口,比如,我用的是SPI2,使用PB13作为CS引脚,配置如下图所示:

第二,根据需求配置分区表,要求app分区不能小于编译完成后的固件大小,偏移地址根据提示填写,一般配置为128K即可,所以app分区的起始地址要让过开始的128K。download分区用于临时存放下载下来的固件,可以放在片内分区,也可以放在片外分区,分区大小依然要大于固件大小。配置完成后,请牢记如下地址。(我暂时没有使用出厂固件)。

第三,压缩及加密方式选择,这里需要注意的是,固件制作是,必须和此处配置的压缩和加密方式相同。
2. 下载BootLoader文件并通过下载器下载到芯片。至此BootLoader制作完成。启动板子后会有对应提示

二. 应用程序增加下载代码列表

  1. 在软件包中心添加ota软件包

  2. 在OTA详细配置中,修改升级方式

  3. 在fal详细配置中,选择使用SFUD驱动程序,设置FAL设备名称为SPI FLASH,我的设备名称为“w25q128”.
    4. 使能片内flash

  4. 拷贝fal_cfg.h文件,并进行修改,内容如下,重点修改

#define RT_APP_PART_ADDR 0x08020000 为app起始地址,用于设置中断向量列表
#define FAL_FLASH_DEV_TABLE 结构中增加片外flash
#define FAL_PART_TABLE 根据BootLoader中的地址配置,修改分区表,注意,分区表的起始地址,F4系列128K的分区起始地址为0x08020000,所以设置的便宜地址为0


#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtthread.h>
#include <board.h>

#define RT_APP_PART_ADDR 0x08020000 //app begin address


#define NOR_FLASH_DEV_NAME "w25q128"
extern struct fal_flash_dev             nor_flash0;



#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K (64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024)

#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K)

extern  struct fal_flash_dev stm32_onchip_flash_16k;
extern  struct fal_flash_dev stm32_onchip_flash_64k;
extern  struct fal_flash_dev stm32_onchip_flash_128k;

/* flash device table */
#define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash_16k, \ &stm32_onchip_flash_64k, \ &stm32_onchip_flash_128k, \ &nor_flash0, \ }
// &nor_flash0,
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG

/* partition table */
#define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0, (384 * 1024), 0},\ {FAL_PART_MAGIC_WROD, "download", "w25q128", 0, (384 * 1024), 0},\ }

#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
  1. 增加中断向量表映射函数,之后保存并编译
static int ota_app_vtor_reconfig(void)
{
     #define NVIC_VTOR_MASK 0x3FFFFF80
     /* Set the Vector Table base location by user application firmware definition */
     SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

     return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);
  1. 修改link文件中内存地址

三. 打包固件

按如下步骤打包,注意打包器配置要和BootLoader相同

四. 升级固件

按提示,在命令行输入升级命令,并发送升级文件,等待升级
注意: 使用片外Flash升级,升级速度相对较慢,请耐心等待

本文地址:https://blog.csdn.net/tigerots/article/details/107961967