打印

还是CAN Bootloader问题,关于烧录文件解析细节

[复制链接]
2867|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hzocce|  楼主 | 2018-4-11 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hzocce 于 2018-4-11 17:21 编辑

上次提问中,感谢 xuyaqi  linqing171  ningling_21  WoodData 4位大哥的指点,已经差不多了解了!

现在还碰到问题就是,用Keil编译好的文件是HEX文件。而HEX文件中数据还需要解析,说明如下:

如:
:07069900C101010901C100CC
意思是:7个字节长度,起始位置是0x0699位置开始存放,数据类型为00,数据分别是 C1 01 01 09 01 C1 00

而当我用串口工具发送这次HEX文件,串口实际发的数据如下:
3A 30 37 30 36 39 39 30 30 43 31 30 31 30 31 30 39 30 31 43 31 30 30 43 43 0D 0A
用USB-CAN工具,通过CAN-TEST观察到的数据也是如上。

1.到底发的是啥数据?难道还要HEX--ASCII转换???

2.因为CAN一次只能发8个数据,而且HEX文件中,数据有长有短,看似乎比较难做处理,怎么弄?

3.而且是不是还要去深究HEX中的数据类型?

4.同时也要计算检验数据是否正确来判断数据是否对错?因为HEX文件本身有校验字节。

5.如何将这个不同长度的数据分成8个字节的一个包?

6.数据更新的时候,因为HEX文件的地址看似乎很凌乱,而FLASH都是一个页的擦除,是不是全部擦除一遍后,跟据HEX随便写就好了?

7.      A 还是擦一个页写一个页?                       B.    又从哪里擦起呢?

8.因为FLASH只能整个擦除,一个Page写完后,是不是还要将数据读回来?跟原来的数据对比一下?

9.还是其他的数据比对方法?

相关帖子

沙发
hzocce|  楼主 | 2018-4-11 16:39 | 只看该作者
BIN文件的话,听说没有地址信息,如何知道写哪里去?

使用特权

评论回复
板凳
hzocce|  楼主 | 2018-4-12 08:07 | 只看该作者
别沉下去了!

使用特权

评论回复
地板
ayb_ice| | 2018-4-12 11:06 | 只看该作者
boot一般是下载BIN文件,这需要转换,需要填充,地址一般是固定的或者指定首地址

使用特权

评论回复
5
hzocce|  楼主 | 2018-4-12 17:24 | 只看该作者
对,浮起来,高手才看得到!

使用特权

评论回复
6
Prry| | 2018-4-13 08:47 | 只看该作者
1、hex带地址,boot升级,不要用hex,用bin文件;
2、用bin文件,每次发生8字节,直至发送完;
3、有时间、有精力可以慢慢研究;
4、最好有;
5、数据不管多大,都是一个字节一个字节组成,怎么读的,下位机就怎么合成;
6、写一个页前先擦除;(本人的做法)
7、从新一页的首地址开始擦除,检查是不是新页首地址即可;
8、目前这样的是最直接的办法,虽然有点笨。

另外:bin文件虽然没有地址,但上位机可以记录地址啊,或者每发一帧,可以带上地址。而且bin文件就是烧录到flash的文件,不需解析,直接从指定地址开始,一直写进去即可。

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
山东电子小菜鸟 + 10 很给力!
7
m564522634| | 2018-4-13 16:33 | 只看该作者
你转成bin 文件发送就可以了你要hex 文件做什么,文件又大,还要解析了,烧录的地址你自己单片机的boot 自己设置了。

使用特权

评论回复
8
hzocce|  楼主 | 2018-4-14 09:30 | 只看该作者
Prry 发表于 2018-4-13 08:47
1、hex带地址,boot升级,不要用hex,用bin文件;
2、用bin文件,每次发生8字节,直至发送完;
3、有时间、 ...

1. HEX文件中,地址是凌乱的,一会高一点的地址,一会低一点的地址;
    当用工具把他转成BIN文件时候,就是从低地址排序到高地址么?

2. HEX文件当中,似乎还有缺的地址,应该不是每个地方都存有数据,是不是转成Bin的时候,对应未使用的区   域,也就是说,从低地址到使用的最高地址中间的某个地址区域,是不是自动用0xFF去覆盖?

3.  如果是从低地址排序到高地址排列的话,只需要知道低地址就够了,对么?然后地址就增加 1  ?

4.  擦除一次是512个Byte,是不是计算到写了512个Byte之后,又等擦除下一个地址,然后再把接收的数据往这里写? 这样的话,单片机跟上位机之间是不是还有一个等待的时间,等擦除完了,再通知上位机发数据过来???

使用特权

评论回复
9
Prry| | 2018-4-14 18:53 | 只看该作者
1、hex文件有类似加密的范畴,所以乱是正常;bin文件当然是从地址开始顺序存放,顺序读出写入即可;
2、不要用hex文件!!!keil设置下编译生成bin文件;
3、是的,比如从0x80000300开始为app,从此地址开始写入即可;
4、每次写到页首地址即擦除;两种方式:1)下位机接收到一帧,等待写完(写前先擦除)返回,然后上位机再发下一帧;2)立即返回,下位机开一个FIFO缓存,接收上位机的数据,下位机从FIFO中读出数据写入flash;前者比较易理解和实现,后者效率比较高。

使用特权

评论回复
10
风凌天| | 2019-11-22 19:56 | 只看该作者
我想问一下,上位机是直接将bin文件发送到MCU中吗?,要不要在发送之前做处理。因为CAN只能发8个字节,还是说MCU会自动识别。我现在也是在做CAN Bootloader与应用程序之间的小项目。

使用特权

评论回复
11
yklstudent| | 2019-11-23 10:01 | 只看该作者
风凌天 发表于 2019-11-22 19:56
我想问一下,上位机是直接将bin文件发送到MCU中吗?,要不要在发送之前做处理。因为CAN只能发8个字节,还是 ...

分包,一次8个字节,

使用特权

评论回复
12
风凌天| | 2019-11-28 14:09 | 只看该作者
yklstudent 发表于 2019-11-23 10:01
分包,一次8个字节,

我在上位机软件(CANTest)中设置了一帧一帧的发送,但是出现了“文件发送失败”的警告。这是怎么回事呢

使用特权

评论回复
13
yklstudent| | 2019-12-9 21:14 | 只看该作者
风凌天 发表于 2019-11-28 14:09
我在上位机软件(CANTest)中设置了一帧一帧的发送,但是出现了“文件发送失败”的警告。这是怎么回事呢 ...

你一直TX->TX->TX,没有考虑对方应答OK后再传?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

561

帖子

4

粉丝