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

news2024/11/17 3:36:51

        伴随着催更不断,周日晚上来继续撰写STM32 IAP远程升级的项目例程,在这篇博客中笔者主要结合上位机报文发送机制来介绍下位机的报文解析设计,坚持做原创博客确实是一件很考验耐力的事情,一方面博客的文字和图片需要投入大量精力和时间,另一方面想要把意思表达清楚也需要多思考再动笔,只希望这些博客能真正帮助到需要的人吧。

       嵌入式ARM、DSP、FPGA、PCB的付费教程很多,可以说看起来市面似乎真的不缺教程,但是为什么就让人觉得入门很难提高更难呢,这里面原因无外乎是教程和项目之间的差距,比如说现实中很多人做嵌入式开发,从毕业到工作好几年,只掌握了PCB原理图、版图的简单设计和MCU一般性的裸机编程,并且做出来的产品还是感觉心里没底,不保证其可靠性和稳定性。市面上找来找去有不少告诉你怎么入门的付费教程,却没有告诉你怎么去举一反三、独当一面地承担具体项目开发的教程,并且入行以后再往上学习MCU的FREERTOS系统,ARM LIUNX开发、FPGA逻辑设计以及DSP编程就感觉非常吃力了。

       其实笔者最初只想把FPGA那块写好走专业路线,但是坦诚地说有很多粉丝私信表示想要看一看真实项目中FPGA或者ARM怎么联合工作的,或者在一个产品中ARM负责什么、FPGA负责什么、DSP负责什么,那么这就上升到一个嵌入式软件架构的问题,如何把三大处理器合理利用并且保证产品的可靠性、实时性、稳定性等,所以笔者就渐渐意识到只深耕FPGA,就算把高速接口、视频处理、数字信号都写上天也无法满足更多粉丝的需求,因为很显然这样就无法建立起一个完整的嵌入式软件架构概念,于是更新完“FPGA 20个例程”专栏就开始撰写姊妹篇“STM32 10个工程”专栏,“STM32 10个工程”专栏写完就开始做几个真实的产品项目让大家感受到产品嵌入式软件开发的过程。

       步入正文,上一期写到了STM32 IAP升级的上位机报文发送机制,那么显然在这篇博客里,我们需要把下位机和上位机对应起来让其可以正常进行数据交互,忘记上位机报文发送机制的朋友可以去看看上一篇博客,注意到上位机端把“7e 7e 5a”作为固定的报文报头,第4位字节“00”代表“boot检测”、“01”代表“发送app bin文件”、“02”代表“app跳入”、“03”代表“app检测”、“04”代表“boot跳入”,所以在下位机的bootloader程序设计中,我们需要分辨出上位机发送报文的前3字节固定包头、第4字节命令号、报文最后2字节的CRC校验正确,所以需要对前面用STM32CubeMX生成的代码进行改写。

         首先我们需要把CRC校验做好,这里笔者使用了查表法,这种方法更加适合STM32端使用减轻了计算压力,但是需要实现存储好对照表,具体计算查表函数如下图1所示。

图1 CRC校验函数

      其次在串口空闲中断里,需要对报文头进行判断对于非“7e 7e 5a”报文头直接进行过滤处理并不再置位USART1_Type.flag,这样在mian函数的裸机程序中,因为USART1_Type.flag为0则不会进行串口数据解析操作,如图2所示则是串口空闲中断函数的具体编码。

图2 串口空闲中断函数

      再次我们需要编写FLASH擦除函数和FLASH写入函数,以方便对STM32的自身FLASH擦除和写入,笔者参考了ST官方基于STM32F0系列的flash_if.c代码,这里不想过度赘述只想简单说明对于FLASH擦除因为STM32F103RCT6内部分为256页的FLASH且每页FLASH占1024字节而bootloader含32页即application的地址0x08008000,并对FLASH_If_Write官方函数进行了封装用FLASH_TYPEPROGRAM_HALFWORD即一次性写入2字节的方式写入片内FLASH,如图3和图4所示分别是FLASH的擦除函数和FLASH的写入函数,并且两个函数带有返回值操作正确返回0,操作错误返回1。

图3 FLASH擦除函数

图4 FLASH写入函数

       最后如图5所示是串口解析函数,这个函数主要把串口DMA空闲中断收到的报文数据(报头正确)进行解析,函数先进行了CRC校验判断,如果CRC校验错误直接发送“-error”报文上位机收到立刻显示错误,如果CRC校验正确则进行下一轮判断:对于命令码“00”则为BOOT检测命令,下位机收到后即可返回“+right”并直接置位Flag_Start为Jump_Boot,上位机收到即可显示正确;对于命令码“01”则为发送BIN文件指令,下位机收到第一报数据后就从application的地址0x08008000处开始擦除并解锁FLASH,并且当检测到最后一报数据后即可加锁FLASH;对于命令码“01”则为APP跳入命令,这里直接置位Flag_Start为Jump_App即可,详细过程放在下一篇博客展开讲解。

图5 串口解析函数

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

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

相关文章

关于2023年积分落户公示及落户办理有关工作的通告

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Mybatis从0到1 SQL注入 参数占位符 XML配置 动态SQL

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能…

【Python】使用pycharm结合gradio做一个web页面的demo

紧接上文我们安装好了python3.10,现在需要下载它的开发工具pycharm,我们在这里不过多赘述具体细节,仅简要说明关键步骤,来通过gradio体验一下示例demo 一、下载IDE pycharm官网:https://www.jetbrains.com.cn/pycharm…

Scratch 抓小狗

Scratch 抓小狗 本程序转换为HTML后运行。“小狗”角色每0.7秒复制并移动到随机位置和方向,碰到边缘反弹,碰到其它角色后删除,得分1。其它4个角色第一个跟随鼠标,其它的跟随前面的角色,后面3个角色碰到“小狗”角色则得…

第45节:cesium 卷帘效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"></vc

Spring MVC中的HandlerInterceptors和Filters

1.介绍 比较Java servlet过滤器和Spring MVC Handlerinterceptor&#xff0c;以及什么时候一个比另一个更好。 2.Filters 过滤器是web服务器的一部分&#xff0c;而不是Spring框架。对于传入的请求&#xff0c;可以使用过滤器来操作甚至阻止请求到达任何servlet。反之亦然&a…

Bootstrap4 总结

文章目录 Bootstrap4 总结概述安装使用CDN使用源码 屏幕尺寸的分割点响应式容器(Containers).container-fluid.container.container-{breakpoint} 网格系统(Gird system)指定列宽实现8列布局 等列宽auto列宽响应式列 响应式工具类display属性其他工具类 组件按钮按钮组轮播图面…

还是搞不懂Anaconda是什么?读这一篇文章就够了

文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5.1 创建虚拟环境5.2 查看所有环境5.3 激活环境5.4 安装包5.4.1 conda方式5.4.2 pip方式5.4.3 从Anaconda.org安装包 5.5 查看该环境的所有包5.6 测试是否安装成功 6 退出…

百分点科技蝉联中国数据治理解决方案市场第二

近日&#xff0c;IDC发布了《中国数据治理市场份额&#xff0c;2022》报告&#xff0c;报告显示&#xff0c;2022年中国数据治理解决方案市场相比2021年增长了7.4%&#xff0c;百分点科技仍然保持领先优势&#xff0c;蝉联数据治理解决方案市场第二。 中国数据治理市场是一个发…

win7 修改粘滞键绕过开机密码(实操步骤详解)

文章目录 win7 使用粘滞键绕过开机密码声明 win7 使用粘滞键绕过开机密码 趁现在还没完全启动关机断电 再次开机选择启动修复 取消系统还原&#xff0c;等待几分钟 查看隐私说明 进入记事本可以打开文件 打开文件可以在C盘修改系统文件 找到粘滞键程序修改名称 找到cm…

leetcode_第17题_缺失的第一个正数——原地哈希

题目 题目 分析 正常思路&#xff1a;另外制作一个哈希表&#xff0c;然后遍历就ok 但是这样不符合题目空间复杂度要求&#xff0c;所以采用原地哈希就可以了。 思路&#xff1a;把正常数字nums[i]交换存储到下标位置为nums[i]-1的地方&#xff0c;不正常数字不管。&#xff…

Rdkit|最大公共子结构

github&#xff1a;地址 文章目录 Rdkit|最大公共子结构rdFMCS.FindMCS参数bondCompareatomComparematchValencesringMatchesRingOnlycompleteRingsOnlymatchChiralTag 高亮分子的不同子结构参考 Rdkit|最大公共子结构 rdFMCS.FindMCS mols: 分子对象maximizeBonds一个结构由…

springboot 获取上传到minio服务器的文件大小

springboot 获取上传到minio服务器的文件大小 前言探究获取文件大小的方法实践及示例 前言 一般minio上传文件&#xff0c;会在上传时拿到文件大小&#xff0c;并保存在数据库中。若想直接从minio上获取&#xff0c;如何获取&#xff1f; 探究获取文件大小的方法 pom依赖 &l…

ubuntu安装nginx

1、apt-get安装nginx 1.1安装最好用root用户安装 不然很多文件权限的报错会让人崩溃 sudo su root apt-get install nginx nginx -v #查看安装版本 service nginx start #启动nginx 1.2查看网页&#xff0c;能看到nginx的页面 1.3核对nginx的文件 find / -name nginx 看…

【UE4 C++】02-编译、生成当前的C++程序

一、编译 编译快捷键&#xff1a; CtrlF7 如果不使用快捷键&#xff0c;可以点击顶部菜单栏中的下拉按钮&#xff0c;然后选择自定义 点击添加命令 点击“生成”&#xff0c;选择编译“”&#xff0c;点击“确定” 此时可以看到顶部菜单栏多了一个用于编译的按钮 二、生成 鼠…

目标百万尼特亮度,这家公司用激光背光提升XR显示技术

​亮度不足一直是AR/VR显示中想要解决的难题之一&#xff0c;目前的AR光源中有多种方案&#xff0c;比如Micro LED、LCoS、DLP等&#xff0c;尽管Micro LED在亮度等方面优势明显&#xff0c;但制造工艺还不成熟。总的来看&#xff0c;目前AR中高亮度解决方案还有很长一段路​要…

Build input file cannot be found: .pch

xcode真机运行时&#xff0c;报错&#xff1a;Build input file cannot be found: /Users/mac/Desktop/projects/xxx/xxx.pch 实际查看发现&#xff0c;项目中的.pch文件存在&#xff0c;但运行时报错。修改配置里的.pch文件路径后&#xff0c;正常。

聊聊用户故事与测试启发

这是鼎叔的第六十六篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 用户故事的概念于1998年被正式提出&#xff0c;在2001年开始逐步成熟。目前&#xff0c;…

【G431】DAC+DMA输出正弦波

文章目录 前言1.CubeMx的配置步骤3.测试代码4.演示效果 总结 前言 之前有试过用纯的DAC输出正弦波但是效果不是很好&#xff0c;波形不连续&#xff0c;可以很明显的看出断层 之后尝试了DMA传输&#xff0c;发现波形明显变得更加顺滑。 1.CubeMx的配置步骤 下面以主频150MHz…

Avalon总线协议(二)

4.Avalon中断接口 中断接口允许从组件(agent components)能够向主组件(host components)发送事件信号。 例如&#xff0c;DMA控制器可以在完成一个DMA传输后中断处理器。 4.1 中断发送器 中断发送器将单个中断信号驱动到中断接收器。irq信号的时序必须与其相关联时钟的上升…