OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3622|回复: 28

stm32怎样实现一边正常运行,一边串口接收程序升级数据?

[复制链接]

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
发表于 2018-9-3 16:14:29 | 显示全部楼层 |阅读模式
5金钱
搞了台别人家的设备。测试了下在线升级功能:
串口分了300多包把要升级的程序数据传输到设备里面,然后点击“升级”,设备一眨眼(重启)更新程序了~~~

芯片STM32F030,flash为64K
要升级的APP程序量大概54K

因为flash大小的限制,肯定是不能同时存储2份APP程序的,
那么问题来了:
到底是怎样实现程序的所有功能都能正常运行(显示、保护动作、串口通信等等),一边串口还在接收要写入Flash的程序数据的呢??
接收到的50多K的数据,及时用缓存,也不可能有这么大的RAM用来缓存啊?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-8-18
在线时间
63 小时
发表于 2018-9-3 20:34:01 | 显示全部楼层
是不是在接到升级指令的时候已经转到BootLoader了?在bootloader里面处理flash的写入。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 08:49:36 | 显示全部楼层
ktoto2011 发表于 2018-9-3 20:34
是不是在接到升级指令的时候已经转到BootLoader了?在bootloader里面处理flash的写入。

理论上是我点击升级按钮,然后进入BootLoader,将flash擦除更新了,这样的思路是比较符合现在的表象的,但这样操作的一个问题是,我串口一直接收的那50多K数据要先暂存在哪里?如果不存储,那RAM是没有这么大空间的,如果存储(借助外部E2之类的,不知道行不行),那相当于这个存储位置在APP和bootloader程序中都能访问调用,且不会被轻易擦除,外部E2能实现这样的特性吗?
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2016-8-18
在线时间
63 小时
发表于 2018-9-4 09:48:27 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 08:49
理论上是我点击升级按钮,然后进入BootLoader,将flash擦除更新了,这样的思路是比较符合现在的表象的, ...

边接数据边写flash,不暂存
回复

使用道具 举报

8

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2018-1-17
在线时间
23 小时
发表于 2018-9-4 10:25:58 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 08:49
理论上是我点击升级按钮,然后进入BootLoader,将flash擦除更新了,这样的思路是比较符合现在的表象的, ...

要看代码,有的是只存储部分,比如1k再写flash;或者直接写flash,并不是全部存下来再写flash。
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-4 11:09:29 | 显示全部楼层
你这不现实,哪里来这么大的缓存给你用。
回复

使用道具 举报

5

主题

133

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1372
金钱
1372
注册时间
2018-3-5
在线时间
741 小时
发表于 2018-9-4 11:45:44 | 显示全部楼层
hgr211 发表于 2018-9-4 11:09
你这不现实,哪里来这么大的缓存给你用。

可以试试,接收时先写入外部FLASH,接收完成跳转到IAP,从IAP里在拷贝到32的FLASH,拷贝完跳转执行
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 11:58:10 | 显示全部楼层
hgr211 发表于 2018-9-4 11:09
你这不现实,哪里来这么大的缓存给你用。

不要说不现实,设备在面前摆着呢,表象上就是这样的啊。不先缓存那你说说是怎么实现的?flash不可能一边运行还一边擦自己吧
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 12:01:54 | 显示全部楼层
nnqtdf 发表于 2018-9-4 11:45
可以试试,接收时先写入外部FLASH,接收完成跳转到IAP,从IAP里在拷贝到32的FLASH,拷贝完跳转执行

想过外扩flash,但目前这个设备上没有外部flash,倒是有外部E2。我就是搞不明白他到底是怎么实现边运行边擦写(或者边暂存数据)的
回复

使用道具 举报

4

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1194
金钱
1194
注册时间
2017-8-31
在线时间
295 小时
发表于 2018-9-4 12:02:29 | 显示全部楼层
如果你能外加EEPROM或flash,那直接在APP中接收程序然后一包一包存到EEPROM,接收校验完所有程序再跳转bootloader读取EEPROM再烧到flash就好了,不要强求烧flash的时候也处理APP的东西,你flash完全不够
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 12:10:45 | 显示全部楼层
1608302426 发表于 2018-9-4 10:25
要看代码,有的是只存储部分,比如1k再写flash;或者直接写flash,并不是全部存下来再写flash。

直接写flash了,那原来的程序就该不能正常跑了。但这个设备显示、按键、动作,我在下数据的过程中都试过,都是正常运行的。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 12:12:32 | 显示全部楼层
ktoto2011 发表于 2018-9-4 09:48
边接数据边写flash,不暂存

不暂存不占用RAM空间,但是flash擦了,程序该不能跑了啊,万一最后一包数据错了,整个程序就挂掉了,新的没写成,旧的也擦完了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-4 12:23:00 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-4 12:24 编辑
嘴角的上弦月 发表于 2018-9-4 12:10
直接写flash了,那原来的程序就该不能正常跑了。但这个设备显示、按键、动作,我在下数据的过程中都试过 ...

根据你的描述, 别人一定是分区分模块的更新, 而所有的模块之间的连接指向一向量表, 所以他可以一边更新一边继续工作
比如按键模块在指定的分区, 当更新按键模块的时候, 不会影响到原有的工作, 更新完按键模块, 就更改向量表, 接着一个一个模块的更新。
这完全可以做到一边更新一边正常工作。

回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-4 12:36:47 | 显示全部楼层
例如在falsh有以下的模块按顺序排放

0x0000~0x0122  ABC
0x0123~0x1144  CDE
0x1145~0x12FF  EFG

先更新 EFG模块, 放于0x1300,

0x0000~0x0122  ABC
0x0123~0x1144  CDE
0x1145~0x12FF  EFG
0x1300~.......       newEFG
然后把向量表中的EFG改为newEFG, 这之后原先EFG的模块就可以空出来更祈CDE。。。。
大慨是这个路子吧
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 13:09:06 | 显示全部楼层
edmund1234 发表于 2018-9-4 12:36
例如在falsh有以下的模块按顺序排放

0x0000~0x0122  ABC

flash里面的程序可以分的这么清楚?我擦掉了EFG,保证其它功能不受一点影响?
这个之前倒真没有想过,我以为flash就是浑浑噩噩的一大坨...
不过,stm32 stm8系列,有必要做的这么深奥吗。。。
我感觉有点亚历山大。。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-4 13:18:51 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-4 13:26 编辑
嘴角的上弦月 发表于 2018-9-4 13:09
flash里面的程序可以分的这么清楚?我擦掉了EFG,保证其它功能不受一点影响?
这个之前倒真没有想 ...

这种方法是可以保证功能不受一点影响

说得通俗一点让你更容易明白, 你把一个模块当成一个函数来看, 向量表就是一函数指针的数组, 调用所有函数都是通过这函数数组, 这可以理解了吧

你已经下载并把newEFG写到FALSH,并把向量表原先指向EFG的值改为指向newEFG, 原先的EFG是不会再被任何地方调用, 因为所有调用函数都是通过向量表, 你都把它改了, 谁还能调用原先的EFG了? 这还不明白?


这关系到整个糸统设计, 在开始时没这样的构思,现在改起来风险挺大的呢
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-9-4 13:32:53 | 显示全部楼层
edmund1234 发表于 2018-9-4 13:18
这种方法是可以保证功能不受一点影响

说得通俗一点让你更容易明白, 你把一个模块当成一个函数来看,  ...

那就是说这个升级按钮 其实就是一个重启作用了,串口收到数据就已经更新了。亦或者说是在程序改动不大的前提下,将有变化的函数保存,这样旧程序和新程序都存在,如果点击更新再更新程序,不然没法退回了吧。
回复

使用道具 举报

8

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2018-1-17
在线时间
23 小时
发表于 2018-9-4 13:40:30 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 12:12
不暂存不占用RAM空间,但是flash擦了,程序该不能跑了啊,万一最后一包数据错了,整个程序就挂掉了,新的 ...

是的,错误的话,就重新再下载一次
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-4 13:45:26 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-4 13:56 编辑
wxjhby 发表于 2018-9-4 13:32
那就是说这个升级按钮 其实就是一个重启作用了,串口收到数据就已经更新了。亦或者说是在程序改动不大的 ...
旧的不会存在了, 更新完一个, 旧的函数占的地方就会用来更新别的函数
理论上是可以退回的, 就是复杂了。
这种条件下, 能更新就不错了, 还是别多想别的了, 呵呵
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-4 14:05:17 | 显示全部楼层
其实还有一个可能性, 就是别人的代码根本没这么大(不到32K), 你所认为的几十K是加密后的大小
所以别人可以用最简单的方式更新

其实很多码农写的代码, 随便压20~30%不是什么新鲜事
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 15:05:23 | 显示全部楼层
edmund1234 发表于 2018-9-4 14:05
其实还有一个可能性, 就是别人的代码根本没这么大(不到32K), 你所认为的几十K是加密后的大小
所以别人 ...

刚才去对比了下设备厂家给的2份升级文件,里面不同的数据还是挺多的,基本占了通篇,基本可以排除只更新了少量程序段的想法。看来还是自己道行不深啊,他们这种方法虽然有漏洞(在我点升级按钮下发更新命令后2~3s内,我故意把设备电给断了,然后整个设备就over了,再也无法用串口更程序,只能用仿真器重新烧录程序),但不得不说我还是挺推崇的,毕竟现场不可能就在那节骨眼的2~3s断电。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 15:08:25 | 显示全部楼层
wxjhby 发表于 2018-9-4 13:32
那就是说这个升级按钮 其实就是一个重启作用了,串口收到数据就已经更新了。亦或者说是在程序改动不大的 ...

他们的设备目前就是这样的:串口传输完所有的数据后,会有个弹框,问你要不要更新,如果点击更新,设备2~3s后重新,就是新程序了,如果点击放弃,设备还是运行原来的程序,貌似连重启过的迹象都没有。
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2018-9-5 08:55:38 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 15:08
他们的设备目前就是这样的:串口传输完所有的数据后,会有个弹框,问你要不要更新,如果点击更新,设备2~ ...

弱弱的问一句,是STM32么,代码能否用ST-LINK Utility 读出 .bin文件
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-10 11:12:50 | 显示全部楼层
wxjhby 发表于 2018-9-5 08:55
弱弱的问一句,是STM32么,代码能否用ST-LINK Utility 读出 .bin文件

还可以反编译??没试过,通常都是用KEIL直接下载程序了。他们的芯片是STM32F030。我打算在stm8上试试升级功能。
回复

使用道具 举报

2

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
958
金钱
958
注册时间
2014-11-2
在线时间
370 小时
发表于 2018-9-10 11:59:35 来自手机 | 显示全部楼层
有可能把数据写到lcd未用到的缓存中,升级时读出来就行了
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-10 12:38:08 | 显示全部楼层
别人更新的数据加密了没有?
别人的机在按键确认更新后, 断开usart还能更新么?
违反物理规律的事就别多想了, 别人的机也要跟随这世上的物理规律的


回复

使用道具 举报

3

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2018-9-7
在线时间
22 小时
发表于 2018-9-10 12:53:00 | 显示全部楼层
程序正常运行?是指原代码还在运行吗?这种情况一般只有把代码复制到RAM运行,然后边接收边操作Flash了,不过看到你说RAM没有那么大,那实在想不到还有什么办法了。期待哪个大神解答一下了。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-10 14:34:43 | 显示全部楼层
Page 发表于 2018-9-10 12:53
程序正常运行?是指原代码还在运行吗?这种情况一般只有把代码复制到RAM运行,然后边接收边操作Flash了,不 ...

是的,是原来的代码还在正常运行。我研究了半个月了,也没搞明白到底是怎么实现的
回复

使用道具 举报

3

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2018-9-7
在线时间
22 小时
发表于 2018-9-10 15:38:44 | 显示全部楼层
那只有把Flash当成存储区,把代码放在RAM上运行。030的RAM实在小,估计很难啊!帮你顶上去,看看原子哥或者哪位大神有办法的,也教教我啊。
像屎壳螂一样做人,在粪斗中成长......
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 16:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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