OpenEdv-开源电子网

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

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

[复制链接]

25

主题

138

帖子

0

精华

高级会员

Rank: 4

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

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

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

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

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-3 16:17:51 | 显示全部楼层
把接收数据及写到flash的程式抄到RAM去运行
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-3 16:40:57 | 显示全部楼层
edmund1234 发表于 2018-9-3 16:17
把接收数据及写到flash的程式抄到RAM去运行

可以把你的想法再分步骤描述一下吗?谢谢
没有脑袋
回复

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-7-24
在线时间
21 小时
发表于 2018-9-3 16:48:18 | 显示全部楼层
只能外挂flash了。或者写一段bootloda,在开机前几秒进入升级模式,这样也可以。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-3 16:49:42 | 显示全部楼层
美丽的时光机器 发表于 2018-9-3 16:40
可以把你的想法再分步骤描述一下吗?谢谢

这还不清楚? 我不知道你的疑问在哪? 范围太广不好猜, 呵呵
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-3 16:54:27 | 显示全部楼层
edmund1234 发表于 2018-9-3 16:49
这还不清楚? 我不知道你的疑问在哪? 范围太广不好猜, 呵呵

我对这个需求完全没任何思路。。。
没有脑袋
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-3 17:01:42 | 显示全部楼层
美丽的时光机器 发表于 2018-9-3 16:54
我对这个需求完全没任何思路。。。

当你确定了要升级后, 是不是最少有四个任务?

一) 通过USART接收数据到RAM
二) 查错
三) 烧录到Flash
四) 是否完毕, 否则重复一至四
五)打开看门狗, 等待复位

把它们全都拷到RAM去执行, 这懂么?
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-3 17:28:46 | 显示全部楼层
edmund1234 发表于 2018-9-3 17:01
当你确定了要升级后, 是不是最少有四个任务?

一) 通过USART接收数据到RAM

第3步:烧录是需要该启动文件吗?
还有第2步:查错是判断是否接收完整吗?
没有脑袋
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-3 17:45:03 | 显示全部楼层
美丽的时光机器 发表于 2018-9-3 17:28
第3步:烧录是需要该启动文件吗?
还有第2步:查错是判断是否接收完整吗?

第三步, 不需要, 打开StdPeriph_Driver, 找flash.c 看看里面的内容, 就该知道怎样烧录(重写)falsh
第二步, 任何通信接收到的数据都可能会出错, 所以必定会有查错(校验)的方式, 简单如CheckSum, 复杂如CRC。。。。。等等

你的RAM是不可能一次过把整段更新代码都收下来, 所以要分段收, 然后写到Falsh, 之后再收二段。。。。。。
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-3 17:45:08 | 显示全部楼层
老哥..  bootloader了解一下...
猪猪熊呢?
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-9-3 17:49:24 | 显示全部楼层
edmund1234 发表于 2018-9-3 17:45
第三步, 不需要, 打开StdPeriph_Driver, 找flash.c 看看里面的内容, 就该知道怎样烧录(重写)falsh
...

好的 谢谢
没有脑袋
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-9-3 18:12:07 | 显示全部楼层
edmund1234 发表于 2018-9-3 17:45
第三步, 不需要, 打开StdPeriph_Driver, 找flash.c 看看里面的内容, 就该知道怎样烧录(重写)falsh
...

一次过,活抓一个广东银
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13086
金钱
13086
注册时间
2012-11-26
在线时间
3809 小时
发表于 2018-9-3 18:58:44 | 显示全部楼层
BootLoader+APP1+APP2可以实现你的需求

BootLoader不多讲了,常见的说法
APP1是你正常的程序
APP2是你需要升级的程序
两个APP的好处是当升级失败了,还可以把正常的程序拷贝回去
学无止境
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 08:54:56 | 显示全部楼层
edmund1234 发表于 2018-9-3 16:17
把接收数据及写到flash的程式抄到RAM去运行

放在RAM中运行,在我接收数据的这段过程中,我程序的所有功能都还能正常运行吗?50多k的程序量,RAM有这么大空间吗?
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:02:03 | 显示全部楼层
jermy_z 发表于 2018-9-3 18:58
BootLoader+APP1+APP2可以实现你的需求

BootLoader不多讲了,常见的说法

那你首先要保证你的flash空间能放下至少2个APP。。。
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:03:46 | 显示全部楼层
edmund1234 发表于 2018-9-3 17:45
第三步, 不需要, 打开StdPeriph_Driver, 找flash.c 看看里面的内容, 就该知道怎样烧录(重写)falsh
...

你这RAM中执行的程序,串口接收、写flash这些操作还可以,但要让我以前的程序依然正常运行,这RAM空间够用吗?
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:06:14 | 显示全部楼层
323232 发表于 2018-9-3 17:45
老哥..  bootloader了解一下...

正在了解,但是这设备的表象不像BootLoader啊,在BootLoader中不止接收数据、写flash操作、还要保留设备的其它所有功能,那代码量就大了啊,flash根本不够用啊
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13086
金钱
13086
注册时间
2012-11-26
在线时间
3809 小时
发表于 2018-9-4 09:06:44 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 09:02
那你首先要保证你的flash空间能放下至少2个APP。。。

外部flash了解下?
学无止境
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:09:57 | 显示全部楼层
xiaomodao 发表于 2018-9-3 16:48
只能外挂flash了。或者写一段bootloda,在开机前几秒进入升级模式,这样也可以。

我现在的思路就是BootLoader,硬件已成型,没有外扩flash,但是我的BootLoader无法实现像这货这样,一边接收数据还一边正常跑其它所有功能
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:12:05 | 显示全部楼层
jermy_z 发表于 2018-9-4 09:06
外部flash了解下?

硬件不允许了现在
回复

使用道具 举报

25

主题

138

帖子

0

精华

高级会员

Rank: 4

积分
612
金钱
612
注册时间
2016-6-7
在线时间
59 小时
 楼主| 发表于 2018-9-4 09:14:06 | 显示全部楼层
jermy_z 发表于 2018-9-4 09:06
外部flash了解下?

还有关于BootLoader和APP程序中断问题,是不是2个工程中只能有一个用中断?我看有需要中断向量表迁移的,这一块还不太明白
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-9-4 09:25:51 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 09:14
还有关于BootLoader和APP程序中断问题,是不是2个工程中只能有一个用中断?我看有需要中断向量表迁移的, ...

是不是只有升级的时候用串口?
猪猪熊呢?
回复

使用道具 举报

62

主题

903

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3565
金钱
3565
注册时间
2016-1-8
在线时间
543 小时
发表于 2018-9-4 09:29:47 | 显示全部楼层
64K,就别想在线升级了
回复

使用道具 举报

0

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-7-24
在线时间
21 小时
发表于 2018-9-4 10:38:34 | 显示全部楼层
嘴角的上弦月 发表于 2018-9-4 09:09
我现在的思路就是BootLoader,硬件已成型,没有外扩flash,但是我的BootLoader无法实现像这货这样,一边 ...

那肯定不行了。你这种情况只能boot loader+APP形式。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-11-4
在线时间
0 小时
发表于 2019-11-4 00:25:06 来自手机 | 显示全部楼层
外扩一个大的RAM或者flash.读数据就存在缓存里,因为缓存有限,所以一次接收数据不能太多,接收一段也就是一包,要存储在外扩RAMflash中,再接收下一个包。此时因为存储处理外扩需要时间,就不能连续接收。每个包发送直接应该有时间间隔,给接收时间。然后几百个都接收存储好了,有个结束标志。这样升级程序就都保存在外部了。然后设备重启,此时判断是否需要更新升级程序?这个程序就是叫bootloader.如果需要,就从外部flash读进stm然后再重启。再次判断,如果不需要升级了。就直接运行程序。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2020-7-1
在线时间
11 小时
发表于 2020-8-19 14:29:26 | 显示全部楼层
老哥,研究出来了吗
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-5-3
在线时间
13 小时
发表于 2020-9-7 16:39:59 | 显示全部楼层
持续关注中
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-9-9 17:39:27 | 显示全部楼层
一点升级,设备重启.那当然是进入了BOOT LOADER 下载程序了.
当程序在BOOT LOADER状态下,应该是只能升级.不能完成以前的APP 的功能.
点击升级时,只不过发送了一个重启命令罢了.
回复

使用道具 举报

2

主题

458

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4464
金钱
4464
注册时间
2018-5-14
在线时间
957 小时
发表于 2020-9-9 19:37:47 | 显示全部楼层
首先,Bootloader就被限制在了10K,肯定是要编译出来越小越好。那么剩余54K也就勉强够你升级。如果要正常运行肯定不能了,最好的办法就是先进BootLoader然后再传文件,而且是保证不能出错的那种,出错了就没办法正常启动了,得重新传一遍。主要是资源真不够用,资源够用可以三段式程序了,BootLoader检查最新的是2还是3,然后再跳转。2可以写3,3可以写2
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 10:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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