STM32 10个工程篇:1.IAP远程升级(四)

news2024/12/31 3:40:21

      在前三篇博客中主要介绍了IAP远程升级的应用背景、下位机的实现原理、以及基于STM32CubeMXSTM32F103串口DMA的基本配置,第四篇博客主要想介绍Labview端上位机和下位机端的报文定义和通信等。

       当笔者工作上刚接触到STM32 IAP升级的时候,实事求是地说存在各种各样的困惑,所以这也是驱动我去撰写博客的动力,有很多CSDN朋友看过“FPGA基础知识”和“FPGA 20个例程”专栏后私信说写得接地气,让读者很容易接收和理解。学习都是从不懂到懂,从不理解到慢慢理解,而这个过程没有人指点的时候会非常痛苦。

     当然上面都是题外话,下面就站在工程落地的角度去想想STM32 IAP升级在具体实施中的几个问题,其实这也是当初困扰笔者的问题,主要它们也有很多共性吧。

  1. IAP升级需不需要特殊上位机的支持,网络上说法不一有很多教程说用串口助手选择本地的bin文件发送即可;
  2. IAP升级中上位机需要做什么操作,直接把bin文件一次性地发送下去就可以吗;
  3. IAP升级中下位机需要做什么操作,把收到的bin文件按十六进制数计数重新写入扇区就可以吗;
  4. 在没有本地显示屏GUI界面的情况下,用户怎么通过上位机告知下位机是跳转到Bootloader还是跳转到ApplicationBootloaderApplication之间应该怎么切换;

      首先回答第一个问题,IAP升级需不需要重新设计一个上位机,有些串口助手确实支持打开bin文件并将其按照十六进制数据格式发送,如果仅仅满足教学实验来说,完全可以用串口助手直接发送,但是现实当中串口通信是不可靠传输,即可能存在干扰等导致传输数据错误,这种没有校验和重发机制的方法发送bin文件显然没有可靠性而言;

       其次回答第二个问题,如果上位机直接把bin文件一次性发送到下位机端,下位机则需要去一个个字节接收再去计数数据,然后按照1024字节去写入一个个flash扇区,如果在传输过程中下位机计数错误了,导致flash数据写错将无法处理,所以显然一次性把一整个bin文件串口直接发送下来不是非常稳妥;

      再次回答第三个问题,假设每次要更新的bin文件有大有小,这一次更新的没有上一次的大,而上一次存在flash扇区的数据没有擦除干净可能存在风险,所以更建议每次进行IAP升级前从Application初始化地址起擦除完全;

     最后回答第四个问题,BootloaderApplication可以理解成两段独立的程序,显然同一时刻STM32只能运行在其中一个状态,且上电的时候STM32先进入Bootloader状态,然后一般情况下通过读取外挂eeprom的值跳转到Application状态,也可以设定一个定时器在5秒钟内未收到上位机发送的指令,则自动由Bootloader状态跳转到Application状态,这样可以节约一颗eeprom的物料成本;

      具体实现原理即上位机通过每次给下位机STM32发送1024字节的bin文件报文(最后一包报文如果不足1024字节,有多少发多少即可),下位机STM32收到每包bin文件后写入指定的flash空间,再由上位机程控跳转到Application上。

上位机和下位机之间的通信报文格式:

    0x7e,0x7e,0x5a三个字节作为固定报头,第四个字节作为命令码,其中命令号包括0x00 0x01 0x02 0x03 0x04,即报文格式为:3字节固定报头0x7e,0x7e,0x5a + 1字节命令号0x00-0x04 + 2字节当前报文编号(命令号是0x01才包含) + 2字节总报文编号(命令号是0x01才包含) +1024字节bin文件内容(命令号是0x01才包含)+ 2字节Modbus CRC校验码,命令号的内容具体如下,详细数据发送细节在下面结合上位机界面做说明。

     0x00:检测bootloader是否存在

     0x01:打包发送applicationbin文件内容

     0x02:发送完所有applicationbin文件内容,通知下位机从bootloader模式跳转到application模式

     0x03:检测application是否存在

      0x04:通知下位机从application模式跳转到bootloader模式

图1 IAP升级助手

      如图1所示是笔者所设计的上位机界面,控件1处选择波特率,控件2处选择打开或者关闭串口。点击控件3处“boot检测”,上位机即发送“7e 7e 5a 00 42 b4”,如果下位机STM32发送“2b 52 49 47 48 54 2e 7a”(ASCII码:+RIGHT+CRC16),则代表上位机和下位机之间串口通信正确且下位机bootloader存在,可以操作界面其他控件;如果下位机STM32发送“2d 45 52 52 4f 52 cf 0d”(ASCII码:-ERROR+CRC16),则代表上位机和下位机之间串口通信错误且下位机bootloader不存在,不可以操作界面其他控件。

     上位机在通过点击控件“boot检测”确定下位机bootloader存在的情况下,控件7“打开文件”和控件8“发送”才可以被点击,点击“打开文件”,即在本地打开.bin格式的文件,界面显示框内需要显示.bin文件的大小,需要折合发送多少包报文(每包报文默认是1024字节),再点击发送,即把.bin文件的二进制码打包报文发送给下位机STM32,上位机即发送“7e 7e 5a 00“ + 2字节该报文是第几包报文(第一包报文从0开始计数)+ 2字节一个需要多少发送总报文数 + 1024字节.bin文件二进制数据 + 2字节Modbus CRC校验码,比如第一包报文是1024字节,一共含有8包报文,则报文前八字节位是“7e 7e 5a 01 00 00 00 07“,依次类推即可。

      上位机每发送一条.bin文件二进制报文,下位机STM32确认无误后会发送“2b 52 49 47 48 54 2e 7a”(ASCII码:+RIGHT+CRC16),上位机在界面显示框内需要显示xx/yy包报文发送成功,如果下位机STM32确认有误后会发送“2d 45 52 52 4f 52 Cf 0d”(ASCII码:-ERROR+CRC16),上位机会重新发送该报文,默认同一报文最多发送五次,超过五次上位机在界面显示框内需要显示STM32远程升级失败!如果报文全部发送完成,且每包报文下位机STM32都返回正确,则上位机在界面显示框内需要显示STM32远程升级成功!

      在上位机确认下位机STM32接收完全所有的.bin文件二进制报文后,控件4 “app跳入”才可以被点击,点击此控件上位机即发送“7e 7e 5a 02 c3 75”,下位机STM32确认无误后会发送“2b 52 49 47 48 54 2e 7a”(ASCII码:+RIGHT+CRC16),上位机在界面显示框内需要显示application跳转成功!如果下位机STM32确认有误后会发送“2d 45 52 52 4f 52 cf 0d”(ASCII码:-ERROR+CRC16),上位机在界面显示框内需要显示application跳转失败!

      点击控件5处“app检测”,上位机即发送“7e 7e 5a 03 02 b5”,如果下位机STM32发送“2b 52 49 47 48 54 2e 7a”(ASCII码:+RIGHT+CRC16),则代表上位机和下位机之间串口通信正确且下位机application存在,可以操作界面其他控件;如果下位机STM32发送“2d 45 52 52 4f 52 cf 0d”(ASCII码:-ERROR+CRC16),则代表上位机和下位机之间串口通信错误且下位机application不存在。

      上位机在通过点击控件“app检测”确定下位机application存在的情况下,控件6“boot跳入”才可以被点击,点击此控件上位机即发送“7e 7e 5a 04 43 77”,下位机STM32确认无误后会发送“2b 52 49 47 48 54 2e 7a”(ASCII码:+RIGHT+CRC16),上位机在界面显示框内需要显示bootloader跳转成功!如果下位机STM32确认有误后会发送“2d 45 52 52 4f 52 cf 0d”(ASCII码:-ERROR+CRC16),

 

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

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

相关文章

【科普】电压和接地真的存在吗?如何测试?

经常在实验室干活的,难免不被电击过,尤其是在干燥的北方,“被电”是常有的事情,我记得有一次拿着射频线往仪表上拧的时候,遇到过一次严重的电火花,瞬间将仪表的射频口边缘烧出了一个疤,实验室遭…

LeetCode83. 删除排序链表中的重复元素

写在前面: 题目链接:LeetCode83. 删除排序链表中的重复元素 编程语言:C 题目难度:简单 一、题目描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 …

Java中异常的处理及捕获

Java中异常的处理及捕获 一、异常的概述 (1)Java中异常的作用:增强程序的健壮性 (2)在Java中所有的Error(错误)和异常(Exception)都继承了同一个父类Throwable 二、异…

postgresql内核源码分析-删除表drop table流程

专栏内容:postgresql内核源码分析个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 调用关系 概要流程 详细流程 创建对象列表空间 删除多个指定的数据库…

【蓝桥杯国赛真题27】Scratch LED屏幕 少儿编程scratch图形化编程 蓝桥杯国赛真题讲解

目录 scratch LED屏幕 一、题目要求 编程实现 二、案例分析 1、角色分析

C#中使用git将项目代码上传到远程仓库的操作

一、远程仓库创建操作(远程仓库使用的是gitHub) 1、登录GitHub官网,注册登录账号后,点击创建仓库 2、仓库名称命名,如下所示: 3、创建成功如下所示:获得https协议(https://github.c…

Android开发不可缺少的辅助工具

目录 jadxandroid_toolscrcpy-guiCode CraftsSQLite Expert Personal jadx jadx是一款apk反编译工具。 PS:部分版本安装,无法打开类文件,需换个版本。 开源地址:https://github.com/skylot/jadx android_tool android_tool可以通…

【瑞萨RA_FSP】SCL UART 串口通信

文章目录 一、串口通信协议简介1. 物理层2. 协议层 二、SCI 简介三、SCI的结构框图四、UART波特率计算 一、串口通信协议简介 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式&a…

SNAT和DNAT策略

文章目录 1.SNAT策略及应用1.1 SNAT原理与应用1.2 SNAT策略的工作原理1.3 实验步骤 2.DNAT策略2.1 DNAT策略的概述2.1 DNAT原理与应用2.3 实验步骤 3.规则的导出、导入4. 总结 1.SNAT策略及应用 1.1 SNAT原理与应用 SNAT 应用环境:局域网主机共享单个公网IP地址接…

【利用AI让知识体系化】关于浏览器内核的基础知识

I. 介绍 什么是浏览器内核 浏览器内核(Browser Engine),也叫浏览器渲染引擎(Rendering Engine),是浏览器的核心组成部分,它负责将 HTML、CSS、JavaScript 等代码经过解析和渲染后,…

End-to-End Object Detection with Transformers 论文学习

论文地址:End-to-End Object Detection with Transformers 1. 解决了什么问题? 现有的目标检测算法需要大量的人为先验的设计,如 anchor 和 NMS,整体架构并不是端到端的。现有的检测方法为了去除重叠框,一般会利用 p…

企业级信息系统开发——初探Spring - 利用组件注解符精简Spring配置文件

文章目录 一、打开项目二、利用组件注解符精简Spring配置文件(一)创建新包(二)复制四个类(三)修改杀龙任务类(四)修改救美任务类(五)修改勇敢骑士类&#xff…

NEEPU Sec 2023 公开赛 writeup

文章目录 WebCute CirnoCute Cirno(Revenge) RevHow to use ida?BaseHow to use python?IKUN检查器junk code CryptoFunnyRsaLossloud Misc吉林第一站倒影Shiro重生之我是CTFer 问卷 Web Cute Cirno 学艺不精的我脑袋要炸了 在Cirno界面的源代码中发现任意读 考虑之前的比…

在Ubuntu20.04部署Flink1.17实现基于Flink GateWay的Hive On Flink的踩坑记录(一)

在Ubuntu20.04部署Flink1.17实现基于Flink GateWay的Hive On Flink的踩坑记录(一) 前言 转眼间,Flink1.14还没玩明白,Flink已经1.17了,这迭代速度还是够快。。。 之前写过一篇:https://lizhiyong.blog.c…

View中的滑动冲突

View中的滑动冲突 1.滑动冲突的种类 滑动冲突一般有3种, 第一种是ViewGroup和子View的滑动方向不一致 比如: 父布局是可以左右滑动,子view可以上下滑动 第二种 ViewGroup和子View的滑动方向一致 第三种 第三种类似于如下图 2.滑动冲突的解决方式 滑动冲突一般情况下有2…

Ubuntu 20.04上安装和配置Samba

介绍: Samba是一个开源的软件套件,它允许不同操作系统之间共享文件和打印机。在Ubuntu 20.04上安装和配置Samba是一种方便的方法,可以在本地网络中共享文件夹,使多台计算机能够轻松访问共享文件。本文将向您展示如何在Ubuntu 20.0…

Properties使用

Properties是一种特殊的文本文件,可用来存储配置文件,或者存储一些键值对格式的数据信息 一、底层原理 分析源码可知,Properties底层实现是Map 二、创建&常用方法&遍历 1、创建 // 创建Properties对象 Properties properties …

设置Ubuntu 20.04的静态IP地址

引言:我们做嵌入式或者其他的项目时,有时候不免发现,Ubuntu的ip地址经常会改变,这个时候就需要我们手动配置静态IP了。 给Ubuntu设置一个静态IP地址有以下几个好处: 持久性:静态IP地址是固定不变的&#xf…

一.RxJava

1.RxJava使用场景 RxJava核心思想 Rx思维:响应式编程,从起点到终点,中途不能断掉,并且可以在中途添加拦截. 生活中的例子: 起点(分发事件,我饿了)->下楼->去餐厅->点餐->终点(吃饭,消费事件) 程序中的例子: 起点(分发事件,点击登录)->登录API->请求服务器-…

Lucene(3):Lucene全文检索的流程

1 Lucene准备 Lucene可以在官网上下载:Apache Lucene - Welcome to Apache Lucene。我们使用的是7.7.2版本,文件位置如下图: 使用这三个文件的jar包,就可以实现lucene功能 2 开发环境准备 JDK: 1.8 (Luce…