MicroPython 十六进制文件

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

使用的一般内存布局是:

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

笔记

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

UICR 格式(micro:bit V1)

用户信息配置寄存器 (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

布局表(micro:bit V2)

为 micro:bit V2 构建 MicroPython 时,闪存布局表会附加到 hex 文件。

布局表是一个 16 字节条目的序列。最后一个条目包含标题(包括幻数)并与页面末尾对齐,这样布局表的最后一个字节就是它所在页面的最后一个字节。这样可以快速轻松地搜索为了。

布局表具有以下格式。所有整数值都是无符号的并存储小端。

0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0a  0x0b  0x0c  0x0d  0x0e

ID    HT    REG_PAGE    REG_LEN                 HASH_DATA
(additional regions)
...
MAGIC1                  VERSION     TABLE_LEN   NUM_REG     PSIZE_LOG2  MAGIC2

The values are:

ID         - 1 byte  - region id for this entry, defined by the region
HT         - 1 byte  - hash type of the region hash data
REG_PAGE   - 2 bytes - starting page number of the region
REG_LEN    - 4 bytes - length in bytes of the region
HASH_DATA  - 8 bytes - data for the hash of this region
                       HT=0: hash data is empty
                       HT=1: hash data contains 8 bytes of verbatim data
                       HT=2: hash data contains a 4-byte pointer to a string

MAGIC1     - 4 bytes - 0x597F30FE
VERSION    - 2 bytes - table version (currently 1)
TABLE_LEN  - 2 bytes - length in bytes of the table excluding this header row
NUM_REG    - 2 bytes - number of regions
PSIZE_LOG2 - 2 bytes - native page size of the flash, log-2
MAGIC2     - 4 bytes - 0xC1B1D79D

此布局表用于将 MicroPython 的版本和当前内存布局传达给蓝牙客户端,并启用部分刷新 (仅更新 Python 脚本,并将 MicroPython 的现有版本保留在闪存中)。

创建firmware.hex 文件的步骤

micro:bit V1

这适用于 micro:bit V1 的 MicroPython,其来源可以在这里找到:bbcmicrobit/micropython.

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

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

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

micro:bit V2

这适用于 micro:bit V2 的 MicroPython,其来源可以在这里找到:microbit-foundation/micropython-microbit-v2.

这是 MicroPython 到 micro:bit 的一个端口,它使用 CODAL 作为底层目标平台。

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

  • 创建构建输出目录,运行 cmake,并确保代码库存在(通过 cmake)
  • 构建 libmicropython.a (来自 中的源代码src/codal_port/)和 CODAL 应用程序(来自 中的源代码src/codal_app/)。
  • 运行 addlayouttable.py 以将布局表添加到 .hex 文件中
  • MICROBIT.hexsrc/目录中创建 microbit-micropython 固件,可以将其复制到 micro:bit。

包括用户脚本

本节适用于 micro:bit V1 和 V2。

用户脚本存储在 MicroPython 文件系统中,如果main.py 存在脚本,它会在 MicroPython 启动时运行。还可以从 main.py 文件或 REPL 中包含和执行其他 Python 脚本。

Python编辑器 使用 microbit-fs创建文件系统,它包括在HEX文件。Python 编辑器必须将文件系统添加到 MicroPython V1 和 V2 的 HEX 文件中,然后将两者组合成一个通用 HEX 文件,以确保与两种硬件变体兼容。

附加脚本格式(已弃用)

这种将脚本附加到 MicroPython 末尾的方法最初用于 micro:bit V1,但不再使用。Python 文件现在存储在 文件系统中并且 main.py 是程序入口点。

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

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