学习笔记(6)RT Thread实现OTA-固件升级(制作bootloader+APP+分区)

1 使用的芯片和引脚说明

使用的芯片:STM32F407VET6

串口调试引脚:USART1        PA9      PA10

W25Q128引脚:CS-PB12        SCK-PB13        MISO-PB14        MOSI-PB15

2 制作bootloader

制作bootloader可以参考官方文档:STM32通用Bootloader (rt-thread.org)

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

由于我使用的是STM32F407VET6,所以我的配置如下:

配置好后点击生成bootloader即可获取到bootloarder.

随后我们把生成的bootloarder下载到板子上,这里我使用的是DAP下载器,我们可以利用coflash这个软件,把bin文件下载到板子里面。

假如你下载bootloader固件的时候,下进去是这样的:

那么基本上再次下载程序或者固件是下不进去的,需要将stm32的boot0引脚上拉。

即板子通电前可以用镊子将3.3V和boot0引脚相解除,解除好后再上电,上电后镊子就可以拿开了,然后再下载程序,这样就可以继续下载程序了!!!!!

下载完后,可以看到串口打印出如下信息:

到这里我们的bootloader就已经制作完成。

这个串口打印出的信息参数讲解可以参考:RT-Thread STM32F4通用BootLoader 的制作和使用(串口YModem协议升级方式)_stm32f4 bootloader-CSDN博客

3 制作APP

然后到cubemx setting里配置好时钟和引脚

接下来的这两张图配置SPI是因为我要把download放在w25q128里面才配置,如果你的download只需要放在芯片本身的flash里面,那就可以不配置.

然后在打开SPI2

然后再配置时钟树

随后配置rtthread setting

开启  BSP_USING_ON_CHIP_FLASH(必开),#define BSP_USING_SPI2(用到才开)

添加fal_config

随后将复制过来的inc 目录下的fal_cfg.h变成如下:

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtconfig.h>
#include <board.h>

#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define NOR_FLASH_DEV_NAME             "norflash0"
#else
#define NOR_FLASH_DEV_NAME              FAL_USING_NOR_FLASH_DEV_NAME
#endif


#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)
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;


/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32_onchip_flash;
extern struct fal_flash_dev nor_flash0;

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash_16k,                                         \
    &stm32_onchip_flash_64k,                                         \
    &stm32_onchip_flash_128k,                                        \
    &nor_flash0,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                                                                  \
{                                                                                                                       \
    {FAL_PART_MAGIC_WROD,        "app",     "onchip_flash",      0 * 1024,       128 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD,   "download", NOR_FLASH_DEV_NAME,      0* 1024,        256 * 1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

修改main函数如下:

/*
 * Copyright (c) 2006-2024, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-01-16     RT-Thread    first version
 */
#include <rtthread.h>
#include <board.h>
#include <rtdbg.h>
#define W25Q_SPI_BUS_NAME "spi2"
#define W25Q_SPI_DEVICE_NAME "spi20"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "fal.h"
#define APP_VERSION "1.0.0"
int main(void)
{
    fal_init();
    rt_kprintf ("The·current·version·of ·APP·firmware ·is%s\r\n",APP_VERSION);

    return RT_EOK;
}


//用到W25Q128才需要下面代码
static int rt_hw_spi_flash_init(void)
{
    //此处为片选引脚
    rt_hw_spi_device_attach(W25Q_SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_12);
    //flash名称要正确
    if (RT_NULL == rt_sfud_flash_probe("W25Q128", W25Q_SPI_DEVICE_NAME))
    {
        return -RT_ERROR;
    };
    return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

 接下来的操作要和bootloader对应!!!

 

配置好后,先编译一下!!!

用到的是DAP下载器:

随后再编译下载。

串口打印信息如下:

4 制作一版新的APP将其下载到downloader分区

添加软件包

添加软件包后,编译下载!!一定要下载!

修改main函数将版本号修改为2.0.0,然后编译一下!!!

然后到文件夹中找到这个exe文件,可以直接选中这个文件然后打开文件所在目录

编译后的bin文件, 同样可以直接打开其所在的文件夹。:

    然后将编译后的bin文件放入,如果不懂的一定要参考官方文档是怎么做的:STM32通用Bootloader (rt-thread.org)

 打包好之后我们用Xshell,来进行固件升级。

在 msh 命令行中输入 ymodem_ota 命令,然后回车,然后鼠标右键点击空白处。。选择传输。

然后选中我们生成的rbl文件,将其进行传输。

传输完后,等一会,然后就把新的固件给他下载到download区啦!!!

参考的连接:

STM32通用Bootloader (rt-thread.org)

RT-Thread STM32F4通用BootLoader 的制作和使用(串口YModem协议升级方式)_stm32f4 bootloader-CSDN博客

stm32f407单片机rt thread 片外spi flash OTA升级配置示例_error: 'stm32_flash_start_adress_16k' unde-CSDN博客 

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值