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

news2025/1/21 12:21:13

       在IAP远程升级的最后一篇博客里,笔者想概括性地梳理总结IAP程序设计中值得注意的问题,诚然市面上或者工作后存在不同版本的IAP下位机和上位机软件,也存在不同定义的报文格式,甚至对于相似的知识点不同教程又有着完全不同的解读,这就很容易让初学者摸不清思路,所以在最后不准备过度赘述代码上的细枝末节,实际上大家在搞清楚整个IAP升级的过程后,便可以自定义报文设计出无数种下位机和对应的上位机软件,真实投产项目中IAP升级设计也是基于这些思想,但需要考虑到通信解析的完整性,即上位机和下位机的报文握手机制和重发机制,当然这些机制笔者都已添加到上位机软件中。

      另外笔者最近也买了一台新的戴尔小型台式主机,正考虑录制哔哩哔哩视频,前段时间也收到哔哩哔哩官方的邀请,但STM32和FPGA具体录制什么内容,具体怎么操作这些录屏软件等还在思考学习中,如果做视频想着视频内容不会太长都保持在一刻钟内,练习普通话言简意赅把关键点说明清楚,配上相关的背景知识、代码讲解、具体操作、上板现象等。

概括性地下面这些是笔者对IAP单片机升级程序设计中的关键技术点总结:

  1. 单片机上电首先进入的是Bootloader段程序,而默认是直接跳入Application段程序,这时候便自然而然地需要一些逻辑判断,比如板载Eeprom或者Flash置位相关标志位,即开机上电后单片机先读取掉电保存的标志位,如果标志位是跳转Application,则直接从Bootloader跳转到Application,如果标志位是停留Bootloader,则停留在Bootloader进行等待;
  2. 上位机中有“app跳入”和“boot跳入”两个按键,即按下两个按键,单片机向Eeprom或者Flash置位相关标志位再调用API函数NVIC_SystemReset(),单片机重启后立刻执行读取标志位操作,即可实现跳转到Application或者停留在Bootloader;
  3. 如果单片机没有外挂Eeprom或者Flash,那么也可以用系统时钟实现这个功能,如图1所示是系统滴答时钟默认是1ms,这里笔者用了10s的滴答时钟进行超时计时,即10s内单片机没有收到上位机的“boot检测”则直接跳转到Application,反之则停留在Bootloader等待上位机端发送BIN文件的二进制码;
  4. STM32单片机中向内部Flash中写入需要先解锁后加锁,即调用HAL_FLASH_Unlock()和HAL_FLASH_Lock()函数,同时要在HAL_FLASH_Unlock()解锁Flash并对Application段的Flash进行全擦除操作,再进行写入操作;
  5. 上位机端是主机,下位机STM32端是从机,为了确保程序的稳定性和可靠性,应引入报文握手机制和重发机制,这里很好理解上位机端每发一条指令,下位机都需要给出回应,如图2所示是下位机端正确和错误应答报文的定义,上位机端在发送任何一条报文后即进行了5s的超时等待,在这5s内下位机回复正确报文,上位机端则判断此条报文有效,反之收到下位机回复错误报文或者超过5s无回复判断此条报文无效,则如果是判断和跳转报文在上位机的信息菜单中显示相关提示,如果是发送BIN文件报文最多5次的进行重发;
  6. 在上位机发送BIN文件报文时,除了特定报头一般性地还需要加入报文帧信息,例如目前是第几帧数据,一共需要发送多少帧数据,举个例子在这个上位机中笔者把BIN文件按照1024字节进行划分,当然这里也可也划分成512字节和256字节,相对地要发送更多报文才能实现IAP升级,如图3所示是BusHound软件抓包上位机发送的BIN文件报文,其中红框固定报文头“7E 7E 5A”,“01”是命令码,而“00 06 00 07”代表这个BIN文件需要发送8个1024字节的报文,当前这个报文是第7包报文(报文统计从0计数),这些报文定义在前面博客中均有详细介绍,下位机STM32端在收到当前是第一包报文后就从Application段的Flash进行全擦除操作并进行Flash去锁处理,下位机检测CRC校验正确则回复上位机正确报文,触发上位机发送下一包BIN文件报文,下位机STM32端在收到当前报文是最后一包报文后即进行Flash加锁处理;

图1 系统滴答时钟10s超时等待计时

图2 下位机的正确和错误应答报文

图3 Bus Hound软件抓包上位机发送的BIN文件报文

       如图4所示是KEIL5下在线仿真的截图我们输入0x08008000这个Flash偏移地址,即可发现和如图5所示的用WinHex插件打开的Application程序RTC.Bin文件内容是完全一致的,则侧面说明了整个IAP升级的可靠性和稳定性。

图4 KEIL5下在线仿真截图

图5 WinHex插件打开的Application程序RTC.Bin文件内容

       如图6所示是KEIL5中配置Application程序自动生成RTC.BIN文件的操作方法,因为KEIL中默认生成的是.HEX文件,而IAP升级中我们需要的是.BIN文件所以需要配置下在程序文件夹下的指定路径下生成.BIN文件,如图7所示是笔者自己编写的“豌豆升级IAP上位机软件”,在IAP升级过程中的截图。

图6在KEIL5中配置Application程序自动生成RTC.BIN文件

图7 IAP升级过程中上位机的截图

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

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

相关文章

You Know What is C++嵌套类

C嵌套类 一、嵌套类1.嵌套类和访问权限2.作用域3.访问控制 一、嵌套类 在一个类的内部定义另一个类,我们称之为嵌套类,或者嵌套类型。引入嵌套类,因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现&…

黑马JVM总结(二十七)

(1)synchronized代码块 synchronized代码块的底层原理,它是给一个对象进行一个加锁操作,它是如何保证如果你出现了synchronized代码块中出现了问题,它需要给这个对象有一个正确的解锁操作呢,加锁解锁是成对…

为什么网络安全明明缺口很大,却看起来招聘很少呢?

2023 年我国网络空间安全人才数量缺口超过了 140 万,就业人数却只有 10 多万,缺口高达了 93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&…

10、【Qlib】【主要组件】高频交易嵌套决策执行框架

10、【Qlib】【主要组件】高频交易嵌套决策执行框架 简介简介 日间交易(例如,投资组合管理)和当日交易(例如,订单执行)是量化投资中的两个热门话题,并且通常会分别进行研究。 为了获得日间和当日交易的联合交易绩效,它们必须相互作用,并共同进行回测。为了支持多级的…

7.Tensors For Beginneers - Convector Components

介绍协向量时,曾说过它们有点像 行向量, 行向量确实以某种方式代表了协向量, 这里说明一下: 协向量是不变的; 协向量组件是可变的。 协向量不依赖坐标系,协向量的组件取决于坐标系。 当我们说协向量具有组…

基于SSM的旅游攻略网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

【SpringCloud】微服务技术栈入门3 - Gateway快速上手

目录 GatewayWebFlux网关基本配置过滤器与断言工厂全局过滤器跨域处理 CORS Gateway WebFlux gateway 基于 webflux 构建 WebFlux 是基于反应式流概念的响应式编程框架,用于构建异步非阻塞的 Web 应用程序。它支持响应式编程范式,并提供了一种响应式的方…

Java中阻塞队列原理、特点、适用场景

文章目录 阻塞队列对比、总览阻塞队列本质思想主要队列讲解ArrayBlockingQueueLinkedBlockingQueueSynchronousQueueLinkedTransferQueuePriorityBlockingQueueDelayQueueLinkedBlockingDeque 阻塞队列对比、总览 阻塞队列本质思想 阻塞队列都是线程安全的队列. 其最主要的功能…

3分钟基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来,各大公司在大模型方面持续发力,行业大模型也如雨后春笋一般发展迅速,日常工作中比较多的应用场景还是问答模式,作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT,…

python通过socket 搭建极简web服务器

环境:win11、python 3.9.2 背景:python的web框架众多,常见的如django、flask、tornado等,其底层是什么还是有些许的疑问,所以查找相关资料,实现浏览器访问,并返回相关信息 时间:20…

期权定价模型系列【8】:选择者期权(chooser option)定价模型

期权定价模型系列第8篇文章 1.前言 抉择型期权又称为随心所欲期权,是一种与时间相关的期权。这种期权的持有 人有权在到期日之前的某一段时期,决定该选择权为买权或卖权。因此,在决定的时间点,抉择型期权的价值应该为:…

命令解释器-Shell

目录 1. 概述 1.1. 概念 1.2. 分类: 1.3. type 命令 1.4.命令执行原理 2. Linux 中的特殊符号 3. 命令别名 3.1. 查看设置的别名 3.2. 常用的别名 3.3. 删除别名 3.6. 注意(alias永久化): 4. history 命令历史 例&a…

已解决:win的资源管理器右键菜单被折叠无法显示全内容?教你解决

win11在样式上整挺好的,那种圆润感是win10没法比拟的,但是有一个很严重的诟病,就是右键菜单的折叠,这个东西是资源管理器新增的一个功能,如果之前是win右键的重度用户,那么对于这种需要多点一步展开的操作&…

解决报错: require is not defined in ES module scope

用node启动mjs文件报错:require is not defined in ES module scope 现象如下: 原因: 文件后缀是mjs, 被识别为es模块,但是node默认是commonjs格式,不支持也不能识别es模块。 解决办法:把文件后缀从.mjs改…

【进阶C语言】排序函数(qsort)与模拟实现(回调函数的实例)

本章大致内容目录: 1.认识回调函数 2.排序函数qsort 3.模拟实现qsort 回调函数为C语言重要知识点,以函数指针为主要知识;下面介绍回调函数的定义、回调函数的库函数举例即库函数模拟实现。 一、回调函数 1.回调函数定义 回调函数就是一…

16哈希表-基础操作

目录 哈希表 散列思想 哈希表的实现 简单示例 开胃菜:LeetCode之路——242. 有效的字母异位词 分析 哈希表 英文名字为Hash table,散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash表”。 哈希表(Hash Ta…

vue3中使用return语句返回this.$emit(),在同一行不执行,换行后才执行,好奇怪!

今天练习TodoList任务列表案例,该案例效果如图所示: 此案例除了根组件App.vue,还有TodoList、TodoInput、TodoButton三个子组件。 因为有视频讲解,在制作TodoList、TodoInput时很顺利,只是在完成TodoButton这个组件时出了点问题…

VR开发(一)——SteamVR实现摇杆移动

一、基础环境搭建 1.AssetStore 找到SteamVR并导入; 2.添加一个 VR 中代表玩家自己的物体。我可以打开 Assets/SteamVR/InteractionSystem/Core 文件夹,将 Player 物体拖入场景: 二、修改手柄按钮映射集 3.windows/steamVR input&#xff…

【程序员必看】计算机网络,快速了解网络层次、常用协议和物理设备!

文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商 ISP1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器1.8 以太网和WLAN1.9 Socket (网络套接字) 2 总结 0 引言 在学习的过程…