13.1

您所在的位置:网站首页 烧机代码 13.1

13.1

2024-03-28 01:20| 来源: 网络整理| 查看: 265

听到这个"需求"的第一反应“这是开玩笑吧”。我是是一个普通的码农,怎么可能开发出了那么复杂的东西。 带着一头冷汗,开始查资料中… 原来如此,有一种下载程序的方式叫做“IAP”。 悬着的心终于放了下来。 原来“给单片机烧写程序”的实质就是把“编译”好的“程序二进制文件”复制到芯片的flash中,和从电脑传电影到MP4播放器上是相似的原理。只不过现在这个“电影”是 “程序二进制文件”,而单片机就是这个“二进制程序”的“播放器”。

一、前言(需求背景)

需求背景就是“远程更新硬件设备的芯片程序(固件)”。在开发硬件设备的时候,一般使用专用“烧写器”给芯片烧写程序。从而完成芯片应用程序编码和调试工作。在硬件设备研发完成,正式生产出产品并卖给客户后。如果需要更新硬件程序怎么办。难道也要给用户邮寄一个烧写器和程序文件?一个批次的产品都需要更新,你能邮寄的过来吗?这期间会消耗多少成本。这是要赔本的节奏呀。因此,你需要一个“更新固件”的功能。“更新固件”这个词,对于爱鼓捣智能设备的兄台应该很熟悉吧。注意,使用网络或GPRS远程升级固件的时候,这项技术被称为“OTA升级”。

二、实现“更新固件”的原理

“更新固件”从技术角度来看,本质上是“芯片自己给自己更新(烧写)程序”。没错就是自己给自己更新程序,听起来有点吓人,万一芯片学会了自己给自己迭代升级程序,就像生物进化一样,一步一步的进化,最终出现“智慧思想”怎么办。如果你看过“终结者”就会知道:“没办法,拦是拦不住的”。因此,就会出现“硅基生物”代替“碳基生物”的地球(如果你看过刘慈欣的著作你就会明白我要表达的意思)。

芯片自己更新程序的原理是:芯片中是可以存放多个“程序”的。就和你的手机可以同时安装“支付宝”和“微信”是一个道理。而实现芯片自己更新“程序”的原理就是,烧写在芯片中的其中一个“程序”可以更新芯片中的另一个“程序”。把可以更新其他程序的“程序”叫做“Bootloader”,把被更新的“程序”叫做“App”。(当然从原理上来说芯片上的多个程序是可以实现互相更新的。只是现实中很少有这样的需求)。更详细的实现细节,请阅读13.2~13.5章节。

二、STM32单片机支持的几种“烧写”方式说明 stm32单片机有三种启动方式 启动方式由芯片上的两个管脚BOOT0和BOOT1来决定: 引脚配置启动模式程序储存位置支持的下载模式备注BOOT1=x BOOT0=0从用户闪存启动FlashSWD/JTAG单片机正常运行所使用的模式,在此模式,可以直接用专用烧写器下载程序BOOT1=0 BOOT0=1从系统存储器启动FlashISP从芯片自带的bootloader(ISP程序)下载程序,下载完需要切换引脚为“BOOT1=x BOOT0=0 ”并复位芯片,才能运行程序。BOOT1=1 BOOT0=1从内置SRAM启动SRAMISP调试模式,下载到芯片的代码存放在内存中,从而加快下载速度,避免写Flash。由于程序储存在内存中,因此掉电会丢失程序 Stm32所支持的烧写方式

SWD/JTAG 两种标准的“烧写器”编程接口(协议),支持这些编程接口的烧写器有:JLINK、ULINK、ST-LINK

ISP(In System Programing,在系统中编程) 使用固化在芯片内部的bootloder更新应用程序的一种方式。需要芯片硬件支持(阅读芯片手册)。一般使用串口下载程序,常用的下载工具软件有:国产的FlyMcu 和 stm公司官方提供的Flash Loader Demonstrator。注意,烧写的时候,需要配置芯片的Boot引脚,烧写完成之后,再修配置回来才能运行程序。

IAP(In applicating Programing,在应用编程),是一种除基本芯片烧录方法之外的一种巧妙程序烧写方式。 实现IAP下载程序,需要芯片保持在“从闪存启动模式”。其实现原理为:把flash 划分为2个部分,一个部分用于放置“更新其他程序的bootloader”,另一部分放置普通的应用程序。其中bootloder放置在芯片“上电”自动运行的位置(即用烧写器烧写普通程序的位置)。而普通的应用程序被放置在flash偏后面的 扇区中。至此你会有以下几个疑问,下面分别解答。手机自动更新系统,其实就是使用了IAP的原理。(其实电脑操作系统和手机操作系统都有bootloader,只不过用在电脑系统上,被叫做“Windows Boot Manager”)。

bootloader到底是什么?烧写程序是怎么做到的? bootloader起始就是一个普通的单片机应用程序,但他的功能是,从芯片外界读取“应用程序的bin文件”并把这个文件放置到芯片Flash的指定位置。就完成了“应用程序的烧写”。

有了bootloader之后,芯片程序怎样启动? 现在被烧写好的“应用程序”没有放置到单片机上电运行的位置,那么应用程序怎么启动呢。答案是,芯片上电,默认会运行bootloader这个程序,而bootloader这个程序可以判断是否存在可用的App,如果存在则把当前程序运行的“pc指针”指向放置应用程序的flash地址(在此之前,重新指定新的“中断向量表”和“堆栈”的地址)即可让应用程序跑起来。是的,使用IAP方式后,以后芯片每次上电都走这样一个启动流程。

四、实现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总线给目标电路板更新程序。

五、IAP升级固件中的“加密”说明 为什么要加密 当你的机器硬件出现问题的时候,你需要把固件文件发给用户,让用户使用“U盘”或串口来升级程序。这个时候相当于把你的程序可执行文件暴露了,如果让想“复制”你设备的人拿到手,他可乐开了花了。他只需要自己写个bootloader就能借用你这个“可执行文件”来生产一模一样的设备了。你怎么办,只能走法律途径了。所以你不加密固件,相当于“鼓励别人犯罪”。怎么加密 再bootloader中作修改。专门编写一个加密软件,来加密你要发给用户的“固件”。然后你自己机器中的bootloader加入对应的解密代码。bootloader从U盘或串口拿到“固件”文件先解密,然后在写到Flash中即可。至于用哪个加密算法,这里没有推荐(需求明确了还怕没有解决方案嘛.)。 六、IAP升级固件中的“压缩”说明

为啥要压缩固件 因为大呗!普通Stm32的应用程序,编译出来的Bin文件大小在20K~100K之间。咦,不大呀,怎么说大呢? 是不大,但是看对于什么通信方式来说。 对于U盘更新固件方式,几百K是小意思。如果对于网络方式呢。一般都是给远程网络设备更新固件,用的是流量。而物联网卡的流量很有限,伤不起呀。其次,看你对速度有没有要求。比如你用蓝牙来更新固件。更新速度的瓶颈是在传输速度上。而速度是无法提高的,只能通过减小固件体积来达到提高更新速度的效果。

怎样压缩与解压缩固件 使用电脑软件来实现对固件的压缩。bootloader只要负责解压即可。推荐的芯片可用压缩算法有:zlib、miniLZO



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3