amobbs.com 阿莫电子技术论坛
标题:
stm32 iap 远程升级方案讨论
[打印本页]
作者:
lcslxh
时间:
2010-1-8 17:59
标题:
stm32 iap 远程升级方案讨论
我想通过GPRS实现STM32的远程升级,想法是把512kflash分成两个应用程序区,平常工作在A区,如果收到升级数据就先写入B区,全部写完后如果校验通过就在某个位置上置标志位然后重启系统。系统在引导区的时候根据标志位来运行A区或B区。有谁能提供个思路呢???
作者:
__STM32__
时间:
2010-1-8 18:10
还要什么思路?你已经说出了正确的思路。
作者:
astudent
时间:
2010-1-9 10:19
lz应该是需要例程?
作者:
bluelool
时间:
2010-1-9 12:00
这个思路不错
我也想学 嘎嘎
作者:
javenreal
时间:
2010-1-9 12:45
好主意,不过有点浪费Flash哈。
还有一个办法就是先进引导区,然后一边收一边写,不过这样所带来的问题就是风险加大,一旦写的过程中意外中断就惨了。
作者:
lcslxh
时间:
2010-1-11 10:34
没错回复【1楼】__STM32__
还要什么思路?你已经说出了正确的思路。
-----------------------------------------------------------------------
呵呵,想要各位大侠提供点实质的东西,不一定要例程,说明文档也行。主要是想先确认一下这样的作法是否可行。当然如果有现成的例程更好了,别说我贪心哈。。。。
作者:
lcslxh
时间:
2010-1-11 10:36
刚开始动手做,还没什么头绪。回复【4楼】javenreal
好主意,不过有点浪费Flash哈。
还有一个办法就是先进引导区,然后一边收一边写,不过这样所带来的问题就是风险加大,一旦写的过程中意外中断就惨了。
-----------------------------------------------------------------------
不浪费就得再外加一块FLASH或别的存储芯片了
作者:
wwkaixin950
时间:
2010-1-11 11:56
我也准备这样做的,还没有开始,现在是IAP后应用程序进不了中断
作者:
Alvin007
时间:
2010-1-11 12:12
关注中
lz的思路时将内置flash分成3个区吧
引导区 应用区A 应用区B
其实这里的B区完全作为一个外置数据存储器来用了
如果是这样何不在引导区加入“升级”程序 直接覆盖A区
如果像4楼所说真的意外中断了
也只是没有完成升级 引导程序没遭到破坏
只需要重新升级即可
不知这样是否可行
作者:
NJ8888
时间:
2010-1-11 12:22
LM3S可以用两个区,引导+应用,充分利用FLASH空间,估计STM32也可以,没试验
作者:
VERY
时间:
2010-1-11 12:24
mark
我想用zigbee升级
作者:
lcslxh
时间:
2010-1-11 14:43
回复【8楼】Alvin007
关注中
lz的思路时将内置flash分成3个区吧
引导区 应用区A 应用区B
其实这里的B区完全作为一个外置数据存储器来用了
如果是这样何不在引导区加入“升级”程序 直接覆盖A区
如果像4楼所说真的意外中断了
也只是没有完成升级 引导程序没遭到破坏
只需要重新升级即可
不知这样是否可行
--------------------------------------------------------------------
你的这种思路有一个问题是,如果程序已经在运行了呢?在要升级的时候如何转到引导区呢?如何判断是在升级程序还是转到正常运行状态呢
作者:
lcslxh
时间:
2010-1-11 14:44
回复【7楼】wwkaixin950
我也准备这样做的,还没有开始,现在是IAP后应用程序进不了中断
-----------------------------------------------------------------------
可否留下QQ联系,指导一下我呢,呵呵。
作者:
tuy0326
时间:
2010-1-11 17:35
首先两个区是肯定的
我是这样做的,一个引导区,一个应用程序区,外扩一片flash(本来就需要外扩,只是在里面存放几个变量)
每次启动就去读flash特定的那几个变量(怕误操作,我定义了5个变量,当5个变量相加 == 5 的话就是需要更新程序)
如果需要更新的话直接跳转到App,App里接收文件保存在外部flash里(我连CRC校验一起保存),当全部接收完,校验通过后就置标志,然后Reset,boot区读标志,读程序,然后更新,最后关门放狗
另外,这种方式可以很容易做到断点续传...
不过我还做了些额外的工作,多次从boot区跳app区都没有成功运行的话,这个时候就表明应用程序区已经损坏,且没有心的数据更新可用,就进入Xmodem升级方式不停的从串口发送C,最后一根稻草,可以通过windows超级终端升级...
目前项目中使用,还可以...
作者:
tuy0326
时间:
2010-1-11 17:41
首先,每次启动都先进boot区.
其次,只有当数据接收完成后才置标志,复位自己.
再者,如果多次app区都没有成功运行的话才认为该进入Xmodem升级(同样需要一个变量记录,每次在正常引导后也就是App区将boot区的一个多次引导的变量清0)
最后,可以在外部flash里放个最简单的bin文件,当所有的手段都失效后直接恢复这个程序到app提示用户该更新程序...
作者:
ddcour
时间:
2010-1-11 21:18
我在做这事,就在跳到应用程序的时候,系统就不正常了(出现了复位,重新开始了),不知道问题出在什么地方。
作者:
Alvin007
时间:
2010-1-21 19:33
回复【11楼】lcslxh
回复【8楼】Alvin007 
关注中 
lz的思路时将内置flash分成3个区吧 
引导区  应用区A  应用区B 
其实这里的B区完全作为一个外置数据存储器来用了 
如果是这样何不在引导区加入“升级”程序 直接覆盖A区  
如果像4楼所说真的意外中断了 
也只是没有完成升级 引导程序没遭到破坏 
只需要重新升级即可 
不知这样是否可行
--------------------------------------------------------------------
你的这种思路有一个问题是,如果程序已经在运行了呢?在要升级的时候如何转到引导区呢?如何判断是在升级程序还是转到正常运行状态呢
-----------------------------------------------------------------------
有个比较简单的办法 启动的时候直接进入引导区 通过按键等外部接口做选择
例如某些路由器 按住一个RESET键上电即可
我猜想应该是这个思路吧
作者:
346675655
时间:
2010-1-21 22:02
同样关注该 方案
作者:
346675655
时间:
2010-1-21 22:04
请 香主 给正解
替大家先谢过了
作者:
lcslxh
时间:
2010-1-22 09:00
目前我的板子上挂了块sst25vf016b的flash,上电启动后运行在引导区,引导区通过串口接收升级数据存放在sst25vf016b,等全部接收完毕后置标志位,然后将外部flash的数据COPY进0x08002000开始的内部flash中,程序已经可以正常运行了,用户程序用到了ucos,没发现有个别用户说的带操作系统升级不成功现象
作者:
gghyoo
时间:
2010-1-22 19:41
一个引导区,一个应用区,一个标志区
系统复位之后,进入引导区,引导程序判断标志区是否为0xAA,如果是,这进入应用程序,否则,进入ISP程序。
应用程序在运行时,接收到更新固件的命令之后,将标志区擦除,然后复位,复位后即可以进入ISP。
ISP程序在完成之后,将标志区写入0xAA,然后复位,复位后既可以进入应用程序。
作者:
gghyoo
时间:
2010-1-22 19:42
引导区包含了ISP程序
作者:
James_King
时间:
2010-10-9 08:14
关注
作者:
liouravr
时间:
2010-10-9 08:57
需要例程........
作者:
tothen5
时间:
2010-10-9 15:49
远程升级不在于分几个区,这个功能都可以实现, 主要是GPRS断点续传,完整率的问题!
作者:
astankvai
时间:
2010-10-9 16:12
回复【4楼】javenreal
好主意,不过有点浪费flash哈。
还有一个办法就是先进引导区,然后一边收一边写,不过这样所带来的问题就是风险加大,一旦写的过程中意外中断就惨了。
-----------------------------------------------------------------------
有两种办法:
一是BOOT保护,写失败后下次可以再BOOT引导更新程序。BOOT是永远有效的,除非用编程器重写。
二是外加一块存储器,存入默认程序,写失败后立即加载默认程序。
作者:
lysoft
时间:
2010-10-9 16:19
STM32是可以的,用XMODEM或YMODEM来保证数据的可靠性嘛
作者:
AWEN2000
时间:
2010-10-9 16:35
我觉得应该另外加一块flash,反正几百k的flash也便宜
如果利用片内flash,ab区
你的程序是否分别需要编译到ab区
作者:
tuy0326
时间:
2010-10-9 17:11
呵呵,这帖子还在讨论啊,很简单的啊,别想的那么复杂。
作者:
qfmcu
时间:
2010-11-1 21:27
mark
作者:
ahgreen
时间:
2010-11-3 15:42
这个对大容量的可以考虑,
作者:
xtaozi001
时间:
2010-12-9 16:31
还是不是很明白!
作者:
xtaozi001
时间:
2010-12-24 11:36
回复【27楼】AWEN2000
我觉得应该另外加一块flash,反正几百k的flash也便宜
如果利用片内flash,ab区
你的程序是否分别需要编译到ab区
-----------------------------------------------------------------------
给个例程啊
作者:
xizi
时间:
2011-1-3 02:12
认可13楼的方法。
作者:
xizi
时间:
2011-1-4 10:48
向一棵白菜10块钱学习。
作者:
zidong404
时间:
2011-1-5 21:41
关注,学习。
作者:
TM2010
时间:
2011-1-11 11:29
回复【13楼】tuy0326
首先两个区是肯定的
我是这样做的,一个引导区,一个应用程序区,外扩一片flash(本来就需要外扩,只是在里面存放几个变量)
每次启动就去读flash特定的那几个变量(怕误操作,我定义了5个变量,当5个变量相加 == 5 的话就是需要更新程序)
如果需要更新的话直接跳转到app,app里接收文件保存在外部flash里(我连crc校验一起保存),当全部接收完,校验通过后就置标志,然后reset,boot区读标志,读程序,然后更新,最后关门放狗
另外,这种方式可以很容易做到断点续传...
不过我还做了些额外的工作,多次从boot区跳app区都没有成功运行的话,这个时候就表明应用程序区已经损坏,且没有心的数据更新可用,就进入xmodem升级方式不停的从串口发送c,最后一根稻草,可以通过windows超级终端升级...
目前项目中使用,还可以...
-----------------------------------------------------------------------
请教下tuy0326 ,首次烧程序只烧BOOT引导区程序,这时BOOT程序运行时是从PC端接收APP目标文件然后写入APP FLASH区吗?
作者:
tuy0326
时间:
2011-1-11 13:04
恩,首次烧写程序不一定只烧引导区,其实我的做法是,程序调试通过后,用JLink的J-Flash读取整个芯片的Flash,然后用着个bin文件量产,在升级的时候才会运行BOOT写APP,不过你先写BOOT待启动后会发现没有App然后再请求APP也是可以的,只是多了一个步骤
作者:
first_blood
时间:
2011-1-11 14:47
我用GPRS把代码以bin文件格式传给stm32,stm32存到SD卡里,校验通过后,再发命令升级,原来的程序代码不删,这样SD卡里面可以存几十个代码,如果出错的话,可以还原回任何一个代码。但注意stm32的flash别写太多,会报废的
作者:
wzslmj
时间:
2011-1-11 15:22
我遇到问题了,我是用CAN进行升级,可是一边写一边收,写几条报文后,我的芯片就烧了,不能用了,求解????谢谢各位指导!!!
作者:
wzslmj
时间:
2011-1-11 15:25
回复【楼主位】lcslxh
-----------------------------------------------------------------------
能共同讨论不?我也在做升级,可是我板子烧完啦。痛苦呀?我扣扣:1499235006
作者:
kiss
时间:
2011-1-11 17:42
回复【楼主位】lcslxh
-----------------------------------------------------------------------
mark
作者:
lindabell
时间:
2011-1-11 18:00
这个问题非常值得讨论 mark
作者:
xtaozi001
时间:
2011-1-27 09:07
回复【12楼】lcslxh
回复【7楼】wwkaixin950
我也准备这样做的,还没有开始,现在是iap后应用程序进不了中断
-----------------------------------------------------------------------
可否留下qq联系,指导一下我呢,呵呵。
-----------------------------------------------------------------------
我想问一下,应用程序和引导程序 分别都是两个独立的工程时候如果操作的呢?!
作者:
8781462
时间:
2011-1-27 09:34
等待答案
作者:
ljt8015
时间:
2011-1-27 11:08
A区,B区地址不一样,那么你需要编译两个不同的应用才行。
作者:
jielove2003
时间:
2011-1-27 11:49
mark
作者:
outt60777
时间:
2011-1-27 12:16
mark
作者:
lvyi913
时间:
2011-1-27 12:48
如果是按照楼主的方法,需要实现位置无关的代码,因为新下载的固件并不知道是最重要存到A区还是B区执行,所以要弄成位置无关的代码,关于这个"位置无关"代码,我没有搞定,希望有大侠能指点一下。
作者:
jianchangd
时间:
2011-1-27 12:55
mark
作者:
jianchangd
时间:
2011-1-27 12:55
mark
作者:
yzhu
时间:
2011-1-27 14:46
出个主意,将Flash分为boot、A、B三个区。
方案1:
A区运行代码时,将升级数据写入B区,然后重启系统;
boot代码查看B区有无代码,
有的话,将B区的代码重写到A区,并擦除B区的代码,然后重启系统;
没有的话,直接运行A区的代码;
因为Flash擦除后,读出值均为0x0FF,很容易判断是否有无代码。
这样做的好处是工程设置不必改来改去,缺点是没次升级,需要擦除3次Flash。
方案2:
A区运行代码时,将升级数据写入B区,擦除自己区的某块Flash(固定偏移),然后重启系统;
B区运行代码时,将升级数据写入A区,擦除自己区的某块Flash(固定偏移),然后重启系统;
boot代码查看哪个区有有效代码,就运行那个区的代码。
这样做的好处是只擦除1次,缺点是需要更改工程设置,升级前得确认要升级到那个区。
作者:
yinqiu009
时间:
2011-1-27 16:33
【51楼】 yzhu
当然方案一更好一些。
其实这类IAP应用,关键的是健壮性:允许升级失败,但是要保证即使升级过程产生的任何失败了,都保证有个可以正确运行的程序可以执行。
作者:
ap0405209
时间:
2011-2-21 17:53
mask
作者:
blueskey88
时间:
2011-3-2 21:09
记录学习,现在很多抄表终端都要有远程升级和断点续传功能
作者:
moyuker
时间:
2011-3-4 11:35
要不要考虑升级的时候停电的处理?
作者:
MZ_Guo
时间:
2011-4-22 16:39
楼主,你的这个想法我觉得完全可行的,但最好是结合电路来执行完成后的重启,即控制自身的复位电路
作者:
wangrong
时间:
2011-4-22 20:21
这是个很好的讨论贴
作者:
DIYHAI
时间:
2011-5-24 13:38
正想做这方面的东西,有人做出来了吗?例程有不?
作者:
yhb105
时间:
2011-7-6 10:23
我就是小白。最好有个例子就好了。
作者:
cunlingwang
时间:
2011-7-8 09:17
mark一下
作者:
mlf_003
时间:
2011-7-18 17:31
MARK
作者:
hbx310
时间:
2011-7-18 23:17
MARK
作者:
ScorpioTiger
时间:
2011-7-18 23:26
期待楼主的实现
作者:
gdlun
时间:
2011-7-18 23:44
以前弄过单片机的,差不多的,可以参考下!
点击此处下载
ourdev_659040VMTOWP.pdf(文件大小:952K)
(原文件名:远程升级解决方案.pdf)
作者:
notebook
时间:
2011-7-19 11:46
mark
作者:
ysdaniel
时间:
2011-7-25 12:01
回复【楼主位】lcslxh
-----------------------------------------------------------------------
这个问题非常值得讨论 mark
作者:
ysdaniel
时间:
2011-7-25 12:03
回复【51楼】yzhu
-----------------------------------------------------------------------
学习了学习了
作者:
yu_studio
时间:
2011-7-25 12:50
学习一下,以后可能用到
作者:
vipeinstein
时间:
2011-7-26 12:35
关注中!!
作者:
sleet1986
时间:
2011-7-26 13:50
学习--
作者:
wuguoyan
时间:
2011-7-27 20:15
讨论很激烈。。关注
作者:
igoal
时间:
2011-8-2 14:57
改好了,大家可以看看,发表下意见,看还有什么不足。
(原文件名:IAP过程状态图.png)
作者:
xizizuiren
时间:
2011-8-3 21:54
数据怎么校验?
作者:
igoal
时间:
2011-8-3 22:12
你想怎么校验就怎么校验。
作者:
flyingsnail
时间:
2011-8-29 11:37
好样的,我也打算学学。
作者:
yangzhong
时间:
2011-8-29 16:52
围观了, 这个是很实用的功能, 以前在51的时候就想做, 一直没有整,在stm32上应该相对好实现一些吧
作者:
scat-01
时间:
2011-10-6 09:58
这个要mark下
作者:
farmerzhangdl
时间:
2011-10-18 14:34
这个mark下,马上准备实现
作者:
abnerle
时间:
2011-10-18 16:12
跟上,我也下星期实现它,争取提前结束项目
作者:
jiaren
时间:
2011-10-18 16:59
我做过一个功能,FLASH分BootLoader区和APP区。
1.开机进入BootLoader区;
2.检查SD卡是否有映像文件;
3.有即写入APP区,写完后删除文件跳到5;
4.无则跳到5;
5.跳到APP区。
。
。
运行APP
可以增加其他功能,如在APP区收文件数据,然后重启,就进入BootLoader区做上述的事情了。
作者:
abnerle
时间:
2011-10-20 14:27
IAP升级成功了,但是重启之后,就是无法正常执行了,始终在不停的重启,为什么???
if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
{
// Jump to user application
JumpAddress=*(vu32*)(ApplicationAddress+4);
Jump_To_Application=(pFunction)JumpAddress ;
// Initialize user application's Stack Pointer
__set_MSP(*(vu32*)ApplicationAddress);
Jump_To_Application();
}
执行完这段之后,就重启了,始终在这里重启,ApplicationAddress = 0x08010000
作者:
haitao10086
时间:
2011-10-21 11:37
在atmel的mage/xmage中有实现通过GPRS方式进行远程固件升级
作者:
xizi
时间:
2011-10-29 02:12
回复【51楼】yzhu
出个主意,将flash分为boot、a、b三个区。
方案1:
a区运行代码时,将升级数据写入b区,然后重启系统;
boot代码查看b区有无代码,
有的话,将b区的代码重写到a区,并擦除b区的代码,然后重启系统;
没有的话,直接运行a区的代码;
因为flash擦除后,读出值均为0x0ff,很容易判断是否有无代码。
这样做的好处是工程设置不必改来改去,缺点是没次升级,需要擦除3次flash。
方案2:
a区运行代码时,将升级数据写入b区,擦除自己区的某块flash(固定偏移),然后重启系统;
b区运行代码时,将升级数据写入a区,擦除自己区的某块flash(固定偏移),然后重启系统;
boot代码查看哪个区有有效代码,就运行那个区的代码。
这样做的好处是只擦除1次,缺点是需要更改工程设置,升级前得确认要升级到那个区。
-----------------------------------------------------------------------
两个方案都很妙!
作者:
xizi
时间:
2011-10-29 03:03
回复【64楼】gdlun
以前弄过单片机的,差不多的,可以参考下!
点击此处下载
(原文件名:远程升级解决方案.pdf)
-----------------------------------------------------------------------
所谓应用程序运行时就可以实现升级,并不是把升级流程嵌入应用程序,而是打入一个升级标记,然后放狗咬人。boot区的IAP检查升级标记,转入升级流程。
作者:
xizi
时间:
2011-10-29 03:11
回复【51楼】yzhu
出个主意,将flash分为boot、a、b三个区。
方案1:
a区运行代码时,将升级数据写入b区,然后重启系统;
boot代码查看b区有无代码,
有的话,将b区的代码重写到a区,并擦除b区的代码,然后重启系统;
没有的话,直接运行a区的代码;
因为flash擦除后,读出值均为0x0ff,很容易判断是否有无代码。
这样做的好处是工程设置不必改来改去,缺点是没次升级,需要擦除3次flash。
-------------------------------------------------------------------------
如果将b区的代码重写到a区过程中掉电,则上电应确保重新回写,而不是执行a区的残缺代码。
作者:
xizi
时间:
2011-10-29 03:30
回复【11楼】lcslxh
回复【8楼】alvin007
关注中
lz的思路时将内置flash分成3个区吧
引导区 应用区a 应用区b
其实这里的b区完全作为一个外置数据存储器来用了
如果是这样何不在引导区加入“升级”程序 直接覆盖a区
如果像4楼所说真的意外中断了
也只是没有完成升级 引导程序没遭到破坏
只需要重新升级即可
不知这样是否可行
--------------------------------------------------------------------
你的这种思路有一个问题是,如果程序已经在运行了呢?在要升级的时候如何转到引导区呢?如何判断是在升级程序还是转到正常运行状态呢
-----------------------------------------------------------------------
将内置flash分成3个区的好处是升级失败后可以有放弃升级的选择,重新运行原来的代码。
如果内置flash只分成2个区,没有b区,每次升级程序直接覆盖a区。则升级失败后没有选择,只能反复努力,直到升级成功。
程序已经在运行不是问题,要升级的时候放狗咬人即可,复位后转到引导区。
作者:
xizi
时间:
2011-10-29 04:13
改发一个新贴。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5156132&bbs_id=9999
作者:
shunda
时间:
2011-10-29 06:55
学习
作者:
wenjin0386
时间:
2011-10-29 08:16
学习
作者:
polang11
时间:
2011-10-29 11:31
关注中,很实用的技术
作者:
au_business
时间:
2011-11-6 18:04
强帖!
作者:
kui13575728208
时间:
2012-4-23 21:41
你们用GPRS远程升级,上位机都自己写的吗?我现在缺这个上位机,谁有能不能传我个,我可以根据这个上位机的协议传送文件的。谢谢
作者:
yuanye1127
时间:
2013-7-5 13:25
mark 远程升级功能,正需要使用,学习中
作者:
leahcim89
时间:
2013-7-19 14:14
标志区也得独立?,那用简单点就用按键扫描吧。
作者:
FASHAOYIHAOAMO
时间:
2013-7-30 14:33
搞搞!!
作者:
BSMGood
时间:
2013-8-9 16:44
tothen5 发表于 2010-10-9 15:49
远程升级不在于分几个区,这个功能都可以实现, 主要是GPRS断点续传,完整率的问题! ...
没错,这个是正解。
作者:
FASHAOYIHAOAMO
时间:
2013-9-23 10:55
楼主现在 做的怎么样了 有没有例程学一学啊???
作者:
FASHAOYIHAOAMO
时间:
2013-9-23 10:58
我现在 在外面 外挂了一片24c512
想先写到这里面来 但是怎么引导进单片机呢??
作者:
huangqilin14
时间:
2014-5-13 16:51
MARK 顶起
欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/)
Powered by Discuz! X3.4