振南技术干货集:深入浅出的Bootloader(4)

注解目录

1、烧录方式的更新迭代

1.1 古老的烧录方式

(怀旧一下,单片机高压烧录器。)

1.2 ISP 与ICP 烧录方式

(还记得当年我们玩过的 AT89S51?)

1.3 更方便的 ISP 烧录方式

1.3.1串口 ISP

(是 STC 单片机成就了我们,还是我们成就了 STC?)

1.3.2 各种 USB ISP

1)AVR

2) C8051F

3) MSP430

(在当前 STM32 一统天下的时代,上面这些单片机你还在用吗? )

2、关于 Bootloader

2.1 Bootloader 的基本形态

(Bootloader 先行,APP 在后。)

2.2 Bootloader 的两个设计实例

1)带 Shell 命行的口 BL

2)插 SD 卡即烧录的 BL

(上面这两种 BL 在实际应用中最常见,还讲了一下 Linux 的 Uboot。)

2.3 BL实现的要点

3、花百出的 BL

3.1 BL(串口传输)的现与延伸

(告诉你一个秘密: STM32F103C8T6 的后64K ROM 也能用,不信你试。)

3.2 10 米之内隔空烧录的实现

(一部安卓手机在手,空中升级调试全有。)

3.3 BL的分散烧录

(你以为 BL 只能给自己烧序? )

4、不走寻常路的BL

4.1 Bootpatcher

(反其道而行之,APP 先行,BL 在后。)

4.2 APP 反烧 BL

(你以为只能 BL 烧录 APP? )

花百出的 BL

上面我所讲的都是 BL 最基础的一些内容,是我们实现 BL 所必须了解的。BL 真正的亮点在于多种多样的固件数据获取方式。

3.1 BL 的实现与延伸(串口传输固件)

前面我讲到过两个 BL 应用的实例,一个是串口传输固件文件,一个是 SD 卡拷贝固件文件。它们是在实际工程中经常被用到的两种 BL 形式。这里着重对前一个实例的实现细节进行讲解剖析,因为它非常具有典型意义,如图7.23 所示。

这个流程图提出了 3 个问题:

(1) 串口通信协议是如何实现的?

(2) 为什么获取到上位机传来的固件数据,不是直接写入到 APP 区,而是先暂存,还要校验?

3) 对固件数据是如何实现校验的?

串口通信协议以及文件传输实现的相关内容略显繁杂,在本书《大话文件传输》一章中会专门进行讲解。

第二个问题:经过串口传输最终由单片机接收到的固件数据是可能出现差错的,而有错误的固件冒然直接写人到 APP 区,是一定运行不起来的。所以,我们要对数据各帧进行暂存,等全部传输完成后,对其进行整体校验,以保证固件数据的绝对正确。

针对第三个问题,我们要着重探讨一下。

一个文件从发送方传输到接收方,如何确定它是否存在错误?通常的做法在文件中加人校验码,接收方对数据按照相同的校验码计算方法计算得到校验码,将之与文件中的校验码进行对比,一致则说明传输无误,如图 7.24 所示。

图 7.24 是对固件文件的补齐以及追加校验码的示意。为什么要对文件补齐?嵌人式程序经过交叉编译生成的可烧录文件,比如 BIN,多数情况下都不是 128、256,512 或 1024 的整数倍。这就会导致在传输的时候,最后一帧数据的长度不足整帧.就会产生一个数据尾巴。取整补齐是解决数据尾巴最直接的方法。这一操作是在上位机上完成的,通常是编写一个小软件来实现。这个小软件同时会将校验码追加到固件文件未尾。这个校验码可以使用校验和(CheckSum)或者 CRC,一般是 16 位或 32 位,如图 7.25 所示。

图片

图 7.23 BL(串口传输固件)的实现流程图

又有人会问:“要把整个固件暂存下来,再作校验,那得需要额外的存储空间吧,外扩ROM(FlashROM或 EEPROM)?”是的。如果想节省成本,我们也可以不暂存,传输时直接烧号到 APP 区。这是有风险的,但是一般来说问题不大(STC 和 STM32 的口 ISP 其实也都是实时烧写,并不暂存)。因为在传输的过程中,传输协议对数据的正确性是有一定保障的,它会对每一帧数据进行校验,失败的话会有重传,连续失败可能会直接终止传输。所以说,一般只要传输能够完成,基本上数据正确性不会有问题。但是仍然建议对固件进行整体校验,在成本允许的情况下适当扩大 ROM 容量。同时,固件暂存还有一个另外的好处,在 APP 区中的固件受到损坏的时候,比如固件意外丢失或 IAP 时不小心擦除了 APP 区,此时我们还可以从暂存固件恢复回来(完备的 BL会包含固件恢复的功能)。

其实也不必非要外扩 ROM,如果固件体积比较小的话,我们可以把单片机的片上 ROM

图片

图 7.24 对固件文件进行补齐并追加校验码

图片

图 7.25 通过一个小软件实现对固件文件补齐和添加校验码

砍成两半来用,用后一半来作固件暂存。

如图 7.26 所示,我们将片上 ROM 划分为 3 部分,分别用于存储 BL、APP 固件以及暂存固件。比如我们使用 STM32F103RBT6,它一共有 128 KB 的 ROM,可以划分为 16 KB56 KB/56 KB。

有些产品对成本极为敏感。我就有过这样的开发经历,当时使用的单片机是STM32F103C8T6,片上 ROM 总容量为 64 KB,固件大小为 48 KB,BL 为12 KB。在通过 BL进行固件烧写时根本没有多余的 ROM 进行固件暂存。我使用了一招“狗尾续貂”,如图 7.27所示。

我无意中了解到 STM32F103C8T6 与 RBT6 的晶元是同一个。只是因为有些芯片后64 KB的 ROM性能不佳或有瑕疵,而被限制使用了。我实际测试了一下,确实如此。但是后64 KB ROM的使用是有前提的,也就是需要事先对其好坏进行验证。如果是好的,则暂存校

图片

图 7.26将片上 ROM 划分为 3 部分

图片

图 7.27STM32F103C8T6 后 64KB 也可用

验,再写入 APP 区;而如果是坏的,那么就直接在固件传输时实时写入 APP 区(这个办法我屡试不爽,还没有发现后 64KB 有坏的)。

以上振南所介绍的是一种“骚操作”,根本上还是有一定的风险的,ST 官方有声明过,对后 64K ROM 的质量不作保证,所以还是要慎用。

3.2 10米之内隔空烧录

这个“隔空烧录”源于我的一个 IoT 项目,它是对空调的外机进行工况监测。大家知道,空调外机的安装那可不是一般人能干的,它要不就在楼顶,要不就在悬窗上。这给硬件升级嵌人式程序带来很大的困难。所以,我实现了“隔空烧录”的功能,其实它就是串口 BL 应用的一个延伸,如图 7.28 所示。

图片

图 7.28通过蓝牙串口模块实现“隔空烧录

“隔空烧录确实牛,但是总要抱着一个电脑,这不太方便吧。”确实是!还记得前面我提过的 AVRUBD 通信协议吗(详见“大话文件传输”章)? 它的上位机软件是有手机版的。这样我们只要有手机,就能“隔空烧录”了,如图 7.29 所示。

“哪个 APP? 快告诉我名字”,别急,蓝牙串口助手安卓版,图 7.30 是正在传输固件的界面。

AVRUBD 其实是对 Xmodem 协议的改进,这个我们放在专门的章节进行详细讲解。

图片

手机连接蓝牙串口模块实现“手机隔空烧录”图 7.29

图片

图 7.30蓝牙串口助手传输固件文件的界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes介绍以及Kubernetes快速部署

Kubernetes介绍以及Kubernetes快速部署 文章目录 Kubernetes介绍以及Kubernetes快速部署1.Kubernetes介绍:1.1.Kubernetes简介1.2. Kubernetes应用部署方式演变1.3.Kubernetes功能1.4.Kubernetes工作原理1.5.工作流程1.6.优缺点 2.Kubernetes环境部署2.1.环境说明2.…

EMC-4641C运动控制器固件升级

EMC-4641C运动控制器固件升级 更新前查看运动控制器固件版本 点击打开ESMTPTest_X64R.exe程序 点击搜索,程序自动选择IP为192.168.0.135的运动控制器(实际操作时候可能会因为现场情况,IP会有细微不同) 点击Connest 等待几秒后在…

将Soildorks模型导入PreScan

首先将Soildworks模型导入到SketchUP中,导入方法如下: 在Soildworks中将模型另存为IFC 2x3 模型 在选项中将单位改成米 在SketchUP中文件选择导入 ifc 文件即可 然后在SketchUP中定义坐标轴 SketchUP中红色的轴为X,绿色的轴为Y,蓝…

一个车厢号码识别算法(2005年的老程序----ccc)

一个车厢号码识别算法(2005年的老程序----ccc) 2023-09-18 ccc 程序的识别效果 对图中的车厢号码部分用上下两条线限定分为,然后进行识别。 从上面的识别效果可以看出,识别算法具有一定的鲁棒性,能够适应车厢号码的各…

打印字符(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

开启学习新时代,电大搜题助您实现梦想!

亲爱的读者朋友们,当您拥有追求知识的渴望,秉持着对成功的执着追求时,浙江开放大学(广播电视大学)诞生了——它向您开启了一扇通向知识殿堂的大门。而今,我们荣幸地向您推荐一款既简便又高效的学习利器——…

JavaWeb——HTML常用标签

目录 1. 标题标签 2. 段落标签 3. 换行/分割线标签 4. 列表标签 4.1. 有序列表 4.2. 无序列表 5. 超链接标签 6. 多媒体标签 6.1. img 图片标签 6.2. audio 音频标签 6.3. video 视频标签 7. 表格标签(重点) 8. 表单标签(重点) 1. 标题标签 …

软件工程分析报告03需求规格说明书——基于Paddle的肝脏CT影像分割

需求规格说明书 一、 引言 本项目的背景是解决现有医疗影像处理的挑战,特别是针对CT扫描图像的肝脏和肝脏肿瘤分割。在传统医学影像分析中,手动或半自动分割方法常常耗费大量时间,且容易受主观因素影响,因此需要一种自动化的解决…

智慧城市项目建设介绍

1. 项目建设背景 随着城市化进程的加速,城市发展面临着诸多挑战,如环境污染、城镇综合管理、经济发展布局等。为了应对这些挑战,智慧城市应运而生,成为城市发展的重要方向。智慧城市通过运用信息技术和智能化技术,实…

Python入门教程:12个常用基础语法详解

文章目录 前言1.多个字符串组合为一个字符串2. 字符串拆分为子字符串列表3. 统计列表中元素的次数4.使用try-except-else-block模块5. 使用枚举函数得到key/value对6. 检查对象的内存使用情况7. 合并字典8. 计算执行一段代码所花费的时间9. 列表展开10. 列表采样11. 数字化12. …

酷柚易汛ERP- 组装单与拆卸单操作

1、功能介绍 组装单用来处理企业组装等加工业务,拆卸单用来处理企业拆卸等加工业务,支持一对多的产品加工业务。 2、主要操作 2.1 新增组装单 打开【仓库】-【组装单】新增组装单。 录入组合件与子件,单据审核后,系统根据存货…

[文件读取]lanproxy 文件读取 (CVE-2021-3019)

1.1漏洞描述 漏洞编号CVE-2021-3019漏洞类型文件读取漏洞等级⭐漏洞环境VULFOCUS攻击方式 描述: Lanproxy 路径遍历漏洞通过../绕过读取任意文件。该漏洞允许目录遍历读取/../conf/config.properties来获取到内部网连接的凭据。 1.2漏洞等级 高危 1.3影响版本 Lanproxy 1.4漏洞…

基于单片机的塑料厂房气体检测系统设计

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、设计的主要内容二、系统硬件设计三、软件设计实物 四、结论五、 文章目录 概要 本文首先分析了基于单片机的可燃…

c语言:解决谁是凶手的问题。

题目: 思路+代码: #define _CRT_SECURE_NO_WARNINGS //假设全部人说的话都为真,那结果就为4,现在已知三真一假,且说假话的人为凶手 // 现在将全部情况相加,满足三真一假的情况即为凶手。 #incl…

【动手学大模型】(通俗易懂 快速上手) Task1 大模型简介

1.发展历程 语言建模始于20世纪90年代,采用的是统计学习方法. 2003年,深度学习的思想融入到语言模型中,相较于上个时代,该方法可以更好地捕捉语言中的复杂关系. 2018年左右,Transformer架构的神经网络模型被引入,通过大量文本训练模型,使它对语言有了更深的理解. 最近,模型规模…

武汉凯迪正大—抗干扰介质损耗测试仪

产品概述 KD600A全自动变压器介质损耗测试仪是发电厂、变电站等现场全自动测量各种高压电力设备介损正切值及电容量的高精度仪器。由于采用了变频技术能保证在强电场干扰下准确测量。仪器采用中文菜单操作,微机自动完成全过程的测量。 该仪器同样适用于车间、试验…

开启学历新征程,电大搜题助您轻松获取知识

作为一名电大学者,有肩负着传递真实信息、宣传正面价值的使命,而今天我要向您介绍的是一款非常实用的学习工具——电大搜题微信公众号。通过该平台,您可以获得更多关于浙江开放大学和广播电视大学的学习资源,助您在学习和工作上取…

【milkv】0、duo编译环境搭建

一、开发资料整理 Docker https://hub.docker.com/repository/docker/dreamcmi/cv1800-docker/general GitHub https://github.com/milkv-duo/duo-buildroot-sdk CV181x/CV180x MMF SDK 开发文档汇总 https://developer.sophgo.com/thread/471.html cv181x芯片使用的交叉…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(下)

7.5 一种自动反射消息类型的Protobuf网络传输方案 本节假定读者了解Google Protocol Buffers是什么,这不是一篇Protobuf入门教程。本节的示例代码位于examples/protobuf/codec。 本节要解决的问题是:通信双方在编译时就共享proto文件(用于定…

产品的生命周期

** 没错,产品每次版本选代都是一次重生的机会,每次版本迭代都不亚于一次产品上线首发。 ** 一、产品上线首发 所谓万事开头难,产品上线首发的重要性不言而喻,产品给人的第一印象非常深刻,后期再去扭转非常困难&#…