简易 bootloader 设计思路

发布于 2020-12-22 12:28:24 字数 1636 浏览 1036 评论 0

作为表计产品,限制于使用环境及产品制造特性(如超声波焊),通常在表计生产完成尤其是送到客户手中后,想要再升级固件程序,如果没有bootloader的支持,难度与代价都很大。因此,为现有平台所有系列的MCU添加bootloader程序是个刚性的需求。最近需要实现V9821的在线升级功能,研究了两天初步有了思路,接下来就是实现了,先记录下初步的思路。

实现 bootloader 的前提条件有:

  • IAP功能
  • 代码区足够大或存在外部flash

对于51单片机,最大支持64Kb的程序代码,其中包括中断向量、启动代码、用户代码、bootloader代码,因此需要合理分配flash空间。对于vango的V98xx系列单片机。

Flash存储器的008000h--01FFFFh的内容根据代码段选择寄存器 CBANK,SFR 0xA0 的配置,以32KB为单位,选择行的映射到程序存储器 0x8000-0xFFFF 区域。其中 common area 为公共代码区,使用时不需要切换 Code Bank,默认代码段为 Bank1

使用时刻根据实际情况考虑是否使用 bank switch 技术,因为我用于验证的用户代码不大,加上bootloader程序也远达不到64Kb的代码量,因此不分bank

Flash 存储器空间分配

  • 0x0000-0x03FF: 中断向量表
  • 0x0400-0x05FF: 512字节的出厂参数,单片机正常工作所必须的参数,不用于用户代码。
  • 0x0600-0xD5FF: 用户代码
  • 0xD600-0xD7FF: 中断映射代码
  • 0xD800-0xD8FF: 启动代码
  • 0xD900-0xFFFF: bootloader代码

其中启动代码、bootloader 均位于不可IAP区。0x000-0x03FF为不可IAP区域,硬件不支持

软件设计思路

  1. 上电复位:执行startup,跳转到bootloader代码;
  2. 在bootloader中首先检查升级指令是否存在[1],如果不存在跳转到用户代码,反之执行升级 。
  3. 用户代码中也可被升级指令切换至bootloader程序;
  4. 等待数据(等待时长可设),超时复位到用户代码;
  5. 接收升级数据并校验[2]
  6. 写入update[3]
  7. 全部接收完成并校验通过,擦除用户代码,写入升级数据[4]

note

  1. 可使用xdata区的固定位置的全局变量或者相关IO标志。
  2. 使用hex文件格式的校验方式:校验和 = 0x100 - 累加和
  3. 如果代码不超过32KB,直接写入update区。如果超过32KB,使用外部存储或者直接擦除用户代码,写入升级数据。
  4. 写入的时候以16个字节为一组写入。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84935 人气
更多

推荐作者

遥远的她

文章 0 评论 0

情深如许

文章 0 评论 0

18120987591

文章 0 评论 0

女皇必胜

文章 0 评论 0

13002228876

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。