gd32f103vbt6 串口OTA升级-4-从rk3399的串口升级1

news2025/1/7 18:36:32

一、需求:

因客户需求,觉得升级单片机程序需要打开设备的盖子,(抽出设备,拧螺丝,挺费事的)。

那能不能把单片机也做到linux系统下升级呢?

答案当然是可行的。(这里有个前提,单片机与rk3399的cpu肯定要有通信的通道,目前我这边有两块单片机,一块是使用了串口,一块使用了是iic,暂时没有其他通道调试)。

既然单片机能够通过串口升级,那把串口改到rk3399端,那肯定问题也不是很大。那就顺着这个思路开展活动。

二、展望

既然能够在rk3399的linux命令下升级,那完成服务器的远程升级也不是问题了,所以对于批量的单片机升级还是有一定的优势的。前提是在网络中。

这个也是我后面想做的一个事情。还在进行中。

三、对于从3399的升级,我的几点考虑

3.1 应该还是可以使用ymodem协议,现在随便都能找到ymodem的源码,所以这里可以省点力气。还是参考之前的串口升级功能吧。

3.2 尽量考虑升级失败的处理问题。

3.2.1 比如升级过程中中断

3.2.2 下载的文件不是对应的bin文件

3.2.3 下载的时候,数据错误。

3.2.4 相同版本是否需要升级?

3.2.5 升级失败后有什么补救办法?

四、根据上述几个问题,我把升级程序做了几个事情。

4.1 为了防止重复升级,增加了md5的检测工作

4.1.1 升级的时候需要跟单片机通信,让单片机发送回当前镜像的md5值,这个值保存在flash的一个位置上。md5与现在的文件的md5相同,则不继续升级,否则的话才可以继续升级。

4.1.2 同时,修改ymodem协议,ymodem第一帧会发送文件名和长度,在这个后面增加一段md5码的ascii形式,单片机收到文件名和长度后,继续解析md5值,并且与自身的md5值(保存在flash上了)进行比较,发现如果相同,则终止接收数据,结束升级。

4.2 为了防止升级过程中,保存了错误的数据。

4.2.1 下载的过程中,每一个数据帧进行crc16的校验,下载后,比对校验值,正常才进行写到flash中,否则丢弃,重新下载

4.2.2  下载完成后,全部的数据进行一次md5计算,与之前文件名后传进的md5值进行比较,一致才认为可以进行下一步升级。

4.2.3  升级过程分为下载和升级,flash分成两个区,一个是下载区,用于串口下载程序,另一个才是系统程序的运行区,这个地方跑单片机程序,所以下载的时候,首先擦除的区域是下载区,并且把数据下载到下载区,下载完后,在下载区进行数据md5计算,正确之后,才会把数据拷贝到实际单片机app运行的区域(见4.2.2)。

4.3 为了防止下载其他文件(非单片机程序文件),导致错误。

4.3.1 第一就是升级程序本身是要验证下载文件的开始的位置,前4个字节是栈空间,它的值应该是在0x2000,0000这个区间,第4-7这4个字节是程序运行的位置,进行判断是否是与app的运行位置有关,只有通过验证,才能证明该文件是一个正常的单片机程序,才能允许下载操作。

4.3.2 单片机本身也要进行这两个部分的识别工作,在下载接收到第一个数据帧的时候进行帧头的8个字节的判断,下载结束后,md5验证正常后,拷贝到app区间之前,仍然进行头这8个字节的验证工作,正常,才进行拷贝升级。

4.3.3 下载文件必须有一个对应的md5文件一起,开始下载的时候,读取下载文件,并且同步读取md5文件中的md5值,计算下载文件的md5值,与md5文件中的值进行比较,正常才能进行下一步下载。否则不进行下载。

4.3.4  下载文件和md5文件由命令自动完成,单片机编译结束后,自动运行该命令,完成md5文件的生成工作,该md5文件不能由下载文件简单计算得出。

4.4 其他的一些防错机制

4.4.1 在iap阶段,可以进入下载模式自动下载。

4.4.2 在iap阶段,等待上位机下载(数据)的时间会有一个超时时间,长时间没有数据,将超时,重新回到待下载的状态,随时进入下一次下载更新状态。

4.4.3 要尽量确保iap的稳定,健壮,这一段程序一般情况下不能升级。

五、代码,请移步github

 

后面将对代码中的一些部分挑出来进行一些分析,欢迎大家关注和批评指正。谢谢

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

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

相关文章

Shopee|Lazada电商平台api接口,接入获取商品评论|根据关键词取商品列表API说明示例

Shopee和Lazada是东南亚地区广受欢迎的电商平台。它们的模式非常类似,都是以C2C(消费者到消费者)、B2C(企业到消费者)和O2O(线上到线下)为主要销售模式。用户可以在平台上购买商品或者将自己的商…

如何在华为OD机试中获得满分?Java实现【组装新的数组】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

华为OD机试真题 Java 实现【查找重复代码】【2023Q1 100分】

一、题目描述 小明负责维护项目中的代码,需要查找出重复代码,用以支撑后续的代码优化,请你帮助小明找出重复的代码。 重复代码查找方法: 以字符串形式给定两行代码,找出两行代码中的最长公共子串。 如果不存在公共子串,返回空。 二、输入描述 输入两行代码。 三、…

深眸科技|机器视觉应用优势显著赋能生产,技术崛起获发展前景

近年来,机器视觉已经逐渐渗透进工业制造领域的各个方面,并已经成为工业自动化和智能化的核心,无论是“中国制造2025”还是“工业4.0”都离不开机器视觉,机器视觉将为智能制造打开一个新的世界。 随着人工智能、云计算、5G等技术的…

Android静态库/动态库相关知识

以下皆是在ubuntu下面执行 --------------------查看动态库/静态库是多少位的------------------------ 查看动态库.so文件 直接使用file查看,即 file xxx.so 例子如下: 这里的librtmp-arm.so是arm 64位的 查看静态库.a文件 objdump -a xxx.a 例子…

实训可视化项目小结 --- 开启Python初始之旅

Python初试感悟 语言之间是相通的,大多数时候,百分之八十的问题,都可以用常用的容器以及内置函数来辅助解决。之前从未认真接触过Python,但此次学校实训要求使用Python做一个可视化,东西不难,我个人负责爬…

Spring框架中有哪些不同类型的事件

Spring框架中有哪些不同类型的事件 Spring框架中有哪些不同类型的事件 Spring框架中有哪些不同类型的事件 Spring 提供了以下5种标准的事件: 上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口…

flask mysql Echart 实现数据库数据图表展示

实现步骤 第一步:准备数据库第二步:准备Echart第三步:绑定数据库信息和图表⚠️需要注意的几个地方 第一步:准备数据库 这部分内容查看我的上一篇内容: python flask p5.js mysql 实现数据库查询并网页显示数据 通过前…

Elasticsearch 8.8.0 发布

Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 基于 Java 开发,并在 SSPL Elastic License 双重授权许可下作为开源软件发布。 Elasticsearch 8…

Android通过TextToSpeech实现文字转语音

一、直接上代码: import android.app.Activity; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widge…

MyBatis操作数据库表和动态SQL的使用

目录 1.MyBatis开发环境的搭建和测试 2.MyBatis基本操作 2.0 准备工作 2.1 新增操作 2.2 删除、修改、查询操作 2.3 #{param} 和 ${param}的使用和区别 2.4 实体对象属性和数据库字段名称不同时如何映射? 3. MyBatis多表查询 3.0 准备工作 3.1 一对一的表…

ACL2022 | 大模型微调哪家好?小孩子才做选择,成年人当然是全都要

一、概述 title:UNIPELT: A Unified Framework for Parameter-Efficient Language Model Tuning 论文地址:https://arxiv.org/abs/2110.07577 代码:GitHub - morningmoni/UniPELT: Code for paper "UniPELT: A Unified Framework for…

Java程序设计入门教程--浮点类型

情形 在Java中,Java提供了两种浮点型数据,单精度float和双精度double。 格式 一般情况下实型常量以如下形式表示: 0.123, 1.23, 123.0 等等表示双精度数; 123.4f, 145.67F, 0.65431f 等等表示单精度数。 当表示的数字比较…

零代码平台如何助力企业数字化,零代码会把IT人员淘汰掉吗

据研究,国内企业超过 70% 以上的业务管理需求得不到 IT 排期。 由于爆发的业务需求无法被满足,企业的数字化转型过程中充满着危险的 IT 失能陷阱。 01 IT面临的信息化现状 业务管理需求爆发: 在经济增速下行趋势下,企业面临更…

【Java8新特性--->异步处理】CompletableFuture

一、引入 假设一个商品详情页需要以下操作: 查询展示商品的基本信息耗时:0.5s 查询展示商品的销售信息耗时:0.7s 查询展示商品的图片信息耗时:1s 查询展示商品销售属性耗时:0.3s 查询展示商品规格属性耗时&#xff1a…

JVM--解析运行期优化与JIT编译器

本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术~ 1 JIT编译器的引入 首先我们这篇文章中所说的编译器都是指JVM的组成部分之一---即时编译器(JIT)…

《三》Git 中的本地仓库

初始化本地 Git 仓库: 通过 git init 初始化,可以把当前目录变成了 Git 管理的本地仓库。目前仅仅是做了一个初始化仓库的操作,项目里的文件还没有被跟踪。 在当前目录下会出现一个名为 .git 的目录,这些文件是 Git 仓库的核心。…

每天一个面试题之==和equals的区别是什么?

==和equals的区别是什么? ""是一个关系运算符,关系运算符可以用来进行数据和数据之间的比较,而在java中数据类型大致可以分为两大类分别是基本数据类型和引用数据类型。 基本数据类型包含 byte&#xff0c…

React学习笔记八-受控与非受控组件

此文章是本人在学习React的时候,写下的学习笔记,在此纪录和分享。此为第八篇,主要介绍非受控组件与受控组件。 目录 1.非受控组件 1.1表单提交案例 1.2案例的总结 2.受控组件 2.1受控组件案例 2.1受控案例总结 1.非受控组件 1.1表单提…

基于LLMs的多模态大模型(Flamingo, BLIP-2,KOSMOS-1,ScienceQA)

前一篇博客已经整理了不训练视觉模型的文章们: 基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC) 本篇文章将介绍一些需要训练视觉编码器来适配多模态大模型的工作们,这也是目前最…