OpenEdv-开源电子网

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

求助:BOOTLOADER升级程序

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-11-10
在线时间
12 小时
发表于 3 天前 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 langbaiyue 于 2025-2-20 12:41 编辑

求助各位高手,BOOTLOADER升级程序遇到问题,方案是服务器下行BIN文件,设备收到文件后开始存储到24c512中,请问:问题1 : 下行了500个字符,我存储到24c512中,是每个地址存放两个字符吗?

问题2 :在BOOTLOADER程序中,我判断到有升级包,往stm32f103rct6里写的时候,需要特殊处理吗?还是直接从24c512里读取之后,直接用库函数写进去,然后重启设备就行?

以上均不考虑校验的问题

谢谢

现在遇到的现象是能写进去,但是重启之后在bootloader程序里,跳转不进APP!


真是太感谢“电脑小白”达人的指点!谢谢!

最佳答案

查看完整内容[请看2#楼]

首先:接受bin文件按照字节来接收,不能按照字符。就是16进制的方式接收,保存也要是16进制的方式保存到24C512里也是要16进制。 接收完毕后要最crc16或者crc32校验,就是服务器下发完成bin文件后要再发一个校验码CRC校验或者简单的和校验等,比如这样的格式:FE1A 这是两个字节,当然四个字节也可以,就是FE1A BE2C
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 3 天前 | 显示全部楼层
首先:接受bin文件按照字节来接收,不能按照字符。就是16进制的方式接收,保存也要是16进制的方式保存到24C512里也是要16进制。
接收完毕后要最crc16或者crc32校验,就是服务器下发完成bin文件后要再发一个校验码CRC校验或者简单的和校验等,比如这样的格式:FE1A  这是两个字节,当然四个字节也可以,就是FE1A BE2C
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12974
金钱
12974
注册时间
2012-11-26
在线时间
3786 小时
发表于 前天 10:06 | 显示全部楼层
1、24C512才有512/8=64k的空间吧    够你用的吗?
2、EEPROM读写速度那么鬼扯,用来在线升级,让你蛋疼

3、1个地址1字节数据
4、你自己搞明白在线升级流程和方案,再弄吧,第一次见过用EEPROM存升级数据的
学无止境
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 10:14 | 显示全部楼层
接收完“校验和”或者“CRC16”校验码并保存后。最后再保存一个接收完成标志位。比如特殊地址写 0xAB。最后APP重启。当然接收数据是在APP下完成。
第一次进bootloader时读取24C512的特定地址,等于0xAB就清空这个地址,使它=0x00(不是0XAB只清空)然后 开始从24C512里逐个字节读出(当然你逐个4字节读出也可以,就看你和服务器共用的算法了),然后进行和运算(也可以CRC16运算),最后和校验数据0xFE1ABE2C进行对比,相等就开始逐个再次读取并开始写入APP区,写入完成再重启(因为标志位0XAB被清除,所以会直接启动新APP)。不相等。不写入直接去跳转APP里运行。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 10:21 | 显示全部楼层
上面说的还是有一个漏洞。就是写入APP后有异常。无法退版本。
我之前是这样做的。分三个部分。第一部分是bootloader,第二部分是APP0,第三部分是APP1。
升级的时候,bootloader先把APP1清空,再把APP0复制到APP1,然后清空APP0,再把bin文件写入到APP0中。最后再跳转到APP0中运行。
想要退版本,就是在bootloader中把APP0清空,再把上个版本的APP1写回APP0中去。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 10:32 | 显示全部楼层
当然你这种,不用考虑退版本的话。就只有bootloader和APP0,不会再分一个APP1了。这样也节省空间。app也可以写的代码多一些。
服务器算法是这样的:读取bin文件,是逐个4四字节计算校验和(或者CRC16)生成一个校验码。发送给下位机的时候是4字节逐个发送,最后再有一个发送结束命令和特殊的命令发一个校验码。
当然握手开始发送也是有一个指令协议的。
每一条通信指令都是有校验的。比如:
02 0a xx  xx  dd dd dd dd  crc 03     02 是报文开始  03是报文结束 0a是这条指令总字节数。最前面两个 xx xx 范围是00 00 -- FF FF  后面4个dd是你的数据。
当然你也可以定义长一些 比如  dd为16个。一次发16个字节
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 10:36 | 显示全部楼层
xx xx是逐行递增的。比如:
02 0a 00  00  dd dd dd dd  crc 03
02 0a 00  01  dd dd dd dd  crc 03
……
02 0a FF FF  dd dd dd dd  crc 03
02 0a 00 00  dd dd dd dd  crc 03
02 0a 00 01  dd dd dd dd  crc 03
……

这些协议你和做服务器的人一起商量来定义。

也可以考虑用ymode或者Xmode标准协议。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 10:42 | 显示全部楼层
最后你说的“重启之后在bootloader程序里,跳转不进APP!”---这个你要连接jlink等工具读出固件。对比数据。
还有bootloader里最好不开中断,开了的话,跳转前要关闭。

最最最后就是要中断表映射,这个我就不再赘述了。就是:SCB->VTOR = FLASH_BASE | 0x4000; //中断向量表偏移
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-11-10
在线时间
12 小时
 楼主| 发表于 前天 11:27 | 显示全部楼层
电脑小白 发表于 2025-2-20 10:42
最后你说的“重启之后在bootloader程序里,跳转不进APP!”---这个你要连接jlink等工具读出固件。对比数据 ...

感谢,终端映射还是还得,希望您帮确认一下:是不是我接收到BIN文件,转成16进制存入24C512,然后读出来写入FLASH对应的区域,就可以了?谢谢
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 11:33 | 显示全部楼层
langbaiyue 发表于 2025-2-20 11:27
感谢,终端映射还是还得,希望您帮确认一下:是不是我接收到BIN文件,转成16进制存入24C512,然后读出来 ...

是这个意思。但是吧,你自己捣鼓研究着玩可以这么干。做项目不行。24C512确实速度慢。你要考虑用高速的存储比较好。自己捣鼓就无所谓了,速度慢也没什么。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 前天 11:36 | 显示全部楼层
本帖最后由 电脑小白 于 2025-2-20 11:37 编辑

System.IO.FileStream fs = new System.IO.FileStream(this.textBox.Text, System.IO.FileMode.Open);
System.IO.BinaryReader read = new System.IO.BinaryReader(fs);byte[] _buff = read.ReadBytes(100);

我这里打开的就是bin文件 直接就可以读出来16进制的。不用转换。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-11-10
在线时间
12 小时
 楼主| 发表于 前天 11:44 | 显示全部楼层
jermy_z 发表于 2025-2-20 10:06
1、24C512才有512/8=64k的空间吧    够你用的吗?
2、EEPROM读写速度那么鬼扯,用来在线升级,让你蛋疼

...

感谢您的指点
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-11-10
在线时间
12 小时
 楼主| 发表于 前天 11:46 | 显示全部楼层
电脑小白 发表于 2025-2-20 10:05
首先:接受bin文件按照字节来接收,不能按照字符。就是16进制的方式接收,保存也要是16进制的方式保存到24C ...

感谢您的回复,给其它厂家做匹配,没有下行校验
回复

使用道具 举报

70

主题

6756

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12974
金钱
12974
注册时间
2012-11-26
在线时间
3786 小时
发表于 前天 14:45 | 显示全部楼层
langbaiyue 发表于 2025-2-20 11:46
感谢您的回复,给其它厂家做匹配,没有下行校验

我觉得你现在需要做的事情是:
1、测试写入EEPROM的数据是不是bin文件原始数据,这个可以写完整体读出来比对
2、测试写入单片机FLASH的数据是不是bin文件原始数据,这个可以用j-flash读出来比对
3、如果上述两个数据都没问题,就要看keil工程的偏移量和向量表有没有设置正确
4、如果上述三个都没问题,就要看bootloader的跳跃地址是不是跟app的偏移最终地址设置的一样
学无止境
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2020-11-10
在线时间
12 小时
 楼主| 发表于 前天 14:46 | 显示全部楼层
jermy_z 发表于 2025-2-20 14:45
我觉得你现在需要做的事情是:
1、测试写入EEPROM的数据是不是bin文件原始数据,这个可以写完整体读出来 ...

谢谢指导
回复

使用道具 举报

46

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1122
金钱
1122
注册时间
2016-3-25
在线时间
364 小时
发表于 昨天 08:47 | 显示全部楼层
电脑小白 发表于 2025-2-19 13:57
首先:接受bin文件按照字节来接收,不能按照字符。就是16进制的方式接收,保存也要是16进制的方式保存到24C ...

"接受bin文件按照字节来接收,不能按照字符"要看协议,发送方如果把他转为HEX字符串发送,接收方接收后把字符转HEX也是可行的,我见过他们用CJSON格式发送就是这样干的。
代写STM32各类驱动,DEMO程序
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-22 02:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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