【RT-Thread】STM32F1片内Flash实现Bootloader

2023-05-16

目录

  • 前言
  • 1. 开发环境搭建
  • 2. Bootloader制作
  • 3. APP程序制作
  • 4. OTA固件打包
  • 5. Ymodem升级
  • 小结


前言

RT-Thread官网对于Bootloader的实现方案有非常详细的描述,目前支持F1、F4、L4系列单片机。教程中bootloader制作是基于stm32f407为硬件平台,且app制作是基于标准版rt-thread-v4.1.0的stm32f407-atk-explorer例程,app开发环境使用MDK5。本文基于stm32f1精英开发板为硬件平台,使用RT-Thread Studio开发环境进行app制作,实现bootloader功能。

官方教程:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/system/rtboot/an0028-rtboot


1. 开发环境搭建

  • 硬件平台:STM32F103ZET6(精英板)
  • 软件版本:rt-thread-v4.1.0
  • 开发环境:RT-Thread Studio
  • 串口工具:Xshell 7、友善串口助手
  • 烧录工具:J-Link、J-Flash V6.86

2. Bootloader制作

1)硬件配置

STM32F103ZET6芯片的片内Flash即ROM大小为512K,RAM大小为64K。从起始地址的前64K(0x10000)用于bootloader,因此app的偏移地址为0x10000。通常定义app区和download区的大小一样,此处定义为128K。片内Flash剩余的192K未作定义,例如还可以根据需求定义factory(出厂固件区)、easyflash(数据库区)等。

在这里插入图片描述
2)加密压缩

加密压缩算法是可选项,用户可自行选择,但必须保持与后续OTA固件打包时候的选择完全一致。

在这里插入图片描述

3)logo配置

原本想制作一个好看点的logo,但是按官方给的在线生成方式,复制粘贴的logo图标提示字符不合法,最后只能输入数字和字母。

在线生成logo:http://patorjk.com/software/taag/#p=display&f=3D%20Diagonal&t=Zero%20Boot

在这里插入图片描述

4)生成bootloader

以上配置完成后,生成并自动下载得到一个压缩包文件:rt-boot.zip,解压得到rtboot_f1.bin即为bootloader文件。

5)烧录bootloader

使用J-Flash打开rtboot_f1.bin文件,起始地址设置为:0x08000000。执行Target->Promgram & Verify后,Start Application即可运行bootoader程序。为了方便查看上电过程日志,需要先将串口连接,波特率115200。

在调试过程中发现如果使用开发板的miniUSB线连接XShell7或SecureCRT9.1工具时,无法正常复位芯片且无法连接串口,原因暂未找出。

在这里插入图片描述
这里使用友善串口助手观察bootloader日志输出,复位后输出信息与bootloadr配置过程一致,说明bootloader制作成功。


3. APP程序制作

1)新建工程

在标准版rt-thread-v4.1.0的bsp中有stm32f103-atk-warshipv3例程,因此可以通过Env工具的menuconfig进行app的制作,使用RT-Thread Studio新建一个基于ATK-WARSHIPV3开发板的工程。

在这里插入图片描述

提示:官方例程使用的stm32f103-atk-warshipv3对应战舰开发板,它与精英板的单片机型号都是STM32F103ZET6,只是外设资源有差异,不影响本次测试。

2)FLASH配置

本次使用片内Flash存储,需要在硬件配置中开启: Enable on-chip FLASH
在这里插入图片描述

3)OTA配置

ota_downloader软件包在软件包->IoT-物联网分类中,可以直接通过搜索快速定位。

在这里插入图片描述

4)FAL配置

FAL配置在软件包->系统包中,开启FAL:Flash抽象层实现,管理 Flash设备和分区。在fal_cfg.h上定义分区表是app制作的关键内容,将在下文详细介绍。

在这里插入图片描述

5)添加fal_cfg.h

上述配置完成后,需要用户手动完成对FAL分区的定义,即在工程目录packages/fal-v1.0.0/inc文件夹下新建fal_cfg.h头文件,也可以从官方例程得到模板文件。关键内容为:

  1. 定义app起始地址;
  2. 声明片内flash;
  3. 定义FLASH设备表;
  4. 定义FAL抽象层分区表。

添加以下源代码:fal_cfg.h

/*
 * Date           Author       zlp
 * 2022-11-6      SummerGift   first version
 */
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

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

/* 1.定义app起始地址 */
#define RT_APP_PART_ADDR    0x08010000

/* 2.声明片内FLASH */
extern const struct fal_flash_dev stm32_onchip_flash;

/* ====================== Flash Configuration ========================== */
/* 3.定义FLASH设备表 */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash,                                         \
}

/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG

/* 4.定义FAL抽象层分区表 */
#define FAL_PART_TABLE                                                                                                     \
{                                                                                                                          \
    {FAL_PART_MAGIC_WROD, "bootloader", "onchip_flash",          0,      64 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD, "app",        "onchip_flash",    0x10000,     128 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD, "download",   "onchip_flash",    0x30000,     128 * 1024, 0}, \
}
#endif 

#endif /* _FAL_CFG_H_ */

6)修改main.c

在主程序中需要添加以下内容:

  1. 包含fal.h头文件,调用fal_init();
  2. 定义并打印输出版本信息;
  3. 中断向量重映射;

添加以下源代码:main.c

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-11-06     obito0   first version
 */

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

#include "fal.h"

/* defined the LED0 pin: PB5 */
#define LED0_PIN    GET_PIN(B, 5)
/* defined the LED1 pin: PE5 */
#define LED1_PIN    GET_PIN(E, 5)

int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

    fal_init();

    rt_kprintf("APP firmware version: %s", "V1.0.0");

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(100);
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(200);
    }
}

/* 中断向量重映射 */
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);

7)修改链接脚本

在board/linker_scripts目录下有三个链接脚本文件,分别对应于三种不同开发环境:link.icf(IAR)、link.lds(RT-Thread Studio)、link.sct(MDK5)。在此打开link.lds链接脚本编辑器,修改可用存储区域中的ROM起始地址和大小,对应于配置bootloader时设置的app起始地址和大小。

在这里插入图片描述

以上完成app的制作,编译输出rtthread.bin文件。

8)烧录app

直接在RT-Thread Studio执行下载程序,正常现象是下载完成后芯片自动复位,先执行bootloader程序,在启动程序中检测到app程序,自动跳转到app程序。

在这里插入图片描述
以上过程验证了bootloader和app的功能,接下来需要通过Ymodem实现从PC端通过串口下载升级程序。


4. OTA固件打包

在进行YModem下载程序之前需要先对app应用程序固件进行打包,此前已经烧录的app版本为V1.0.0,为了更直观的验证升级结果,对V1.0.0版本的app程序做以下修改:

修改内容:
1)修改版本号为V2.0.0;
2)修改led指示灯显示效果;
3)增加FAL的factory分区;

编译输出rtthread.bin文件,通过rt_ota_packaging_tool.exe工具进行打包,输出rtthread.rbl即为YModem可传输的文件。

注:压缩和加密算法必须与制作bootloader时的选择保持一致!

在这里插入图片描述

OTA固件打包工具:https://github.com/RT-Thread-packages/ota_downloader


5. Ymodem升级

YModem协议是由XModem协议演变而来的一种非常高效的文件传输协议,XShell、SecureCRT等工具均支持YModem协议传输。所以此时将串口工具切换为XShell 7,连接成功后按回车键确认msh命令正常,并按tab或输入help查看msh命令中是否有ymodem_ota。

注:如果msh命令中列表中没有ymodem_ota命令,说明在app制作过程中,没有配置ymodem_ota软件包,需要返回到app程序V1.0.0的制作过程。

输入ymodem_ota命令后,终端输出提示信息选择需要传输的文件,并输出“C”字符等待。右键依次选择:传输->Ymodem->用Ymodem发送,通过文件对话框选中上述打包好的rtthread.rbl文件,以下为传输完成后的界面:

说明:此界面未实现正常的自动重启,正常情况下传输完成后应自动重启,与上述烧录bootloader时的复位失败为同一问题!

在这里插入图片描述

由于在XShell7终端连接时自动复位失败,无法查看确认下载成功与否。此时关闭XShell7终端,将串口连接工具切回友善调试助手,连接之后通过手动复位查看bootloader启动时是否将downloader区的V2.0.0程序搬运到app运行区,并跳转到app区执行V2.0.0程序。

手动复位后的结果如下:

在这里插入图片描述
在这里插入图片描述
在bootloader程序中主要执行以下过程:

  1. 校验downloader区;
  2. 擦除app区;
  3. 写入app区;
  4. 校验app区;
  5. 跳转到app区;

最终实现app程序V2.0.0的升级。


小结

本文基本实现STM32F1的Bootloader功能,并通过Ymodem进行程序升级,但这只是从PC端到设备升级,过程中也还存一些小问题,并不算真正意义上的OTA远程升级。当然通过串口通讯也可方便的扩展到其它无线通讯模块实现OTA功能。此外,RT-Thread官方给出的这个Bootloader升级方案确实极大的简化了OTA开发过程,提高了开发效率。但由于生成的Bootloader文件是一个bin固件包,对于想深入了解Bootloader程序内部实现逻辑的开发者来说,如果给用户开放出Bootloader的源码,似乎更符合RT-Thread的开源特色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【RT-Thread】STM32F1片内Flash实现Bootloader 的相关文章

  • FileReference.save() AS3 上锁定文件类型的替代方案

    Update 正如下面 Jacob 的回复中所讨论的 限制或纠正 FileReference save 的行为是不可能的 谁能建议一个替代方案 服务器是 Apache PHP 它符合我在这篇文章中的所有标准 并避免我与 Jacob 讨论的陷
  • 用于嵌入 flashplayer 的 swfobject 的替代方案

    有谁知道 swfobject 是否有更好的替代品 我实际上很喜欢 swfobject 我只是想听听是否有人找到更好的东西 或者也许这是最好的方法 如果您不知道 swfobject 您可以在这里找到它 http code google com
  • 将变量从 flash 传递到 HTML/php

    我希望也许有人可以对我很难决定如何解决的问题提供一些见解 我有一个相当简单的 Flash 应用程序 用户可以在连接时快速创建一个用户名 并且该用户名是在 Flash swf 内创建的 现在 我有一个 cron 作业 每十分钟删除一次不活动的
  • Shape、Sprite、MovieClip 和其他显示对象:何时使用?

    有大量的显示对象flash display包裹 我不清楚在什么情况下应该使用Shape Sprite or MovieClip 使用它们各自的优点和缺点是什么 先感谢您 Shape http help adobe com en US Fla
  • 为什么 ActionScript 中没有记录 drawRoundRectComplex() ?

    在研究actionscript 3的图形类时 我遇到了未记录的drawRoundRectComplex 方法 它是一个变种drawRoundRect 但有 8 个参数 最后四个是每个角的直径 x y 宽度 高度 左上 右上 左下 右下 ex
  • ReferenceError:错误#1065:变量 JSON 未定义

    我快要爆炸了 想弄清楚如何解决这个问题 所以在我这样做之前 也许你可以帮助我 我正在 flash builder 4 5 1 21328 中的 flash Player 11 下开发一个游戏 我想尝试一下新功能 例如本机 JSON 支持 但
  • Flash 点击时不打开链接

    我用 Flash 创建了这个横幅 我需要单击它来打开一个网页 我使用了这个 Actionscript 3 0 代码 link btn addEventListener MouseEvent CLICK openurl function op
  • 如何调整外部 SWF 的大小以适合容器?

    我想要完成的是调整外部 SWF 的大小 使其适合在舞台上作为容器呈现的显示对象 现在它显示在容器外部 重要提示 我不希望外部 SWF 占据整个舞台 我在舞台上为它准备了一个特殊的地方 那个容器 public function loaderC
  • HTTPS 上的 SWFUpload 无法正常工作

    当目标 servlet 侦听 HTTPS 时 我在使用 SWFUpload 上传文件时遇到问题 在 HTTP 上它工作得很好 仅当使用 FireFox 或 Opera 时才会出现此问题 在 IE 上它工作正常 没有尝试过其他浏览器 EDIT
  • 在android中加载swf文件时出现问题

    当我在 Android 模拟器中加载交互式 SWF 文件时遇到问题 我使用2 3 1 AVD 这是代码 package com androidpeople view import android app Activity import an
  • 如何在 AS3 中设置 swf 的宽度和高度?

    如何在 AS3 中设置 swf 的宽度和高度 到目前为止 这是我的代码 package import flash display Sprite public class Game extends Sprite 现在 加载时它处于任意默认大小
  • 需要澄清应用程序域

    我需要对这个主题进行一些澄清 因为我刚刚遇到将 swf 加载到重用加载器对象中的问题 假设我有 3 个 SWF 主文件 swfchildA swfchildB swf Main swf 中有一个可重用的加载程序对象 myloader loa
  • 将数据/变量从 Visual Basic 表单传递到 Flash 对象

    我很确定这个问题可以在 stackOverflow 上的某个地方得到解答 但我对此没有选择 我有一个 VisualBasic 窗体 上面有一个按钮对象 我希望该按钮有一个 onClick 过程 以便单击它可以将变量或其他命令传递到另一个正在
  • AS3 是否可以复制 Shape 对象?

    我正在尝试制作一个可用于复制的形状 这是我所做的 我正在尝试做的以及我陷入困境的解释 在 Flash IDE 画笔 中手动绘制形状 创建了一个包含形状的新影片剪辑 作为一个类导出 实例化该类 var mc MovieClip new sha
  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • 将引导加载程序存储在软盘映像上的哪里?

    我将编写并测试引导加载程序 为了做到这一点 我计划将引导加载程序复制到软盘映像文件上并将其安装在虚拟机中 但是 我不确定将引导加载程序的机器代码放在哪里 它是否只是转储到文件的前几个字节中 软盘的引导扇区是第一个扇区 如果您谈论的是原始软盘
  • 更改 AS3 中的 TextField 选择颜色

    如何更改 ActionScript 3 中 TextField 的选择 突出显示 颜色 我有一个输入文本字段 黑色背景上有白色文本 因此 选择是不可见的 这对于可用性来说非常糟糕 谢谢 另一种方法是使用文本布局框架 特别是使用 Select
  • 更改由 AS3 添加到舞台的影片剪辑中的动态文本字段不起作用?

    当我更改动态文本字段的文本值时 文本字段只是变为空白 而不显示新值 我有一个名为 game board 的 MovieClip 由 AS3 动态添加到舞台上 舞台一开始是空白的 我有另一个名为 stage 2 的 MovieClip 它作为
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • 使用jquery调用AS3外部接口

    我正在使用ExternalInterface 调用嵌入在html 页面中的Flash 应用程序 以下代码工作正常 我正在使用按钮进行测试 document ready function button click function var a

随机推荐

  • FreeRTOS系列|二值信号量

    二值信号量 1 信号量简介 信号量一般用来进行资源管理和任务同步 xff0c FreeRTOS中信号量又分为二值信号量 计数型信号量 互斥信号量和递归互斥信号量
  • ubuntu ifconfig命令无效解决方案

    1 更新或升级系统 sudo apt get update 2 安装ipconfig的工具 sudo apt install net tools 3 查看ip ifconfig
  • 树莓派4b镜像烧录以及如何无显示屏远程登陆操作

    1 树莓派的烧录 xff1a 树莓派的烧录我用了很长的时间 xff0c 重新烧录的很多次 xff0c 都是因为没办法打开ssh xff0c 所以没办法进入树莓派调试 因为我使用树莓派主要是用来部署yolov5进行识别物体的 xff0c 所以
  • MyBatis入门——动态SQL

    前言 在我们日常工作中 xff0c 使用MyBatis除了做一般的数据查询之外 xff0c 还有很多业务场景下需要我们针对不同条件从数据库中获取到满足指定条件的数据 xff0c 这时候我们应该如何来做呢 xff1f 针对每种条件封装一个方法
  • Docker搭建本地私有仓库

    和Mavan的管理一样 xff0c Dockers不仅提供了一个中央仓库 xff0c 同时也允许我们使用registry搭建本地私有仓库 使用私有仓库有许多优点 xff1a 一 节省网络带宽 xff0c 针对于每个镜像不用每个人都去中央仓库
  • 斐波那契数列 Java实现

    关于斐波那契数列在百度百科上的定义如下 xff1a 斐波那契数列 xff0c 又称黄金分割数列 xff0c 指的是这样一个数列 xff1a 0 1 1 2 3 5 8 13 21 34 在数学上 xff0c 斐波纳契数列以如下被以递归的方法
  • Maven+Jetty运行项目无法热修改html处理

    一直以来都在做后端工程的开发 xff0c 很少做前端设计 xff0c 最近工作需要开始做前端开发 xff0c 感觉 辛辛苦苦几十年 xff0c 一朝回到解放前 的节奏啊 xff0c 遇到不少问题 xff0c 记录下来以备后查 今天在使用Ma
  • Spring4.3.0 Junit4.11 initializationError(org.junit.runner.manipulation.Filter)

    Spring4 3 0 Junit4 11 initializationError org junit runner manipulation Filter 昨天手欠 xff0c 在项目中把Spring3 2 14版本升级到4 3 0版本
  • zookeeper入门(一)——ZooKeeper伪集群安装

    zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装 在进行本篇文章之前 xff0c 先请大家了解一下zookeeper xff08 后面的文章为了省事有可能直接使用zk缩写来替代 xff09 xff0c 关于z
  • zookeeper入门(二)——zk客户端脚本使用

    zookeeper入门 xff08 二 xff09 zk客户端脚本使用 在上一篇文章zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装我们讲了在单机进行zk伪集群安装 xff0c 本篇文章我们来讲一下zk提供的
  • 事务基础知识

    数据库事务 数据库事务定义 xff0c 满足4个特性 xff1a 原子性 xff08 Atomic xff09 一致性 xff08 Consistency xff09 隔离性 xff08 Isolation xff09 和持久性 xff08
  • MySQL事务隔离级别

    1 MySQL所支持的事务隔离级别 MySQL所支持的事务隔离级别 xff1a READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 其中 REPEATABLE READ是
  • Thrift第一个示例

    第一步 xff1a 引入thrift依赖包 compile span class hljs keyword group span span class hljs string 39 org apache thrift 39 span nam
  • FreeRTOS系列|计数信号量

    计数信号量 1 计数信号量简介 计数型信号量有以下两种典型用法 事件计数 xff1a 每次事件发生 xff0c 事件处理函数将释放信号量 xff08 信号量计数值加1 xff09 xff0c 其他处理任务会获取信号量 xff08 信号量计数
  • Redis学习——01.redis安装

    下载 tar xzvf redis span class hljs number 3 2 span span class hljs number 10 span span class hljs preprocessor tar span s
  • IDEA常用设置

    显示主题 建议使用Darcula Appearance gt Theme 编辑器字体 建议使用Courier New或者Consolas Editor gt Font gt Font 打开自动编译 Compiler gt Build pro
  • Windows下执行Linux命令

    常用的工具 Cygwin xff08 http www cygwin com xff09 Cygwin是一个在windows平台上运行的类UNIX模拟环境 xff0c 详细参见百度百科 xff1a https baike baidu com
  • Linux网络编程 - 多线程服务器端的实现(1)

    引言 本来 xff0c 线程在 Windows 中的应用比在 Linux 平台中的应用更广泛 但 Web 服务的发展迫使 UNIX 系列的操作系统开始重视线程 由于 Web 服务器端协议本身具有的特点 xff0c 经常需要同时向多个客户端提
  • 访问带有用户名、密码保护的 URL

    一 URL xff0c 统一资源定位器 指向互联网上的 资源 xff0c 可协议名 主机 端口和资源组成 如 http username password 64 host 8080 directory file query ref Comp
  • 【RT-Thread】STM32F1片内Flash实现Bootloader

    目录 前言1 开发环境搭建2 Bootloader制作3 APP程序制作4 OTA固件打包5 Ymodem升级小结 前言 RT Thread官网对于Bootloader的实现方案有非常详细的描述 xff0c 目前支持F1 F4 L4系列单片