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

news2024/10/6 6:50:52

注解目录

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蓝牙串口助手传输固件文件的界面

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【开源】基于Vue.js的快递管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快递区域模块2.4 快递货架模块2.5 快递档案模块 三、界面展示3.1 登录注册3.2 快递类型3.3 快递区域3.4 快递货架3.5 快递档案3.6 系统基础模块 四、免责说明 一、摘要 1.1 项目介绍 …

ARMday06(总线、串口、RCC章节分析)

总线 总线是完成各个部件之间传输的一种媒介 串行/并行总线 串行总线, 在同一时刻,根据时钟线的变化,只可以收发一位数据 优点:占用引脚资源少 缺点:传输速度比较慢 并行总线, 在同一时刻&#xff…

软件工程分析报告05体系结构说明书——基于Paddle的肝脏CT影像分割

基于Paddle的肝脏CT影像分割系统的体系结构说明书 目录 HIPO图 H图 Ipo图 软件结构图 面向数据流的体系结构设计图 程序流程图 S图 用PDL语言描述的伪代码 HIPO图 H图 Ipo图 软件结构图 面向数据流的体系结构设计图 程序流程图 S图 PAD图 用PDL语言描述的伪代码 (1)…

ubuntu20.04.6安装Intel AX211网卡驱动

前言 环境: ThinkBook16 2023 款网卡Intel AX211 Wi-Fi6ubuntu版本20.04.6(最后一位小数很重要)系统内核 Linux wzy 5.15.0-67-generic #74~20.04.1-Ubuntu SMP Wed Feb 22 14:52:34 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 方法&#x…

【数据结构】树与二叉树(十五):二叉树的基础操作:查找结点(算法Find)

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

AVL树的插入和删除

一.AVL树的四种旋转方式 以上是AVL树插入和删除时需要用到的四种旋转方式。为什么要旋转?因为树不平衡了,通过旋转使其再次平衡。 但是上面的四副图在旋转前就是平衡的,所以这样的旋转是没有意义的,重点在于理解旋转的方法。下面的插入和删除…

修改Openwrt软路由的web端口

如何修改openwrt路由器的web访问端口号? 在OpenWrt路由器上,如何修改Web访问端口号,通常涉及到修改HTTP服务器的配置文件。默认情况下,OpenWrt使用的HTTP服务器是uHTTPd。 以下是修改Web访问端口号的步骤: 一、通过…

【LeetCode刷题-双指针】--80.删除有序数组中的重复项II

80.删除有序数组中的重复项II 方法:双指针 因为给定数组是有序的,所以相同元素必然连续,使用双指针解决,遍历数组检查每一个元素是否应该被保留,如果应该保留,就将其移动到指定位置。我们定义两个指针slow…

【LeetCode刷题-滑动窗口】-- 643.子数组最大平均数I

643.子数组最大平均数I 方法&#xff1a;滑动窗口 class Solution {public double findMaxAverage(int[] nums, int k) {int n nums.length;int winSum 0;//先求出第一个窗口的和for(int i 0;i<k;i){winSum nums[i];}//通过遍历求出除了第一窗口的和int res winSum;fo…

ChatGPT只算L1阶段,谷歌提出AGI完整路线图

按照谷歌这个标准来看&#xff0c;大多数已有AI产品其实都分别进入了不同的AGI阶段&#xff0c;但只仅限于在技能水平上——要谈及通用性&#xff0c;目前只有ChatGPT等模型完全合格。 AGI应该如何发展、最终呈什么样子&#xff1f; 现在&#xff0c;业内第一个标准率先发布&a…

【Linux网络】ssh服务与配置,实现安全的密钥对免密登录

目录 一、SSH基础 1、什么是ssh服务器 2、对比一下ssh协议与telnet协议 3、常见的底层为ssh协议的软件&#xff1a; 4、拓展 二、SSH软件学习 1、ssh服务软件学习 2、sshd公钥传输的原理&#xff1a; 3、ssh命令学习&#xff1a; 4、学习解读sshd服务配置文件&#x…

spring cloud-注册中心(Eureka)

一、服务注册中心组件(*) 定义&#xff1a;服务注册中心就是在整个微服务架构单独抽取一个服务&#xff0c;该服务不做项目中任何业务功能&#xff0c;仅用来在微服务中记录微服务、对微服务进行健康状态检查&#xff0c;及服务元数据信息存储常用的注册中心&#xff1a;eurek…

【JAVA学习笔记】70 - 反射

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter23/src 反射 一、反射的引出 package com.yinhai.reflection.question;import com.yinhai.Cat;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IO…

双点重发布+路由策略实验

一、双点重发布实验 1、实验拓扑图 2、各路由器IP地址、环回地址配置 R1 R2 R3 R4 3、启动RIP和OSPF 4、双向重发布 5、查看路由信息 6、更改网络类型 6、抓取流量 二、路由策略实验 1、实验拓扑图 2、各路由器IP地址的配置 3、启动RIP和OSPF 3、重发布 4、抓取流量 5、创建…

【算法练习Day48】回文子串最长回文子序列

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 回文子串最长回文子序列总结…

C#几种截取字符串的方法

在C#编程中&#xff0c;经常需要对字符串进行截取操作&#xff0c;即从一个长字符串中获取所需的部分信息。本文将介绍几种常用的C#字符串截取方法&#xff0c;并提供相应的示例代码。 目录 1. 使用Substring方法2. 使用Split方法3. 使用Substring和IndexOf方法4. 使用Regex类…

Zabbix 5.0部署(centos7+server+MySQL+Apache)

环境 系统IPZABBIX版本主机名centos7192.168.231.2195.0zabbix-server 安装zabbix 我选择版本是zabbix-5.0 zabbix的官网是Zabbix :: The Enterprise-Class Open Source Network Monitoring Solution 安装Zabbix软件源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/…

关于Flume-Kafka-Flume的模式进行数据采集操作

测试是否连接成功&#xff1a; 在主节点flume目录下输入命令: bin/flume-ng agent -n a1 -c conf/ -f job/file_to_kafka.conf -Dflume.root.loggerinfo,console # 这个file_to_kafka.conf文件就是我们的配置文件 然后在另一台节点输入命令进行消费数据&#xff1a; kafka-cons…

Java Stream 的使用

Java Stream 的使用 开始中间操作forEach 遍历map 映射flatMap 平铺filter 过滤limit 限制sorted 排序distinct 去重 结束操作collect 收集toList、toSet 和 toMapCollectors.groupingByCollectors.collectingAndThen metch 匹配find 查询findFirst 与 findAny 的使用Optional …