名人堂再聚首 2023-03-15 10:32 采纳率: 76.5%
浏览 61
已结题

使用外部Flash进行固件升级

大家好!

我现在要做个软件升级程序,升级的大概流程是这样的:
1、上位机通过RS485发送Hex文件到单片机,单片机需要将这些内容保存在外部Flash存储器中,比如MX25L1605D;
2、接收完文件并校验后根据上位机的指令,重启,擦除旧程序,从外部Flash读取Hex的内容并写入到程序存储器ROM中;
3、程序更新成功则运行新程序,否则仍然运行旧程序(保存在外部Flash中);

因为受内存及ROM的限制,不能使用文件系统,有如下问题要请教下:
1、上位机发送HEX文件时,是按照hex文件的原格式发送吗?比如:一个hex文件的一行是这样的:
:10751E00A019D8A4120056EC2FF0000E0101A06F96,16个数据,起始地址是:0x751E,类型是数据,校验是:0x96,请问上位机在发送时是直接发送这些16进制吗(包括地址)?这个冒号不用发送吧?

2、上位机在发送hex文件时是一次发送一行hex文件内容好还是一次发送固定长度的字节呢?

3、单片机在保存上位机发送来的数据时以什么样的方式保存在外部Flash中比较好呢?每一行的hex内容如何和其他行的区别开来呢?就是在从外部Flash读取hex文件的内容时如何知道哪些数据写入到ROM的哪个区域及数据长度?

在此先谢谢大家了!

  • 写回答

3条回答 默认 最新

  • 少林and叔叔 2023-03-15 11:25
    关注

    针对以上问题:建议你把hex文件转换为bin文件。
    1.bin文件不需要解析,上位机直接读取bin文件的内容,直接发送给单片机。
    2.上位机发送bin文件给单片,最好发送固定长度的字节数据,每次发送自定义帧格式,防止数据出错;
    3.单片机RAM空间不知道有多大,建议先把bin文件放在RAM中,等bin文件收完再写入到flash中。flash一般是按page写入,写入之前还需要先擦除。
    要实现2个镜像文件的启动,还需要修改二次bootloader,比较复杂的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • qllaoda 2023-03-15 11:32
    关注

    不建议直接传hex,
    1,是因为hex文件本身是文本方式表示,通常是bin文件的2倍以上,传输效率低
    2,直接传原始文件,会造成固件泄密
    建议:
    1,转成bin文件,并且加密
    2,在bin文件里加上一个文件头,里面包含程序的相关信息,比如长度,校验,版本,适用硬件类型等。建议这个文件头也写入到单片机里,便于启动时候检查。
    3,可以在ram里开辟一个写入缓冲区,每次来的数据先放到缓冲区,满一个页后,就写入一页,剩余不足一页的继续留在里面等后续数据。收到最后一帧数据后则直接写入。
    4,如果是串口可以考虑用xmodem或ymodem之类的标准协议传输,如果是其他的,就自己定义吧,其实很多通讯接口都比串口方便,比如USB, wifi,蓝牙

    评论 编辑记录
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-16 13:56
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 QT 实现 RSTP 语音对讲功能
  • ¥50 AES魔改之后的安全性关于PRF(相关搜索:密码学)
  • ¥15 有没有谁能高分通过 reCaptcha v3验证,国外网站。有兴趣留言,有偿。
  • ¥15 用C语言写的一个程序遇到了两个问题第一是偏移正确但读取不到坐标,第二个问题是自己定义的函数实现不了获取指定进程模块。
  • ¥15 在安装Anaconda时总是闪退怎么办?
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥15 对图中电路进行以下几个方面的分析
  • ¥500 抖音主页视频预存加载卡bug