固件十六进制文件

构建 MicroPython 时,编译器会生成一个包含 MicroPython 固件的 Intel Hex 文件。然后可以将其他数据添加到此文件中,以包含有关 MicroPython 版本或要在启动时执行的 Python 代码的信息。

使用的一般内存布局是:

  • 0x00000000:MicroPython 固件启动 - 高达 248 KB
  • 0x0003e000: 附加脚本的开始(可选) - 最多 8 Kbs
  • 0x100010c0: UICR 客户[16] 注册,MicroPython 信息的开始 - 28 字节

笔记

如果您追加任何数据或修改 Intel Hex 文件,请确保数据存储的地址按递增顺序进行。如果有地址向后跳转,DAPLink 将无法刷新文件。

附加脚本格式

MicroPython 检查地址处的前 2 个字节0x0003e000 是否有魔法字符串,以指示是否有附加脚本。如果找到魔法字符串,它将自动执行存储在那里的 Python 代码,除非 MicroPython 文件系统中存储有 main.py 文件。

  • 0x0003e000: 2 字节“MP”
  • 0x0003e002: 2字节,附加脚本的长度(以字节为单位)的小端整数(不包括这个 4 字节的标头)
  • 0x0003e004: 以字节形式存储的脚本,供 MicroPython 使用 utf-8 解码。

UICR格式

用户信息配置寄存器 (UICR) 是可用于存储用户特定设置的非易失性存储器区域。前 128 字节是保留的,但我们可以使用其他 128 字节来存储任意数据。

MicroPython 从 UICR 客户 [16] 寄存器开始以小端存储以下信息:

  • 0x100010c0: 具有魔法值的 4 字节整数 0x17eeb07c
  • 0x100010c4: 带值的 4 字节整数 0xffffffff
  • 0x100010c8: 带值的 4 字节整数 0x0000000a (闪存页面大小的日志基数为 2,为 1024 字节)
  • 0x100010ca: 带值的 2 字节整数0x0000(固件的起始页)
  • 0x100010cc:2 字节整数存储固件使用的页数
  • 0x100010d0: 带值的 4 字节整数0xffffffff
  • 0x100010d4: 4 字节整数,版本字符串在固件中的地址
  • 0x100010d8: 带值的 4 字节整数0x00000000

创建firmware.hex 文件的步骤

yotta 工具用于构建 MicroPython,但在此之前,Makefile 必须生成额外的文件以准备构建,然后将额外的数据添加到 hex 文件中。

运行命令执行以下步骤: make all

  • tools/makeversionhdr.py 脚本 microbitversion.h使用包含构建信息的宏创建文件
  • Yotta 构建源代码并使用固件创建一个裸十六进制文件
  • tools/adduicr.py脚本将 UICR 添加到裸十六进制
  • 最终的十六进制文件放在 build/firmware.hex
  • 用户可以选择使用tools/makecombinedhex.py(或其他工具)附加脚本