我冷汗直流,开始查资料……
原来有一种下载程序的方法叫“IAP”。 悬着的心终于松了口气。
原来,“对单片机进行编程”的本质就是将“编译好的”“程序二进制文件”复制到芯片的flash中,这和把电影从电脑传输到MP4播放器是类似的原理。 只不过现在这个“电影”是一个“程序二进制文件”,而单片机就是这个“二进制程序”的“播放器”。
1.前言(需求背景)
需求背景是“远程更新硬件设备的芯片程序(固件)”。 在开发硬件设备时,一般会使用专门的“编程器”对芯片进行编程。 这样就完成了芯片应用的编码和调试工作。 硬件设备研发完成后,产品正式生产并销售给客户。 如果硬件程序需要更新怎么办? 我们还需要给用户邮寄程序员和程序文件吗? 一批产品需要更新。 你可以通过邮件发送吗? 这期间要花多少钱? 这就是赔钱的节奏。 因此,你需要一个“更新固件”的功能。 对于那些喜欢摆弄智能设备的人来说,“更新固件”这个词应该很熟悉。 注意,当使用网络或GPRS远程升级固件时,这种技术称为“OTA升级”。
2.“更新固件”的原理
从技术角度来看,“更新固件”本质上就是“芯片本身更新(烧录)程序”。 没错,就是自己更新程序,听起来有点吓人。 如果芯片学会自己迭代升级程序,就像生物进化一样,一步一步进化,最终出现“智能思想”。 如果你看过《终结者》你就会知道:“没有办法,你阻止不了。” 因此,将会出现一个“硅基生物”取代“碳基生物”的地球(如果你读过刘慈欣的作品,你就会明白我的意思)。
芯片自身更新程序的原理是芯片内可以存储多个“程序”。 就像你的手机可以同时安装“支付宝”和“微信”一样。 实现芯片自身“程序”更新的原理是芯片中编程的一个“程序”可以更新芯片中的另一个“程序”。 可以更新其他程序的“程序”称为“Bootloader”,而要更新的“程序”称为“App”。 (当然,原则上芯片上的多个程序可以互相更新。但现实中很少有这种需要)。 更详细的实现细节请阅读13.2~13.5章节。
2、STM32单片机支持的几种“烧录”方式表明stm32单片机有三种启动方式。
启动模式由芯片上的 BOOT0 和 BOOT1 两个引脚决定: 引脚配置 启动模式 程序存储位置 支持 下载模式 备注
引导1=x 引导0=0
从用户闪存启动
闪光
SWD/JTAG
微控制器用于正常操作的模式。 在此模式下,可以用专用编程器直接下载程序。
引导1=0 引导0=1
从系统内存启动
闪光
互联网服务供应商
从芯片自带的bootloader(ISP程序)下载程序。 下载完成后,需要将引脚切换为“BOOT1=x BOOT0=0”并复位芯片才能运行程序。
引导1=1 引导0=1
从内置 SRAM 启动
静态随机存储器
互联网服务供应商
在调试模式下,下载到芯片的代码存储在内存中,从而加快下载速度,避免写入Flash。由于程序存储在内存中,断电时程序会丢失。
Stm32支持的编程方式
引导加载程序到底是什么? 编程是如何完成的?
Bootloader一开始是一个普通的微控制器应用程序,但它的功能是从芯片外部读取“应用程序的bin文件”,并将该文件放置在芯片Flash的指定位置。 这样就完成了“应用程序编程”。
有了bootloader之后,如何启动芯片程序呢?
既然已经编程好的“应用程序”并没有放在单片机上电运行的位置,那么应用程序是如何启动的呢? 答案是,芯片上电时,会默认运行bootloader程序,bootloader程序可以判断是否有可用的App。 如果存在,则将当前运行的程序的“pc指针”指向应用程序所在的flash地址(在此之前,重新分配新的“中断向量表”和“堆栈”地址)以让应用程序运行。 是的,使用IAP方式后,芯片每次上电都会经历这样的启动过程。
4. IAP的实施方式有哪些? 分别解释一下。
说到IAP的实现方法,有很多。 可以说,只要能够实现“数据传输”,就可以用来开发IAP固件升级的功能。 下面对常用方法进行详细说明:
U盘
Bootloader需要读取U盘的文件系统,从U盘中读取固件文件并写入Flash的指定位置。 这样就完成了程序的更新。
IAP实现方式最常见,也最方便。 只需将固件放入U盘,插入机器,启动机器即可自动更新应用程序。 一般智能硬件都是利用设备本身来模拟U盘的功能。 当您使用USB数据线将智能硬件连接到电脑时,电脑上会弹出一个类似U盘的磁盘。 你只需要将固件文件(bin文件)复制到此盘中即可。 然后断开USB线,重新启动或重新上电智能硬件,智能设备将自动更新固件。 缺点:很难支持市面上所有的U盘。
串口(RS232/RS485)
Bootloader需要实现串口通信,利用串口通道接收固件文件并写入Flash的指定位置。 这样就完成了程序的更新。
这也是更新固件常用的方法。 利用硬件设备的“串行通信线”即可完成芯片固件更新。 需要配合相应的上位机软件来实现。 用户体验比较好,使用也比较稳定。 (本文开头描述的需求均参考此实现方法)
网络TCP
Bootloader需要实现网络通信,利用网络通道接收固件文件并写入Flash的指定位置。 这样就完成了程序的更新。
常用于实现远程自动更新。 例如,放置在野外的智能设备会定期通过4G网络检查是否有更新。 如果有更新,则通过网络下载固件并自动更新。
蓝牙
Bootloader需要实现蓝牙通信,利用蓝牙通道接收固件文件并写入Flash的指定位置。 这样就完成了程序的更新。
通常用于便携式设备的更新。 因为一般便携式设备都采用蓝牙通信。 所以只能使用蓝牙来更新固件。
例如:智能手表、蓝牙耳机、蓝牙鼠标、蓝牙xx
CAN总线(主集群电路板模式)
通常用于更新大型机器电路板上芯片的程序。 主电路板上有一个文件系统,可以存储其他电路板上芯片的固件文件。 在大型设备中,电路板之间经常使用CAN总线通信。 因此,要更新机器中某块电路板的程序,可以采用“主从电路板”的方式,先将固件文件传输到主电路板芯片,然后由主电路板芯片更新程序通过CAN总线到目标电路板。 。
5. IAP升级固件中的“加密”解释了为什么需要加密
当你的机器硬件出现问题时,需要将固件文件发送给用户,让用户使用“U盘”或者串口来升级程序。 这时候就相当于暴露了你的程序可执行文件。 如果想要“复制”您的设备的人得到了它,他会很高兴。 他只需要编写自己的引导加载程序即可使用您的“可执行文件”来生成完全相同的设备。 你该怎么办? 只能走合法渠道。 所以如果不加密固件,就相当于“怂恿他人犯罪”。如何加密
在引导加载程序中进行修改。 专门编写一个加密软件,对要发送给用户的“固件”进行加密。 然后在自己机器的bootloader中添加相应的解密代码。 引导加载程序从USB闪存驱动器或串口获取“固件”文件,首先对其进行解密,然后将其写入Flash。 至于使用哪种加密算法,这里没有推荐(如果要求明确的话,恐怕就无解了)。6. IAP升级固件中的“压缩”指令
为什么要压缩固件?
因为它太棒了! 对于普通的Stm32应用程序,编译后的Bin文件大小在20K~100K之间。 嘿嘿,不大。 怎么说大呢?
虽然不大,但要看通讯方式。
对于U盘更新固件的方式来说,几百K根本不算什么。 网络方法呢。 通常,使用流量来更新远程网络设备的固件。 物联网卡的流量非常有限,不能伤害它。 其次,要看你对速度有没有要求。 例如,您使用蓝牙来更新固件。 更新速度的瓶颈是传输速度。 速度无法提升,更新速度只能通过减小固件大小来实现。
如何压缩和解压固件
使用计算机软件压缩固件。 bootloader只需要负责解压即可。 该芯片推荐可用的压缩算法有:zlib、miniLZO