【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能

这篇具有很好参考价值的文章主要介绍了【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

由于项目需要实现OTA功能学习了一下具体实现方法,以备后期查看,有问题的地方随时指正修改

理论

1.什么是OTA
OTA是“over-the-air”的缩写,是一种无线技术,用于在不需要接触设备的情况下向移动设备或物联网设备提供更新、补丁或新版本的软件。OTA更新通常通过无线网络(如Wi-Fi或移动数据)进行,这使得设备可以在不需要任何物理连接的情况下获得更新。这种技术在智能手机、智能家居设备和车载系统等设备中得到广泛应用。
2.什么是BootLoader
BOOTloader是一段特殊的程序,在计算机启动时运行。它的主要作用是读取和加载操作系统。

当计算机启动时,BOOTloader首先加载并启动操作系统。它负责加载内存中的系统映像,并初始化基本硬件设置。BOOTloader还可以提供一些选项,如选择不同的操作系统版本或进入系统恢复模式。

BOOTloader通常存储在只读存储器(如ROM或flash存储器)中,因此不容易遭到破坏或更改。它是系统启动过程中非常重要的一部分,因为如果BOOTloader不能正常工作,则系统将无法启动。


所以我们想实现BootLoader的话要对flash分区,及对内部偏移地址进行指定,OTA主要是一种技术手段,我们主要是实现BootLoader。

正文

本次教程实现的功能是使用网线对STM32F407VGT6进行OTA升级。

BootLoader

  1. 新建工程
    根据自己的实际情况选择芯片及型号后编译下载初始代码,检查芯片及串口功能是否良好。
    bootloader ota,单片机,stm32,嵌入式硬件
    bootloader ota,单片机,stm32,嵌入式硬件2. 通过Cube配置功能
    我这里使用的SPI3,CSS脚PE1。
    bootloader ota,单片机,stm32,嵌入式硬件

点击CubeMX Settings 配置时钟,SPI引脚(片外Flash),串口
bootloader ota,单片机,stm32,嵌入式硬件3.配置RT-Thread
在项目资源管理器中点击drivers->board.h文件配置 使能SPI、片内Flash

#define BSP_USING_SPI3
#define BSP_USING_ON_CHIP_FLASH

点击RT-Thread Settings 使能SPI、SFUD、FAL、QBOOT驱动程序
在FAL下要勾选FAL使用SFDU驱动程序,这个主要是管理片外Flash
在QBOOT组件下根据自己的需求进行勾选相应的功能
bootloader ota,单片机,stm32,嵌入式硬件

bootloader ota,单片机,stm32,嵌入式硬件bootloader ota,单片机,stm32,嵌入式硬件

  1. 编写SFUD驱动及FAL分区
    新建w25q.c文件添加如下代码,这个是使用SFUD驱动程序通过SPI对W25Q128抽象化管理。
#include <rtthread.h>
#include "drv_spi.h"
#include "spi_flash_sfud.h"

#define SPI_BUS_NAME                        "spi3"
#define W25Q_SPI_DEVICE_NAME                "spi30"
//#define W25Q_FLASH_NAME                      "W25Q128"




static int rt_hw_spi_flash_init()
{
    rt_err_t ree = RT_EOK;

    ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOE, GPIO_PIN_1);
    //ree = rt_hw_spi_device_attach(SPI_BUS_NAME, W25Q_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_6);
    /* 使用 SFUD 探测 spi10 从设备,并将 spi10 连接的 flash 初始化为块设备,名称 W25Q128 */
    if (RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, W25Q_SPI_DEVICE_NAME))
    {
            return -RT_ERROR;
    }
    return ree;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

新建fal_cfg.h文件,对flash引入及分配内存,这要注意芯片的flash大小及偏移地址可能不同,我这个是对F404VGT6的,所以要看数据手册进行修改。

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

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



#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 struct fal_flash_dev nor_flash0;


#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 */


//config_data分区必须是128k的整数倍,如果设置为1K,则在OTA升级后会擦除掉config_data分区的数据
//这种配置占用芯片flash太多,如果芯片flash存储空间不够可以考虑将config_data分区放在外部spi flash里

#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,       "app",     "onchip_flash_128k",   0,  768*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "config_data","onchip_flash_128k",768*1024,  128*1024, 0}, \
    {FAL_PART_MAGIC_WORD, "download", FAL_USING_NOR_FLASH_DEV_NAME,0, 1024*1024, 0}, \
}

/*
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,       "config_data",     "onchip_flash_128k",   0,  128*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app","onchip_flash_128k",128*1024,  768*1024, 0}, \
    {FAL_PART_MAGIC_WORD, "download", FAL_USING_NOR_FLASH_DEV_NAME,0, 1024*1024, 0}, \
}
*/

#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

修改main.c文件,添加FAL头文件及初始化

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#include <fal.h>

int main(void)
{
    int count = 1;

    fal_init();
    while (count++)
    {
//        LOG_D("Hello RT-Thread!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

5,下载验证
编译下载验证,只要开到这几条打印就代表BootLoader成功了

bootloader ota,单片机,stm32,嵌入式硬件

APP实现

  1. 创建工程
    复制bootl工程改名为App
    bootloader ota,单片机,stm32,嵌入式硬件2. 测试APP跳转
    在RT-Thread Studio 中删除所有软件包,修改main函数,添加中断向量表跳转函数
#include <rtthread.h>
#include "fal.h"
#include <drivers/pin.h>




#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define RT_APP_PART_ADDR                0x08020000




int main(void)
{
    int count = 1;

 		fal_init();
//    LOG_D("Hello RT-Thread!");
    while (count++)
    {
        LOG_D("Hello RT-Thread!!!!!!");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}


static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0xFFFFFF80
    /* 根据应用设置向量表 */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

然后在linkscripts下修改链接脚本起始地址,和下载地址这个地址是app的起始地址
bootloader ota,单片机,stm32,嵌入式硬件
bootloader ota,单片机,stm32,嵌入式硬件
下载测试后发现可以正常跳转到app程序就OK了
bootloader ota,单片机,stm32,嵌入式硬件

  1. 配置驱动
    接下来实现OTA功能
    点击CubeMX Settings,添加以太网外设(根据自己实际引脚配置)
    bootloader ota,单片机,stm32,嵌入式硬件
    点击RT-Thread Settings添加ota_download、agile_console、agile_telnet、lwip组件
    lwip组件下设置为静态ipv4

设置如下:
ota_download
bootloader ota,单片机,stm32,嵌入式硬件

Lwip
bootloader ota,单片机,stm32,嵌入式硬件agile_telnet
bootloader ota,单片机,stm32,嵌入式硬件agile_console
bootloader ota,单片机,stm32,嵌入式硬件

到这里就添加结束了,保存后在board.h文件下使能ETH并添加网卡型号

#define BSP_USING_ETH
#ifdef BSP_USING_ETH
#define PHY_USING_LAN8720A
/*#define PHY_USING_DM9161CEP*/
/*#define PHY_USING_DP83848C*/
#endif

编译后会出现一个报错,将这个报错注释掉
bootloader ota,单片机,stm32,嵌入式硬件3.修改main.c函数
这里添加app的偏移地址,让中断向量表跳转及定义phy复位函数

#include <rtthread.h>
#include "fal.h"
#include <drivers/pin.h>
#include <board.h>



#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define RT_APP_PART_ADDR                0x08020000


#define PHY_RESET_IO GET_PIN(A, 0)



void phy_reset(void)
{
    rt_pin_mode(PHY_RESET_IO, PIN_MODE_OUTPUT);
    rt_pin_write(PHY_RESET_IO, PIN_HIGH);
    rt_thread_mdelay(50);
    rt_pin_write(PHY_RESET_IO, PIN_LOW);
    rt_thread_mdelay(50);
    rt_pin_write(PHY_RESET_IO, PIN_HIGH);
}


int main(void)
{
    int count = 1;

     fal_init();
    LOG_D("Hello RT-Thread!v1.0");
    while (count++)
    {
        LOG_D("Hello RT-Thread!v1.0");
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}


static int ota_app_vtor_reconfig(void)
{
    #define NVIC_VTOR_MASK   0xFFFFFF80
    /* 根据应用设置向量表 */
    SCB->VTOR = RT_APP_PART_ADDR & NVIC_VTOR_MASK;

    return 0;
}
INIT_BOARD_EXPORT(ota_app_vtor_reconfig);

烧入打印如下
bootloader ota,单片机,stm32,嵌入式硬件
4. 验证OTA功能
使用xshell和mywebServer
xshell配置如下IP地址是设备ip
bootloader ota,单片机,stm32,嵌入式硬件
点击连接后会连接上同时打印信息,用法和串口一样
bootloader ota,单片机,stm32,嵌入式硬件修改main.c函数主要是为了验证 OTA不要下载进去。
bootloader ota,单片机,stm32,嵌入式硬件将编译好的bin文件打包好,打包软件和打包方式在下图:
bootloader ota,单片机,stm32,嵌入式硬件压缩算法要与bootloader的压缩方式一样,固件分区名要与fal分区相同,我要下载到app里,如果填写错误会导致QBoot搬运失败。
bootloader ota,单片机,stm32,嵌入式硬件

打开mywebserver,设置如下
服务目录是刚才打包好的的目录,IP地址是本机IP地址,要注意设备与本机IP在同一网段,端口号默认即可
bootloader ota,单片机,stm32,嵌入式硬件

在xshell中输入http_ota http://192.168.1.112:80/rtthread.rbl
这样mywebserver就侦听到了请求,然后将文件传输到指定分区。
如下看效果。
bootloader ota,单片机,stm32,嵌入式硬件

bootloader ota,单片机,stm32,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-700402.html

到了这里,关于【RT-Thread】使用RT-Thread Studio 配置BootLoader及App实现OTA功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RT-Thread Studio使用经验——项目创建及文件介绍

    1.创建项目时会有两种选择 RT Thread项目 和 RT Thread Nano项目 ,RT Thread项目体量比较大,包含了RT Thread的大部分功能,比如应用层开发,驱动开发,图形界面开发等,生成程序的大小大约在50kb左右; RT Thread Nano属于轻量级的RT Pthread工程开发,只包含了基础的裸机开发的部分库文

    2024年02月08日
    浏览(42)
  • RT-Thread 7. RT-Thread Studio ENV修改MCU型号

    1. 修改MCU型号 2.在ENV界面输入 3. dist下为更新后完整源代码 4.导入RT-Thread Studio 发现GD32F330已经生效了。 5. 自己编写startup_gd32f3x0.S,准确性待验证

    2024年02月06日
    浏览(48)
  • 使用rt-thread Studio下载固件时出现Unable to enter Isp mode

    根据 我发现我缺了图中的文件夹  解决方法: 在rt-thread studio的sdk管理包中下载  

    2024年02月16日
    浏览(45)
  • RT-Thread Studio学习(十四)ADC

    本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用ADC设备。硬件及开发环境如下: OS WIN10 STM32F407VET6 STM32CubeMX v6.10.0 STM32Cube MCU Package for STM32F4 Series v1.28.0 RT-Thread Studio v2.2.7 RT-Thread Source Code v5.0.2 STM32F4 chip support packages v0.2.3 打开RT-Thread Studio软件新建基于芯片的项

    2024年01月19日
    浏览(44)
  • RT-Thread使用PWM实现灯亮度调节——STM32F407

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 RT-Thread使用PWM实现灯亮度调节——STM32F407ZG 作为新入门的嵌入式选手,最近在学习RT-Thread操作系统,鉴于自己健忘的记性,打算记录下来后面好回顾学习。 今天要总结的是RT-Thread使用PWM实现灯亮度调节

    2024年02月15日
    浏览(47)
  • RT-Thread学习(一)简介及基础环境配置

    之前学习了FreeRTOS,但是一直想深入学习,但是没有人指导,又不知道该如何学习,于是再学习一个操作系统看看情况。 RT-Thread是一个物联网操作系统,几乎支持所有主流的MCU和Wi-Fi芯片,实时多线程操作系统,主要用在32位的MCU上面。物联网(Internet Of Things,IoT),RT-Threa

    2024年01月17日
    浏览(38)
  • RT-Thread入门笔记2-动态内存堆的使用

    栈(stack): 由编译器自动分配释放 堆(heap) : 一般由程序员分配和释放 PS:一个ARM程序包含3部分:RO,RW和ZI RO是程序中的指令和常量 RW是程序中的已初始化变量 ZI是程序中的未初始化的变量 void *rt_malloc(rt_size_t nbytes):rt_malloc函数会从系统堆空间中找到合适大小的内存块.

    2024年02月02日
    浏览(33)
  • RT-Thread 1. GD32移植RT-Thread Nano

    1. RT-Thread Nano 下载 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实

    2024年02月05日
    浏览(48)
  • 保姆级AT32F437 配置RT-Thread 以太网(UDP/TCP Server)

    好记性不如烂笔头,既然不够聪明,就乖乖的做笔记,温故而知新。 本文档用于本人对知识点的梳理和记录。 雅特力 AT32F437 配置RT-Thread 以太网(UDP/TCP Server) 目录         一、前言         二、ENV配置         三、结语   一、前言 ENV版本:v1.3.5 rt-thread版本:V5+

    2024年02月12日
    浏览(39)
  • 雅特力 AT32F437 配置RT-Thread 以太网(UDP/TCP Server)

    好记性不如烂笔头,既然不够聪明,就乖乖的做笔记,温故而知新。 本文档用于本人对知识点的梳理和记录。 雅特力 AT32F437 配置RT-Thread 以太网(UDP/TCP Server) 目录         一、前言         二、ENV配置         三、结语   一、前言 ENV版本:v1.3.5 rt-thread版本:V5+

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包