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

        一直提醒自己要更新CSDN博客,但是确实这段时间到了一个项目的关键节点,杂七杂八的事情突然就一涌而至。STM32FPGA下位机代码和对应LabviewIAP升级助手、波形设置助手上位机代码笔者已经调试通过,因为不想去水博客、凑数量,复制粘贴炒冷饭,所以导致整体上更新得比较慢。

       一方面需要组织好语言描述、搭配好图片说明、安排好篇幅章节,另一方面对于比较重要的东西写完以后还会修改精炼,可能这就是CSDN排名上不去的原因,各方面原因导致有时候不能每周都保证更新一篇当然会尽力做到周更,往往一周没更新则需要几周连更才能回到之前的排名吧。

        回归主题不管是撰写什么样的技术博客,笔者都更倾向于层层分章叙述,这可能也是在学习工作后养成的逻辑性吧,一般性地首先说明技术背景即这项技术通常应用在哪里;其次交代这项技术的原理,嵌入式研发一方面需要不断的项目迭代积累,另一方面也需要懂得些原理性的知识,否则在出故障的时候你如何去复现定位排查问题;再次会展开实施细节,在了解完背景应用和原理知识后,就到了具体的落地实施,怎么更好地去落地兼顾产品的稳定性、易用性、准确性和物料成本、开发周期、人力投入等本身就是一种权衡取其最优解;最后会把开发当中遇到的一些常见问题和注意事项列举出来,并给出自己的解决方法吧。

       在这里笔者举三个现实落地的项目其技术处理上包含一些相似点主要在ADC采样这块,大家可以从中直观比较感受应对不同的现实需求,硬件选型和软件设计上也是相辅相成的:1. 程控交流电源项目需要把输出端的高压信号通过分压电阻和运放调理到ADC芯片的采样范围内,且频率范围是1-500hz的可设定正弦波,电压范围是1-300V高压信号,整体上要求比较高的采样精度,为了加快这款产品的开发速度,选取了STM32F405RGT6作为ADC的采集端芯片硬件上搭配了一片14位双通道SPIADC,这款芯片本身Flash较大可以存储Bootloader、校准表数据、App程序且主频168Mhz速度较快通过定时器重加载可以保证对各个频率段的正弦波信号进行等间隔采集,随着频率的提高采样点从512128,再进行后期运算;2. 气体浓度检测项目需要把光源发出毫伏级的模拟电压信号通过运放调节到ADC芯片采样区间内,也是采样一个5hz固定频率的类正弦波信号,再去计算折合成当前某种气体的浓度,整个项目对精度要求非常高且对产品价格较为敏感,所以选择了2ksps较低采样速率的24位高精度ADC,搭配STM32F103RCT6ADC进行每个周期1024个点等间隔采样计算还原等,整体硬件成本很低但保证浓度精度却很高;3. 天线单元测量项目需要把一个上Mhz不同频率叠加的正弦波进行滤波计算、FFT还原波形等,而且是有16路模拟信号需要处理,主控芯片选型上有几种应用方案:一是用ZYNQPLPS等细节相关技术整体学习开发周期很长不易把控项目进度;二是用高端带DSP48资源丰富的FPGA芯片比如K7V7等,用纯FPGA逻辑进行采样、计算、通信等,但开发周期会非常长,顶级的FPGA芯片如V7价格动则上万并且引脚也很多对PCB层数要求很高;三是用中低端的FPGA芯片如A7,搭配DSP或者STM32进行一些外扩的浮点数计算,整体硬件设计和软件开发上更容易衔接,关于ADC芯片的选型如果使用16ADC去实时采样显然硬件成本会很高且产品市场竞争力很小,所以选择一款高性价比的164通道的LVDS接口的ADC,这样16路模拟信号用44通道ADC即可以完成采样,前端FPGA实时地切换不同的通道进行高速采样把16路的ADC得到的二进制数进行FIR滤波、FFT傅里叶变化等,后端选择主频216MhzSTM32F746进行后期浮点数计算把ADC采样计算处理得到的二进制数转换成对应的角度数据、波距数据等等,前端选择XC7A100T-2FBG484I即中档A7芯片外接两颗DDR3颗粒进行ADC采集的数据缓存,在节约成本的同时也取得了非常精确的测量结果。

       可能上面的内容其本身和STM32 IAP升级相关性并不大,但是写在这里主要帮助大家解除一些学习上的迷茫或者说写给曾经的自己,笔者在读研时候刚接触到STM32等一些MCU开发平台,跑过原子和野火的例程开发板demo后会感到不少迷茫,一方面会觉得通过学习这些市面上的主流开发板入门了STM32中常用的一些中断和配置等,但是另一方面具体在项目中怎么用,这样做好不好或者说对不对,稳定性和可靠性有没有保证等这些没有教程去手把手教学,而且看来看去就感觉网络上的STM32教程好像都是原子教程的改写版,比如IAP升级原子给出了STM32标准库的串口循环队列demo,然后几乎所有市面付费的教程千篇一律地这样写仿佛像考研计算机408统考一样全国考生都是一个老师教出来的,而在这背后可能真的大部分人只是在不断地复制粘贴,很少有人去静下心仔细思考或者亲手实践吧。

      笔者想在第二篇博客里把IAP升级的原理说明清楚,第一篇博客则写的是IAP升级的项目背景,IAPIn Application Programming)即在应用编程, IAP 是指用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品汇总的固件程序进行更新升级。

       然后我们再来看看如何去实现IAP,通常去实现IAP功能是需要用户程序可以在运行中实现独立更新自身Flash代码的目标。所以在设计固件程序时要编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式比如USBTMCLANUSART接收数据执行对第二部分代码的更新,第二个项目代码才是所需要的真正功能代码。 这两部分项目代码都同时烧录在 User Flash 中,当STM32芯片上电后首先是第一个项目代码开始运行并做如下操作:

1)检查是否需要对第二部分代码进行更新

2)如果不需要更新则转到4

3)执行更新操作

4)跳转到第二部分代码执行

       第一部分代码必须通过其他手段,比如JTAGISP下载器烧入,而第二部分代码则可以既使用第一部分代码IAP功能烧入,也可以连同和第一部分代码一起烧入,以后需要程序更新时再通过第一部分IAP代码更新。

      一般性地工程上我们将第一个项目代码称之为Bootloader程序,而第二个项目代码称之为Application程序,当然它们存放在Flash的不同地址范围,一般是从最低地址区开始存放 Bootloader,紧跟其后的就是Application程序,但是需要说明的是如果Flash容量足够大是可以设计很多Application程序的,但是在下文中我们只讨论一个Application程序的情况,下面笔者就STM32单片机分别举例说明普通程序(Bootloader)的执行流程和IAP程序(Bootloader)的执行流程。

       普通程序执行流程,当STM32程序中只包含了Application程序则运行流程如下图1所示:

1 STM32普通程序执行流程

       STM32 的内部闪存Flash地址起始于0x08000000,一般情况下程序文件就从此地址开始写入。例程中笔者选择了 STM32F103RCT6是一种基于 Cortex-M3 内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张 “中断向量表”的起始地址是0x08000004,当中断来临STM32 的内部硬件机制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量再去执行中断服务程序。    

        在上1图中,STM32 在复位后,先从0x08000004地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到程序中的main函数,如图标号②所示;而在裸机程序里的main函数一般都是一个死循环,在main函数执行过程中,如果收到中断请求即发生重中断,此时STM32强制将PC指针指回中断向量表处,如图标号③所示;然后根据中断源进入响应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回main函数执行如图标号⑤所示。

       而当加入 IAP 程序之后,程序运行流程如下图2所示:

2 STM32 IAP程序执行流程

       在上图2所示流程中,STM32复位后,还是从0x08000004地址取出复位中断向量的地址并跳转到复位中断服务程序,在运行复位中断服务程序之后跳转到IAPmain函数,如图标号①所示;在执行完IAP以后,即将新的Application代码写入STM32Flash(图中灰色部分)。新的Application程序复位中断向量起始地址为0x08000004+N+M,跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的main函数,如图标号②和③所示,同样main函数为一个死循环,并且注意到此时STM32Flash,在不同位置上共有两个中断向量表。

       在main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新程序的中断向量表,如图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回main函数继续运行,如图标号⑥所示。

通过以上两个过程的分析,可以知道IAP程序必须满足两个要求:

1)新的Application程序必须在IAP程序之后的某个偏移量为x 的地址开始;

2)必须将新的Application程序中断向量表相应的移动,移动的偏移量为x

       在介绍完IAP升级原理和STM32启动机制后,接着我们来看看IAP升级过程吧,STM32上电或者复位以后,首先执行Bootloader程序,Bootloader程序启动后,检查串口是否有升级数据,等待10秒钟无升级数据,则自动跳转到功能固件Application程序开始运行,如果收到升级指令则进入升级模式,直到接收完成全部升级数据,并将新的固件Application程序升级到对应的Flash区域,启动运行新固件程序升级过程结束,并在上位机上做出提示详细细节会在下篇博客具体说明。

       最后笔者带着大家看一看STM32F103常用系列的Flash结构,STM32F103可以说是一款如同教科书般经典的MCU芯片,价格低廉且功能实用可以说能够胜任任何一款嵌入式产品的应用开发,IAP升级的本质就是STM32芯片通过Bootloader程序接到外部接口发来的BIN文件报文并将其准确写入Application对应的Flash地址中,所以搞清楚STM32F103内部的Flash结构则是IAP开发的关键性一步,就拿STM32F103R8T6来举例,其本身是STM32F103系列中较低端的型号内部具有64KBFlash空间,其中STM32F103R8T6 要按照IAP升级Flash的结构可以分配如下:

STM32F103R8T6 Flash地址范围 0x08000000 -- 0x08010000 (总大小64KB

Bootloader代码区地址范围       0x08000000 -- 0x08002000 (占用大小8KB

功能固件代码区地址范围         0x08002000 -- 0x08010000 (占用大小56KB

      如下表1所示是STM32F103常用系列的FLASH大小和扇区空间,笔者将其总结如下供大家进入STM32F103系列单片机IAP开发时参考,当然STM32F103系列单片机型号太多,下面表格只列举了常用型号的几种,用于描述FlashApplication固件和Bootloader固件存放的地址,便于用于理解程序,又因为STM32F103系列单片机,中等容量和大容量产品的扇区大小不一致,所以bootloader程序中也需要注意!

STM32F103C8T6

64KB

64个扇区

每个扇区占1KB

中等容量

STM32F103RBT6

128KB

128个扇区

每个扇区占1KB

STM32F103RCT6

256KB

128个扇区

每个扇区占2KB

大容量

STM32F103ZET6

512KB

256个扇区

每个扇区占2KB

1 STM32F103系列单片机常用型号的Flash扇区分配

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的室内湿度加湿温度声光报警智能自动控制装置设计

wx供重浩:创享日记 对话框发送:单片机湿度 获取完整无水印论文报告(内含电路原理图和源程序代码) 在日常生活中加湿器得到了广泛的应用,但是现有的加湿器都需要手工控制开启和关闭并且不具备对室内空气温湿度的监测&am…

【微信小程序】-- 页面导航 -- 编程式导航(二十三)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

堆及其多种接口与堆排序的实现

我们本期来讲解堆结构 目录 堆的结构 堆的初始化 堆的销毁 堆的插入 向上调整算法 堆的删除 向下调整算法 取堆顶元素 判断堆是否为空 堆中元素个数 堆排序 向下调整与向上调整效率计算 Top-K问题 全部代码 堆的结构 堆是一种用数组模拟二叉树的结构 逻辑结构是…

Linux命令scp用法

本文主要讲的是scp用法如果哪里不对欢迎指出,主页https://blog.csdn.net/qq_57785602?typeblogscp 可以在win系统使用,本文百分之八十写的是win系统怎么使用,在本地上到服务器文件,从服务器下载文件到本地用工具连接到公司服务器时&#xff…

主线程与子线程之间相互通信(HandlerThread)

平时,我们一般都是在子线程中向主线程发送消息(要在主线程更新UI),从而完成请求的处理。那么如果需要主线程来向子线程发送消息,希望子线程来完成什么任务。该怎么做?这就是这篇文章将要讨论的内容。 一、…

Unity 之 使用原生UGUI实现随手移动摇杆功能经典实例

Unity 之 使用原生UGUI实现随手移动摇杆功能实现效果一,实现思路1.1 原理解析1.2 思路概述二,实现代码2.1 随手落下2.2 摇杆转动三,源码分享3.1 场景搭建3.2 完整代码3.3 实现效果实现效果 本文最终实现效果: 一,实现…

【数据结构】千字深入浅出讲解栈(附原码 | 超详解)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…

K8S + GitLab + Jenkins自动化发布项目实践(一)

K8S GitLab Jenkins自动化发布项目实践(一)发布流程设计安装Docker服务部署Harbor作为镜像仓库部署GitLab作为代码仓库常用Git命令发布流程设计 #mermaid-svg-pe9VmFytb9GmqMvG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…

微软Bing加入ChatGPT后如何用?教你12种问法黄金公式学会了,又能研究新副业赚钱又能加快学习速度

自从Bing连上chatgpt之后,chatgpt的回答不再像之前那样模棱两可,变得准确起来,至少给出的答案比起往常的会有更多一些的参考价值,也可以帮助大家能够更加深入细节去问问题和梳理问题的流程和解答的方式 当然问法不同得出的答案也是…

不做孔乙己也不做骆驼祥子

对教书育人的探讨前言一、为什么要“育人”1.育人为先2.育人是快乐的二、怎么“育人”前言 借着本次师德师风建设的主题,跟各位老师谈一谈对于“育人”的一些观点,和教育的一些看法。本文仅代表自己的观点,有不到位的地方,大家可以…

Linux虚拟机安装MySQL教程

文章目录一、安装步骤如下一、安装步骤如下 新建文件夹/opt/mysql,并cd进去运行wget http:/dev.mysql.com/get/mysq1-5.7.26-1.el7.x86_64.rpm-bundle.tar,下载mysql安装包 PS: centos7.6自带的类mysql数据库是mariadb,会跟mysql 冲突&…

单片机 | 51单片机原理

【金善愚】 单片机应用原理篇 笔记整理 课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid51090 文章目录一、引脚分布介绍1.分类2.电源引脚3.时钟引脚(2根)4.控制引脚(4根)5.端口引脚(32根)二、存储器结构及空间分布介绍1.存储器的划…

Android 14 新功能之 HighLights:快速实现文本高亮~

日常开发中可能会遇到给 TextView 的全部或部分文本增加高亮效果的需求,以前可能是通过 Spannable 或者 Html 标签实现。 升级 Android 14 后就不用这么迂回了,因其首次引入直接设置高亮的 API:HighLights。需要留意的是 HighLights API 和 …

香橙派5使用NPU加速yolov5的实时视频推理(二)

三、将best.onnx转为RKNN格式 这一步就需要我们进入到Ubuntu20.04系统中了,我的Ubuntu系统中已经下载好了anaconda,使用anaconda的好处就是可以方便的安装一些库,而且还可以利用conda来配置虚拟环境,做到环境与环境之间相互独立。…

STM32开发基础知识入门

C语言基础 位操作 对基本类型变量可以在位级别进行操作。 1) 不改变其他位的值的状况下,对某几个位进行设值。 先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。 2) 移位操作提高代码的可读性。 3) ~取反操作使用技巧 可用于对某…

【UML】软件需求说明书

目录🦁 故事的开端一. 🦁 引言1.1编写目的1.2背景1.3定义1.4参考资料二. 🦁 任务概述2.1目标2.2用户的特点2.3假定和约束三. 🦁 需求规定3.1 功能性需求3.1.1系统用例图3.1.2用户登录用例3.1.3学员注册用例3.1.4 学员修改个人信息…

基于 PyTorch + LSTM 进行时间序列预测(附完整源码)

时间序列数据,顾名思义是一种随时间变化的数据类型。 例如,24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络(LSTM)能够捕捉时间序列数据中的模式,因此可以用于预…

【C/C++】程序的内存开辟

在C/C语言中,不同的类型开辟的空间区域都是不一样的. 这节我们就简单了解下开辟不同的类型内存所存放的区域在哪里. 文章目录栈区(stack)堆区(heap)数据段(静态区)常量存储区内存开辟布局图栈区…

批量保存网页为单个网页文件

有时候,总有会遇到一些奇怪的需求,各种搜索都找不到答案,本次记录批量保存网页到单个网页文件。使用背景:只想简单的解决问题,不涉及编程网页带格式,将网页存为PDF格式会变量太大,一个个的处理太累涉及技术…

《毫无意义的工作》读书思考——互联网中,技术管理岗的价值或作用是什么?

目录 一、背景 二、书中咋说的 三、价值或作用可以从哪些方面思考? 四、写在最后 一、背景 日常工作中,自己经历的、身边人的吐槽,常常会有对纯技术管理者意义的怀疑。工作若干年,遇到各种各样的管理者,但让人吐槽…
最新文章