WeAct BlackPill 跑 CircuitPython 使用自选外部 Flash

 · 2 分钟

动机

就是想用便宜的Flash。另外之前在CircuitPython 6.x时代也修改过了,但是之前买的拆机 Flash 质量实在太差,当U盘很不稳,不得已从库存的新Flash中挑了一片 MX25L6406EM2I才发现某创商城搞活动时卖的 Flash 是停产/EOL产品。

修改

这个很容易,关键是要知道修改哪里。在CPY 6.x时代,所有的Flash配置都在一个个 结构体中(存疑,可能记错了),驱动大部分是可以通用的。而在CPY 7.x时代,所有的Flash 都有一个自己的 toml 配置文件,定义了其中的各个参数。

准备一份源码。

git clone https://github.com/adafruit/circuitpython.git
cd circuitpython
make fetch-submodule

CPY 7.x的Flash配置文件在 data/nvm.toml 子模块下。以我的Flash为例,依葫芦 (MX25L1606MX25L3206E)画瓢,新建 data/nvm.toml/flash/macronix/MX25L6406E.toml。另外我严重怀疑 MX25L1606 的最 大时钟频率配置错了,少了个0。

# Settings for the Macronix MX25L6406E 8MiB SPI flash.
# Datasheet: https://www.macronix.com/Lists/Datasheet/Attachments/8630/MX25L6406E,%203V,%2064Mb,%20v1.9.pdf
total_size = 0x800000 # 8 MiB
start_up_time_us = 5000
manufacturer_id = 0xc2
memory_type = 0x20
capacity = 0x17
max_clock_speed_mhz = 80
quad_enable_bit_mask = 0x40
has_sector_protection = false

然后修改对应板子的配置文件。

diff --git a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk
index 9da716374..bf048775e 100644
--- a/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk
+++ b/ports/stm/boards/stm32f411ce_blackpill_with_flash/mpconfigboard.mk
@@ -5,7 +5,7 @@ USB_MANUFACTURER = "WeAct"

 SPI_FLASH_FILESYSTEM = 1
 #See supervisor/shared/external_flash/devices.h for options
-EXTERNAL_FLASH_DEVICES = GD25Q16C,W25Q64FV,W25Q32JVxQ,W25Q64JVxQ
+EXTERNAL_FLASH_DEVICES = GD25Q16C,W25Q64FV,W25Q32JVxQ,W25Q64JVxQ,MX25L6406E
 LONGINT_IMPL = MPZ

 INTERNAL_FLASH_FILESYSTEM = 0

再之后编译。不得不提这编译的速度貌似比NRF52快多了。

make -C mpy-cross
cd ports/stm
make BOARD=stm32f411ce_blackpill_with_flash -j$(nproc)

最后刷固件。

dfu-util -l  # 列出当前的 DFU 设备
dfu-util -a 0 -D build_stm32f411ce_blackpill_with_flash/firmware.bin -s 0x08000000:leave

Very easy,不是么~

结语

好像也没什么好说的。啊对,珍爱开发板,远离拆机Flash。