你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

串口升级程序问题

[复制链接]
ikxlf 提问时间:2019-1-26 14:34 /
我现在遇到一个问题就是串口不停的接收数据,然后写进内部flash,用这样的一个过程实现一个简单的bootloader,但是总是有问题,写进flash的数据都出来总是有很多不对的地方,大神有什么好的解决办法没有?我的flash空间只有64K,别让我全部缓存在一次写flash,这种方法就不用说了,也别说让我外扩flash。
收藏 评论10 发布时间:2019-1-26 14:34

举报

10个回答
七哥 回答时间:2019-1-27 00:21:56
这个问题得分步排查吧。
串口收发就不怀疑了;
那么flash到底是写出问题,还是读出的问题,总得验证吧?
还是说串口发送和flash写操作没协调好呢?
串口升级程序,这些都是得定好协议的。串口往下发送时都带着协议头、尾、长度、校验等信息的,一般是串口往下传一批数据,往flash写一批数据;然后下位机告诉上位机,已经写结束了,上位机才再次往下传下一批数据的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

aiherong 回答时间:2019-1-27 01:50:34
数据可以不停地收,FLASH可不能不断地写,否则大大缩短使用寿命,即使你读对了做成产品,售后也是大问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

yklstudent 回答时间:2019-1-27 09:04:04
不停的收,这串口通讯机制不可靠啊
至少确认一包成功了才能进行下一包的发送啊

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

废鱼 回答时间:2019-1-27 09:56:52
需要做数据处理的,验证包数据内容,串口很容易丢失数据的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zhao.zhao 回答时间:2019-1-27 13:38:02
    方案:
1、设计一个BOOT程序,开机30秒(实际等待实间可调)内没有串口升级要求,跳转到应用程序中运行正常程序,串口有升级要求,则进入升级进程;
2、升级程序可以根据MCU的FLASH一个页面多少字节,设计每个串口接收的数据帧相同字节数,再加个帧头帧尾校验等,当串口接收完成一帧数据后,解出实际需要的帧数据字节,这些数据存在SRAM内,一般最多4K字节/页面,然后将SRAM内的数据一次性写入FLASH对应的页面内;完成后对该串口发出应答,告诉上位机,写入完成,准备下一帧数据的传输。以此类推,可以完成串口升级。
3、升级完成后,重启,30秒后,进入升级过的程序。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

yklstudent 回答时间:2019-1-27 16:17:11
zhao.zhao 发表于 2019-1-27 13:38
方案:
1、设计一个BOOT程序,开机30秒(实际等待实间可调)内没有串口升级要求,跳转到应用程序中运行 ...

为什么要搞30秒开机等待升级,有需要就直接进BOOT,无需要就直接进APP啊
Johnson Cao 回答时间:2019-1-27 22:05:00
你看看XModem 协议,这个用在串口上,非常方便.也可靠,协议实现也不难

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zhao.zhao 回答时间:2019-1-28 11:49:47
yklstudent-1794 发表于 2019-1-27 16:17
为什么要搞30秒开机等待升级,有需要就直接进BOOT,无需要就直接进APP啊

1、一般BOOT程序比较小,FlASH中占的空间是有限的,且基本不变,但是应用程序大小可能变化比较大,所以BOOT程序应该放在前面,应用程序放在后面。
2、应用程序中该串口只能用于升级用,不做别的应用时是可以的,如果还有别的应用,又要升级用,那处理就相对比较麻烦了。
ikxlf 回答时间:2019-2-13 15:51:26
zhao.zhao 发表于 2019-1-28 11:49
1、一般BOOT程序比较小,FlASH中占的空间是有限的,且基本不变,但是应用程序大小可能变化比较大,所以BO ...

这样有可能出现一个问题就是当我在接收到一页数据,然后开始写falsh时候,此时如果上位机还在通过串口发升级数据给我,因为正在操作写falsh,所以串口中断无法产生,就会导致丢数问题。除非是写falsh期间告诉上位机,别发数据了,等我写完了你在发,难道只能这样异步进行吗,不可以边接收数据,边写falsh吗?(以上所讲的flash都是内部falsh)
zhao.zhao 回答时间:2019-2-15 16:40:31
斯文人 发表于 2019-2-13 15:51
这样有可能出现一个问题就是当我在接收到一页数据,然后开始写falsh时候,此时如果上位机还在通过串口发 ...

解决这个问题一定要有串口升级协议的,上位机发完一定数量的数据后要等待单片机的应答,然后再发后面的数据,否则的话只能加高速缓存接受完所有数据再写FLASH升级。FLASH写速度比较慢,不能指望一边接收串口数据一边写。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版