搜索
bottom↓
回复: 450

从今天开始,像使用U盘一样,升级STM32

  [复制链接]

出0入0汤圆

发表于 2015-12-3 19:47:50 | 显示全部楼层 |阅读模式
有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便

1:        插入电脑USB接口
2:        把升级固件拖到设备盘符
3:        升级完成



抛弃繁琐的USB DFU,抛弃落后的串口升级,让我们来谈谈U盘升级STM32

1. 为什么设计这个BOOT LOADER

在电子产品开发过程中,为了满足市场需要,经常是先开发出一个简单可用的版本,然后逐步迭代升级,修复bug,并增强系统功能
一个稳定,简单,安全的升级方式,就变得非常重要
对于嵌入式系统来说,常见的升级方式为
串口升级(私有协议或者X-Modem)
USB升级(DFU)
U盘升级(OTG)
网络升级
无线升级(OTA)
从技术来说,这几种升级方式大同小异,原理类似:都是一个Loader代理接收数据通道的数据,然后解密,烧录到FLASH中;但用户体验完全不同,拿串口升级来说,首先用户需要一个串口软件,然后对于没有硬件串口的PC来说,就需要一个USB转串口设备,对于不同PC平台,串口软件就不一样,这需要学习成本,过程繁琐;所以在一些需要用户自行升级远程设备的情况下,即便是通过电话指导,80%的用户仍然不知道怎么升级,导致失败

USB的DFU升级,也是类似的问题,它设计的初衷就是面向专业用户的,而不是小白!所以需要安装DFU软件,按照手册来一步步升级

OTA升级和网络升级,体验好些,可用做到无感升级,但不适合所有场景

而U盘升级,用户学习成本最低,U盘大家都知道,然后拷贝一个Bin文件进去,插入设备,重启设备,就完成升级了,非常简单。类似的变种,比如手机升级,是最先进的,直接将手机模拟成U盘,然后用户拷贝数据到手机,重启就好了,非常简单
在嵌入式系统中,还没这么方便的升级手段,虽然ARM的Mbed有一种类似的固件更新功能,但它是专门为调试器设计的,不能内嵌到用户MCU中
所以,我将手机升级的方案引入到嵌入式系统中,从而为大家提供一个实现稳定,安全,零学习成本的升级方案
经过一段时间的学习研究,有了这个USB MSD Bootloader

2. 功能特点

只占用15K FLASH空间
简单易用,直接拖拽文件进行固件升级,无需任何专业知识
采用USB大容量设备类,不用安装任何驱动
支持各种系统(Windows/Linux/Mac/Android)
不用开发任何上位机,提高产品效率
支持各种加密算法(AES256等),轻松安全升级
自动识别Bin,Hex,自定义加密固件(后缀为sec)文件
支持MD5文件校验机制,保证固件升级的完整性
显示设备升级状态信息
支持长文件名升级
多种措施保证系统健壮性,保证Bootloader不会被误擦除,保证APP合法性
支持用户自定义加密算法和完整校验算法,极致安全

3. 系统原理

系统开机上电后,Bootloader接管系统,初始化USB硬件,等待USB连接
Bootloader在启动后1秒内,检测USB是否连接PC:如果连接PC,则进入固件升级模式,执行第3步;超时则跳转第8步,尝试执行用户APP
Bootloader模拟成MSD设备,构建FAT16虚拟文件系统,U盘名为”Bootloader”,容量为100M,但具体实际可用空间,根据用户MCU来确定,建议不要复制除APP之外的无关文件
当用户复制文件到U盘时,Bootloader会判断文件后缀和判断文件size,如果size大于实际的MCU可用FLASH或者文件后缀不合法,则进入错误状态,更新状态文件,重新枚举USB
文件后缀和size通过检测后,Bootloader会截获PC发送文件数据流,并写入MCU 对应的Flash中
如果写入过程中出错,则终止操作,擦除APP内容,进入错误状态,更新状态文件,重新枚举USB
成功写入后,Bootloader更新状态文件,重新枚举USB,显示升级完成;但不会运行APP,只有拔掉USB后,再次重启,才会进入第8步,尝试运行APP
Bootloader检查APP固件的栈和入口函数合法性,只有通过检测后,才开始执行APP。检测判断条件是栈指针必须在RAM地址空间内,入口函数地址必须处于THUMB模式,并LSB为1
停止USB设备,关掉所有的中断,执行APP,APP开始接管系统


4. 支持芯片
STM32F101/3/5/7
重点来了,点击下面链接,下载固件



使用说明手册和使用文档,点击下载
2015-12-3 19:41 上传


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2015-12-3 19:52:47 | 显示全部楼层
本帖最后由 renjun_EMbest 于 2015-12-3 20:02 编辑

上传具体的使用方法截图
希望大家都能用这个工具来实现USB固件升级






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-12-3 20:09:00 | 显示全部楼层
starli 发表于 2015-12-3 19:56
非常牛,如果能做到5K以下就更好了。

优化一下,可以做到5K左右
现在主要是为了提高速度,刻意增加了内存使用,因为STM32 FLASH是2K的,分配了2个2K的缓冲区

STM32的FLASH已经足够大了,15K占用,应该不是大问题

出0入0汤圆

 楼主| 发表于 2015-12-3 20:13:16 | 显示全部楼层
SkyGz 发表于 2015-12-3 20:03
你的 U盘模式,  USB接口 怎么接,  用了STM32什么管脚实现与PC连机.........整毛线啊............ ...

STM103就只有一个USB
1)Device模式
2)PA11,PA12

基本原理就是模拟U盘,然后做一个虚拟FAT16文件系统

出0入0汤圆

 楼主| 发表于 2015-12-3 20:14:26 | 显示全部楼层
sblpp 发表于 2015-12-3 20:06
感谢分享,不知道能不能在F407上运行呢?

最近也在用F4,回头支持一下F4的芯片

出0入0汤圆

 楼主| 发表于 2015-12-3 20:17:04 | 显示全部楼层
bondxie3 发表于 2015-12-3 20:07
我们的产品都用SD卡升级, 卡还可以用于黑匣子功能的数据记录.

本来打算也用SD卡升级,后来为了节省成本,用了内置的FLASH,仿真一个100M的U盘
然后就做了这个升级代码

出0入0汤圆

 楼主| 发表于 2015-12-3 20:18:30 | 显示全部楼层
wajlh 发表于 2015-12-3 20:13
支持下楼主,新唐的单片机早就支持了



我瞧瞧去

出0入0汤圆

 楼主| 发表于 2015-12-3 20:23:16 | 显示全部楼层
nightseas 发表于 2015-12-3 20:19
这不就是类似于Nucleo的方式?只不过那个是下载到另一片STM32

新唐的不熟,哪个系列芯片,我研究研究

Mbed和Freescale采用过这种方式

出0入0汤圆

 楼主| 发表于 2015-12-3 20:46:56 | 显示全部楼层
zhenglingo 发表于 2015-12-3 20:43
对于大批量设备升级程序还是使用U盘升级方式更方便,很多坏境下不能随身带电脑过去。 ...

嗯,应用场合不一样,USB升级,适合小型的消费级产品升级

那个U盘升级的方式,确实适合设备现场升级

出0入0汤圆

 楼主| 发表于 2015-12-3 20:50:00 | 显示全部楼层
yinzhongxing 发表于 2015-12-3 20:45
不能升级完后自动重启设备吗

可以,刚开始也确实升级完成自动运行APP
但后来考虑了一下,还是采用了复位重启,这样状态更可控

出0入0汤圆

 楼主| 发表于 2015-12-3 20:53:11 | 显示全部楼层
ztrx 发表于 2015-12-3 20:39
内置的FLASH,仿真一个100M的U盘,怎么做的

PC 会通过SCSI命令,来查询设备容量,你截获到这个命令后,然后返回特定的值就好了

理论上:可以设置任意大小容量

这个值需要和虚拟FAT表匹配,不然系统拒绝接受,要求重新格式化

出0入0汤圆

 楼主| 发表于 2015-12-3 20:56:28 | 显示全部楼层
LCRPN 发表于 2015-12-3 20:52
你不放源码,我们怎么用加密呢?

(我不要求哈,只是提提,毕竟是你辛苦开发的。) ...

稍后开放一个lib和相应的加密API给各位用

出0入0汤圆

 楼主| 发表于 2015-12-3 21:03:23 | 显示全部楼层
LCRPN 发表于 2015-12-3 21:02
还是不敢用。

等我真需要用这个做产品的时候再找你买源码吧。

好,多交流

出0入0汤圆

 楼主| 发表于 2015-12-3 21:22:50 | 显示全部楼层
admvip 发表于 2015-12-3 21:03
尝试烧录进学习板,可是电脑没有识别出U盘,插上没反应。

哪个片子

出0入0汤圆

 楼主| 发表于 2015-12-3 21:38:26 | 显示全部楼层
admvip 发表于 2015-12-3 21:24
是STM32F103VE的片子


我也用的也是103VE,用原子的板子调的,JFlash烧录HEX文件
你对比一下原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-12-3 22:14:03 | 显示全部楼层
justdomyself 发表于 2015-12-3 21:57
试了下   可以将文件写入成功   但是无法运行  每次重新上电都是  进入boot  没有启动app ...

用户APP的地址是:0x0800500

运行的时候,先拔掉USB,再上电,不然会一直在Loader模式

出0入0汤圆

 楼主| 发表于 2015-12-3 22:15:40 | 显示全部楼层
foxpro2005 发表于 2015-12-3 21:58
功能上与LGT的JTAG工具 在功能与使用上是基本上是差不多的, LGT的这个工具就是使用的新唐的MCU。
1) 刚才 ...

HEX是标准文件,不需要加密,任何符合Intel hex标准的文件(IAR,MDK,GCC)都可以

SEC文件是加密文件,需要自定义加密头和加密结构

出0入0汤圆

 楼主| 发表于 2015-12-3 22:18:07 | 显示全部楼层
admvip 发表于 2015-12-3 21:50
找到原因了,奋斗学习板USB接的是PA11和PA12,和楼主的硬件结构不一样。

不至于啊,USB都是PA11和PA12
你运行一下自己开发板的USB例子,看能不能跑起来

出0入0汤圆

 楼主| 发表于 2015-12-3 22:51:45 | 显示全部楼层
菜包 发表于 2015-12-3 22:32
这个以前用其他芯片的时候搞过,后来实际应用发现还是有点问题,最终没用了,主要是两个方面:

1 因为boot ...

嗯,确实是这样的

前两个确实是问题

1)进入Boot模式这个问题,如果有外部硬件还好,可以配合一下;现在是1S延时加USB插入检测,也没有太好的解决方案
2)病毒这个,没深入研究,暂时不清楚是什么情况

这种USB升级方式,更适合小白,不需要上位机的简单场合

出0入0汤圆

 楼主| 发表于 2015-12-4 09:28:17 | 显示全部楼层
justdomyself 发表于 2015-12-4 07:28
:0x0800500??

不是:0x08005000么?

额,写错了,少加一个0

出0入0汤圆

 楼主| 发表于 2015-12-4 09:35:51 | 显示全部楼层
jiaowoxiaolu 发表于 2015-12-4 09:33
早就已经在用这种方法了,本来以为大家也都知道这种方法了,没想到还是有那么多人不知道啊

原理 ...


是这样的,我把原理也贴出来了

出0入0汤圆

 楼主| 发表于 2015-12-4 11:39:07 | 显示全部楼层
K.O.Carnivist 发表于 2015-12-4 11:02
挺好的 支持楼主
不过“在嵌入式系统中还没这么方便的升级手段”这话不准确哦 如91楼所说LPC11Uxx就自带这 ...

用的片子比较少,见识有限,难免孤陋寡闻了
谅解

出0入0汤圆

 楼主| 发表于 2015-12-4 11:54:02 | 显示全部楼层
jiaowoxiaolu 发表于 2015-12-4 11:31
LIB 什么LIB呀,这个压根就不是什么难度的,坛子里早就有加密算法的帖子了,还有c源码 AES,DES什么的, ...

嗯,是的,难度不大
原理都写出来了,建议你自己做一个,开源给大家

出0入0汤圆

 楼主| 发表于 2015-12-4 12:40:21 | 显示全部楼层
爱电子1122 发表于 2015-12-4 12:18
写上以后,支持在读出来吗

不支持,为了安全,禁止读出任何FLASH数据

出0入0汤圆

 楼主| 发表于 2015-12-4 16:32:52 | 显示全部楼层
jiaowoxiaolu 发表于 2015-12-4 14:37
有何不可 ?
http://www.amobbs.com/forum.php?mod=viewthread&tid=5638810&page=1&extra=#pid8894775 ...

Cool,赞一个

出0入0汤圆

 楼主| 发表于 2015-12-4 17:54:30 | 显示全部楼层
joiway 发表于 2015-12-4 17:39
感谢分享,收藏先!

哈哈哈,这个就无解了
AVR 有个软件USB,你可以研究研究

出0入0汤圆

 楼主| 发表于 2015-12-4 18:04:25 | 显示全部楼层
这帖子,属于抛砖引玉
楼上各位大神都给出了一些资料和开源代码,很棒的资料

希望各位都用好USB,有技术问题,欢迎交流

PS:适当的时候,我这份代码也会开源给大家

出0入0汤圆

 楼主| 发表于 2015-12-4 19:50:27 | 显示全部楼层
本帖最后由 renjun_EMbest 于 2015-12-4 22:00 编辑

Here is Nothing

出0入0汤圆

 楼主| 发表于 2015-12-5 00:46:25 | 显示全部楼层
OurWay 发表于 2015-12-3 21:39
这个新唐的,可以参考下,记得坛子里的 LGT仿真器  也是类似方式升级的,另外使用NXP的LPC1343出厂都有这种 ...

嗯,研究一下
谢谢

出0入0汤圆

 楼主| 发表于 2015-12-5 00:47:27 | 显示全部楼层
Ray______ 发表于 2015-12-4 08:21
openSDA好像也是这样?

嗯,OpenODA和Freescale可以这么搞

出0入0汤圆

 楼主| 发表于 2015-12-5 00:49:13 | 显示全部楼层
lingdianhao 发表于 2015-12-4 10:23
请问楼主加密如何实现?

文件都是数据流,你可以增加一个头和尾来进行文件类型检测和解密,校验

出0入0汤圆

 楼主| 发表于 2015-12-5 00:53:46 | 显示全部楼层
likebo 发表于 2015-12-4 10:30
lz我有个问题,我的产品本来就是用stm32+tf卡做了U盘功能的,而且随时插上usb都能访问tf卡(包括关机状态) ...

你这种情况,USB属于HOST角色
可以参考手机刷机的方案
1)增加硬件机制,比如按着音量键开机
2)检测U盘里面是否存在特定的文件名,存在则进入升级模式,升级完成后,在U盘里面写入一些文件记录信息,比如升级固件的MD5,下次开机检测时,先检测文件,再计算MD5
     如果文件存在,MD5一致,不升级;如果文件存在,MD5不一致,升级

供参考

出0入0汤圆

 楼主| 发表于 2015-12-5 00:54:52 | 显示全部楼层
单飞 发表于 2015-12-4 10:30
介质肯定是USB,是直接用单片机的FLASH虚拟U盘?把APP拷到FLASH里的?那就和其他设备间接拷到FLASH原理一 ...

这个,你需要深入研究一下FAT文件系统的格式

出0入0汤圆

 楼主| 发表于 2015-12-5 00:56:11 | 显示全部楼层
LCRPN 发表于 2015-12-4 10:57
如果你要做LIB,我再给几个接口的建议:

1、建议使用内部HSI,8M,2分后12倍频到48M,USB分频为1。这样 ...

2/3/4都有考虑,1没考虑到,谢谢指导

出0入0汤圆

 楼主| 发表于 2015-12-14 00:47:34 | 显示全部楼层
Dragontan 发表于 2015-12-13 23:09
楼主有个问题需要请教你一下,我使用的bootloader 现在U盘可以出来上电的时候里面与一个READY.TXT 的文件, ...

1.        运行时不要插USB
2.        断电重启后,如果APP没有执行。不要断电,直接把USB插到电脑上,看看txt文件的名字是什么

出0入0汤圆

 楼主| 发表于 2015-12-14 12:01:37 | 显示全部楼层
Dragontan 发表于 2015-12-14 09:03
插上USB 后里面好像显示的是READY.TXT

那就是你APP的问题了

出0入0汤圆

 楼主| 发表于 2015-12-14 19:13:56 | 显示全部楼层
z13900139000 发表于 2015-12-14 14:46
之前做产品也用过这个思路,但是后来项目因为安全性给取消了,就不用这种方式升级程序{: ...

安全性顾虑主要是指哪方面?

出0入0汤圆

 楼主| 发表于 2015-12-14 22:26:22 | 显示全部楼层
Dragontan 发表于 2015-12-14 21:06
楼主 我试了的  有时可以升级成功 有时升级不成功

我这边测试过很多次,都是OK的

您提到的不成功过程,能不能复现?
如果可以的话,请简单的列一下操作步骤

我试试

出0入0汤圆

 楼主| 发表于 2015-12-15 00:25:08 | 显示全部楼层
t3486784401 发表于 2015-12-14 22:51
用 F103C8 试了,很不幸,发生了BUG:

1. 连上后可以识别,但1s后自动断开,如果强行在1s内强行进入盘符, ...

Mark,在win7和mac上面测试了,Win8上面没有测试

这样,你先完全擦除芯片,再烧录BL,不要烧APP,插到电脑上试试
如果还是重启,就可以确认是系统的问题

出0入0汤圆

 楼主| 发表于 2015-12-15 21:47:27 | 显示全部楼层
t3486784401 发表于 2015-12-15 13:52
之前用的是 F103C8 自带串口 bootloader 烧录的,烧写时已经选择了全片擦除了;

这次我用 J-Link v2 的  ...

ok,了解了
估计是win8系统的问题,回头我装一个win8虚拟机测试一下

出0入0汤圆

 楼主| 发表于 2016-1-6 10:55:21 | 显示全部楼层
270388026 发表于 2016-1-6 08:39
大哥,给源代码吗? 这个东西不复杂,但是要费点力。还有就是希望固件可以像u盘文件一样拷过去。然后重启us ...

和你想的一样,就是这个效果

出0入0汤圆

 楼主| 发表于 2016-1-25 17:38:24 | 显示全部楼层
源代码奉上,共同学习
另: 有些同学提到Win10的问题,我暂时没有安装win10,哪位哥们帮忙测试下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-10-25 12:40:55 | 显示全部楼层
nzk123 发表于 2016-10-24 23:08
打算以后开源吗?期待

很早就上传代码了,你翻翻帖子里面的回复
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 19:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表