)
MicroPython nRF 移植版完全指南從 nRF51 到 nRF9160 的編譯、燒錄與 BLE 開發(fā)【免費(fèi)下載鏈接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems項(xiàng)目地址: https://gitcode.com/gh_mirrors/mi/micropythonMicroPython 官方倉庫micropython中的ports/nrf移植版port將 MicroPython 運(yùn)行時(shí)帶到了 Nordic Semiconductor 的 nRF 系列芯片上覆蓋 nRF51如 micro:bit、nRF52832、nRF52840 以及蜂窩網(wǎng)絡(luò)芯片 nRF9160。本文基于 ports/nrf/README.md 并結(jié)合該移植版源碼系統(tǒng)講解支持的功能特性、板卡選擇、編譯燒錄流程、SoftDevice 藍(lán)牙協(xié)議棧集成、文件系統(tǒng)VFS配置、BLE REPL 與引腳編號(hào)規(guī)則幫助你在真實(shí) nRF 硬件上完成從構(gòu)建到運(yùn)行的完整閉環(huán)。一、移植版概覽與支持的功能特性ports/nrf是 MicroPython 對(duì) Nordic nRF 系列芯片的官方移植其目標(biāo)是在資源受限的 MCU 上運(yùn)行精簡的 Python 運(yùn)行時(shí)。README 中列出的核心功能包括UART串口通信與 REPL 支持SPI串行外設(shè)接口LED與Pin引腳GPIO 控制ADC模數(shù)轉(zhuǎn)換I2CPWM僅 nRF52 系列支持硬件 PWMTemperature溫度讀取片上溫度傳感器RTCReal Time Counter低功耗計(jì)數(shù)器BLE 支持包括nRF51 目標(biāo)上的Peripheral外設(shè)角色nRF52 目標(biāo)上的Central主機(jī)和 Peripheral 角色通過 BLE 提供 REPL可選使用 WebBluetoothubluepy面向 MicroPython 的 BLE 模塊連接建立后仍可運(yùn)行1 個(gè)不可連接的廣播advertiser。從源碼結(jié)構(gòu)可以印證這些功能的實(shí)現(xiàn)位置。在 ports/nrf/modules/machine 目錄下分別有uart.c、spi.c、pin.c、adc.c、i2c.c、pwm.c、rtcounter.c、temp.c、timer.c、soft_pwm.c等模塊實(shí)現(xiàn)BLE 相關(guān)代碼位于 ports/nrf/modules/blemodble.c和 ports/nrf/modules/ubluepymachine模塊入口則定義在 ports/nrf/modules/machine/modmachine.c。此外ports/nrf/mpconfigport.h 中為不同芯片設(shè)置了不同的功能等級(jí)MICROPY_CONFIG_ROM_LEVELnRF51822 在啟用 SoftDevice 時(shí)使用MICROPY_CONFIG_ROM_LEVEL_MINIMUM因?yàn)閰f(xié)議棧占用閃存和 RAM否則為CORE_FEATURESnRF52832 為BASIC_FEATURESnRF52840 與 nRF9160 為EXTRA_FEATURES。這解釋了為什么不同芯片上可用的 Python 功能集不同——資源越多ROM 等級(jí)越高。二、已測試硬件與板卡支持矩陣已測試的芯片與開發(fā)板README 記錄了經(jīng)過驗(yàn)證的硬件平臺(tái)nRF51 系列micro:bitPCA10000donglePCA10001PCA10028PCA10031dongleWT51822-S4ATnRF52832PCA10040Adafruit Feather nRF52Thingy:52Arduino PrimoIBK-BLYST-NANObreakout 板BLUEIO-TAG-EVIM BLYST Nano Sensor 板uBlox EVK-NINA-B1nRF52840PCA10056PCA10059dongleParticle XenonnRF52840 MDK USB Dongle詳見 boards/NRF52840_MDK_USB_DONGLE/README.mdnRF9160PCA10090nRF9160-DKActinius Icarus板卡BOARD、協(xié)議棧與燒錄工具對(duì)照表下表是 README 提供的官方板卡支持矩陣包含默認(rèn)的 SoftDeviceSD、BLE 支持角色、Bootloader 以及默認(rèn)燒錄工具Target BoardBOARD藍(lán)牙協(xié)議棧SD藍(lán)牙支持Bootloader默認(rèn)燒錄工具M(jìn)ICROBITs110PeripheralPyOCDPCA10000s110PeripheralSeggerPCA10001s110PeripheralSeggerPCA10028s110PeripheralSeggerPCA10031s110PeripheralSeggerWT51822_S4ATs110Peripheral手動(dòng)見數(shù)據(jù)手冊(cè)引腳圖PCA10040s132Peripheral 與 CentralSeggerFEATHER52s132Peripheral 與 Central手動(dòng)板底 SWDIO/SWCLK 焊點(diǎn)ARDUINO_PRIMOs132Peripheral 與 CentralPyOCDIBK_BLYST_NANOs132Peripheral 與 CentralIDAPIDK_BLYST_NANOs132Peripheral 與 CentralIDAPBLUEIO_TAG_EVIMs132Peripheral 與 CentralIDAPEVK_NINA_B1s132Peripheral 與 CentralSeggerPCA10056s140Peripheral 與 CentralSeggerPCA10059s140Peripheral 與 CentralOpenBootloadernrfutilPARTICLE_XENONs140Peripheral 與 CentralBlack Magic ProbeNRF52840_MDK_USB_DONGLEs140Peripheral 與 CentralOpenBootloadernrfutilPCA10090無bsdlib.a無LTE/GNSSSeggerACTINIUS_ICARUS無bsdlib.a無LTE/GNSSSegger注nRF9160PCA10090、ACTINIUS_ICARUS不運(yùn)行 BLE 協(xié)議棧而是使用bsdlib.aNordic 的 BSD 庫提供LTE/GNSS蜂窩通信能力因此表中“藍(lán)牙支持”為“無”。當(dāng)前倉庫ports/nrf/boards/目錄下實(shí)際包含的板卡還包括ARDUINO_NANO_33_BLE_SENSE、DVK_BL652、EVK_NINA_B3、SEEED_XIAO_NRF52等比 README 表格所列更多。以 PCA10040 為例其 mpconfigboard.mk 定義了MCU_SERIES m4 MCU_VARIANT nrf52 MCU_SUB_VARIANT nrf52832 SOFTDEV_VERSION 6.1.1 LD_FILES boards/nrf52832_512k_64k.ld NRF_DEFINES -DNRF52832_XXAA MICROPY_VFS_LFS2 1可以看出板卡配置由MCU_SERIES/MCU_VARIANT/MCU_SUB_VARIANT決定芯片型號(hào)SOFTDEV_VERSION決定 SoftDevice 版本LD_FILES指定鏈接腳本MICROPY_VFS_LFS2默認(rèn)啟用 littlefs v2 文件系統(tǒng)。三、編譯與燒錄從零開始構(gòu)建 nRF 固件前置準(zhǔn)備構(gòu)建 nRF 移植版需要先克隆倉庫并構(gòu)建mpy-cross交叉編譯器git clone URL.git micropython cd micropython make -C mpy-crossmpy-cross用于在編譯期把 Python 源碼預(yù)編譯為.mpy字節(jié)碼是凍結(jié)模塊frozen modules的基礎(chǔ)。默認(rèn)目標(biāo)板為PCA10040nRF52832這一默認(rèn)值定義在 ports/nrf/Makefile 的第 8 行BOARD ? PCA10040。構(gòu)建并燒錄默認(rèn)板進(jìn)入ports/nrf/目錄后執(zhí)行make submodules make make deploy其中make submodules拉取lib/CMSIS_6、lib/nrfx、lib/tinyusb等 Git 子模塊見 ports/nrf/Makefile 中GIT_SUBMODULES lib/CMSIS_6 lib/nrfx lib/tinyusbmake編譯固件默認(rèn)生成build-PCA10040/firmware.hex與.binmake deploy調(diào)用默認(rèn)燒錄器默認(rèn)FLASHER ? jlink即 Segger JLink nrfjprog燒錄固件。指定其他板卡make submodules make BOARDPCA10040 make BOARDPCA10040 deployBOARD變量會(huì)被映射到ports/nrf/boards/$(BOARD)目錄見 ports/nrf/Makefile如果目錄不存在會(huì)直接報(bào)錯(cuò)Invalid BOARD specified。構(gòu)建產(chǎn)物目錄名會(huì)隨板卡變化build-$(BOARD)若指定了SD則為build-$(BOARD)-$(SD_LOWER)。關(guān)閉 LTO 編譯為節(jié)省空間nRF 移植版在所有目標(biāo)上默認(rèn)啟用LTO鏈接時(shí)優(yōu)化通過-flto鏈接器標(biāo)志實(shí)現(xiàn)見 ports/nrf/Makefile 中LTO ? 1及CFLAGS -flto??梢酝ㄟ^LTO參數(shù)關(guān)閉make BOARDPCA10040 LTO0當(dāng)LTO0時(shí)Makefile 會(huì)改用-ffunction-sections -fdata-sections與-Wl,--gc-sections來去除未使用代碼段。重要提示GNU ARM Embedded Toolchain 7.2.1/4Q17 與 LTO 組合曾出現(xiàn)多個(gè)問題建議使用該版本之后的工具鏈如 7.3.1/2Q18 或 8.2.1/4Q18或者按上述方式以LTO0構(gòu)建。這也與 ports/nrf/Makefile 中$(PY_BUILD)/nlr%.o: CFLAGS -Os -fno-lto的特殊處理相互印證——NLR非本地跳轉(zhuǎn)相關(guān)目標(biāo)文件即使在 LTO 開啟時(shí)也單獨(dú)禁用 LTO以避免長跳轉(zhuǎn)代碼被優(yōu)化破壞。芯片平臺(tái)差異編譯器前綴為arm-none-eabi-CROSS_COMPILE ? arm-none-eabi-nRF51Cortex-M0使用-mfloat-abisoft軟浮點(diǎn)nRF52Cortex-M4使用-mfpufpv4-sp-d16 -mfloat-abihardnRF9160Cortex-M33使用-mcpucortex-m33 -marcharmv8-m.maindsp -mcmse見 ports/nrf/Makefile 中CFLAGS_MCU_m0/m4/m33nRF51822 還需在 ports/nrf/mpconfigport.h 中啟用MICROPY_NLR_THUMB_USE_LONG_JUMP因?yàn)?Thumb-1 指令集在 LTO 下 NLR 跳轉(zhuǎn)距離不確定nRF51 不支持浮點(diǎn)MICROPY_FLOAT_IMPL_NONEnRF52/nRF9160 使用MICROPY_FLOAT_IMPL_FLOAT。四、集成 Bluetooth StackSoftDevice的編譯與燒錄BLE 功能依賴 Nordic 的 SoftDevice 協(xié)議棧。首先下載對(duì)應(yīng)協(xié)議棧與頭文件./drivers/bluetooth/download_ble_stack.sh下載完成后編譯時(shí)通過SD參數(shù)指定協(xié)議棧make BOARDPCA10040 SDs132燒錄協(xié)議棧使用sd目標(biāo)make BOARDPCA10040 SDs132 sd注意make sd會(huì)對(duì)芯片執(zhí)行全片擦除nrfjprog --eraseall這可能同時(shí)抹掉第三方 bootloader。若板卡帶 OpenBootloader如 PCA10059、NRF52840_MDK_USB_DONGLE協(xié)議棧與應(yīng)用的燒錄順序由 nrfutil DFU 流程處理。從 ports/nrf/Makefile 的sd目標(biāo)可以看到其燒錄序列--eraseall全擦 → 燒錄$(SOFTDEV_HEX)→ 燒錄應(yīng)用 → 復(fù)位。指定SD后鏈接腳本會(huì)自動(dòng)追加boards/$(SD_LOWER)_$(SOFTDEV_VERSION).ld如s132_6.1.1.ld并引入drivers/bluetooth/bluetooth_common.mk以鏈接協(xié)議棧頭文件。SOFTDEV_VERSION在各板卡mpconfigboard.mk中定義PCA10040/PCA10056 均為 6.1.1倉庫ports/nrf/boards/下提供了s110_8.0.0.ld、s132_6.1.1.ld、s140_6.1.1.ld、s140_7.3.0.ld等鏈接腳本。關(guān)于 BLE 特性的進(jìn)一步調(diào)優(yōu)如 BLE REPL 等可通過編輯 ports/nrf/bluetooth_conf.h 實(shí)現(xiàn)。該文件按協(xié)議棧類型定義藍(lán)牙功能開關(guān)BLUETOOTH_SD 110s110啟用MICROPY_PY_BLE、MICROPY_PY_UBLUEPY、MICROPY_PY_UBLUEPY_PERIPHERALBLUETOOTH_WEBBLUETOOTH_REPL為 0BLUETOOTH_SD 132/140s132/s140額外啟用MICROPY_PY_UBLUEPY_CENTRALCentral 角色。這正與 README 所述“nRF51 僅 Peripheral 角色、nRF52 支持 Peripheral 與 Central”對(duì)應(yīng)。而MICROPY_PY_BLE_NUSNordic UART Service默認(rèn)定義為0需要手動(dòng)開啟。五、凍結(jié) manifestFreeze Manifest凍結(jié)freeze可以將 Python 源碼或.mpy字節(jié)碼編譯進(jìn)固件避免運(yùn)行時(shí)從文件系統(tǒng)導(dǎo)入。通過FROZEN_MANIFEST指定一個(gè)manifest.py即可方式一make 命令行傳入make BOARDPCA10040 FROZEN_MANIFESTpath/to/manifest.py方式二在板卡 makefile 中定義在具體板卡的mpconfigboard.mk中添加FROZEN_MANIFEST ? $(BOARD_DIR)/manifest.py兩種方式同時(shí)存在時(shí)手動(dòng) make 命令行傳入的值優(yōu)先級(jí)更高因?yàn)?只在變量未定義時(shí)生效。實(shí)際上ports/nrf/Makefile 已根據(jù)MICROPY_PY_ASYNCIO自動(dòng)選擇 manifest啟用 asyncio 時(shí)使用boards/manifest.py否則使用boards/manifest_minimal.py對(duì)應(yīng) boards/manifest.py 與 boards/manifest_minimal.py并且 nRF 移植版默認(rèn)開啟 asyncioMICROPY_PY_ASYNCIO ? 1。同時(shí)該移植版還包含freeze/目錄與modules/scripts/_boot.py等可凍結(jié)內(nèi)容。六、啟用文件系統(tǒng)FATFS 與 littlefsVFSnRF 移植版支持多種片內(nèi)文件系統(tǒng)。由于oofatfs模塊沒有可排除實(shí)現(xiàn)編譯的頭文件保護(hù)移植版提供了顯式開關(guān)MICROPY_VFS_FAT默認(rèn)值為 0需要顯式設(shè)為 1 才會(huì)編譯 FATFS 相關(guān)代碼并且還需要在mpconfigport.h中設(shè)置MICROPY_VFSmake BOARDPCA10040 MICROPY_VFS_FAT1啟用 FATFS 后ports/nrf/Makefile 會(huì)額外編譯lib/oofatfs/ff.c與lib/oofatfs/ffunicode.c并配合 ports/nrf/fatfs_port.c 提供磁盤 I/O。啟用 littlefsLFS1/LFS2若要使用 littlefs 作為片內(nèi)閃存文件系統(tǒng)可設(shè)置MICROPY_VFS_LFS1或MICROPY_VFS_LFS2同樣需要配合在mpconfigport.h或mpconfigboard.h中設(shè)置MICROPY_VFSmake BOARDPCA10056 MICROPY_VFS_LFS21從板卡配置看PCA10040 與 PCA10056 的mpconfigboard.mk中均已默認(rèn)MICROPY_VFS_LFS2 1而mpconfigport.h中MICROPY_VFS默認(rèn)按功能等級(jí)開啟CORE_FEATMICROPY_MBFSmicro:bit 文件系統(tǒng)則在未啟用 VFS 時(shí)自動(dòng)啟用。調(diào)整文件系統(tǒng)大小FS_SIZE文件系統(tǒng)在片內(nèi)閃存中的大小由鏈接腳本參數(shù)_fs_size控制默認(rèn)值為64K見 ports/nrf/boards/memory.ld 第 12 行??梢酝ㄟ^ makefile 的FS_SIZE動(dòng)態(tài)覆蓋make BOARDPCA10056 MICROPY_VFS_LFS21 FS_SIZE256KFS_SIZE的值會(huì)原樣傳給鏈接器-Wl,--defsym_fs_size$(FS_SIZE)因此必須使用鏈接腳本語法如256K。該值參與計(jì)算 Flash 布局_app_size _flash_size - _head_size - romfs - _fs_size - _bootloader_tail_size文件系統(tǒng)區(qū)域從_fs_start延伸到_fs_end。風(fēng)險(xiǎn)提示改變FS_SIZE會(huì)導(dǎo)致文件系統(tǒng)起始位置變化下次啟動(dòng)時(shí)固件會(huì)因位置變化而重新格式化文件系統(tǒng)可能丟失上一次固件中已有的文件。七、不同燒錄工具Flash Util的部署方式除默認(rèn)的 SeggerJLink nrfjprog外移植版支持多種燒錄后端見 ports/nrf/Makefile 中FLASHER ? jlink及各個(gè)分支。README 對(duì)應(yīng)給出了各工具的安裝與使用說明IDAP-M/IDAP-Link 目標(biāo)IBK_BLYST_NANO 等下載安裝 IDAPnRFProgLinux/OSX/Windows 版本該工具通過 CMSIS-DAP 調(diào)試器燒錄。Makefile 中對(duì)應(yīng)FLASHERidap命令為IDAPnRFPRog hex。Segger 目標(biāo)PCA10040、PCA10056 等安裝 JLink 與 nrfjprog。Linux 下可能需要將 SEGGER 的libjlinkarm.so鏈接到 nrfjprog 的目錄中。這是 nRF 移植版的默認(rèn)燒錄方式。PyOCD/OpenOCD 目標(biāo)MICROBIT、ARDUINO_PRIMO 等sudo apt-get install openocd sudo pip install pyOCDMakefile 中對(duì)應(yīng)FLASHERpyocd使用pyocd-flashtool與FLASHERopenocd使用openocd CMSIS-DAP 接口配置nRF51/nRF52 均使用target/nrf52.cfg。Black Magic Probe 目標(biāo)PARTICLE_XENON僅需arm-none-eabi-gdb。make deploy會(huì)通過 GDB 加載并運(yùn)行新固件對(duì)應(yīng)FLASHERbmp使用target extended-remote連接 BMP 端口默認(rèn)/dev/ttyACM0。nRFUtil 目標(biāo)PCA10059、NRF52840_MDK_USB_DONGLE首先安裝 Nordic 的nrfutilCLI然后安裝 SDK 子包以獲取pkg與dfu命令nrfutil install nrf5sdk-tools再安裝 Python 依賴sudo pip install intelhexintelhex提供hexmerge.py工具M(jìn)akefile 使用它對(duì) SoftDevice 鏡像做 MBR 裁剪--range0x1000:跳過 MBR 保護(hù)區(qū)。使用nrfutil作為燒錄后端時(shí)除deploy目標(biāo)外還必須指定串口參數(shù)make BOARDNRF52840_MDK_USB_DONGLE NRFUTIL_PORT/dev/ttyACM0 deploy若設(shè)備連接在默認(rèn)串口/dev/ttyACM0則NRFUTIL_PORT可以省略Makefile 默認(rèn)值。啟用 BLE 時(shí)與其他燒錄工具一樣首次固件更新需要先燒錄 SoftDevice使用sd目標(biāo)而非deploymake BOARDNRF52840_MDK_USB_DONGLE SDs140 NRFUTIL_PORT/dev/ttyACM0 sdnrfutil 的sd流程會(huì)生成兩個(gè) DFU 包stripped_sd.zip裁剪 MBR 后的 SoftDevice與xxx_dfu.zip應(yīng)用然后依次通過 USB 串口 DFU 推送。注意nRF52840 MDK USB Dongle 的 SoftDevice 請(qǐng)求標(biāo)識(shí)為0xB6見 Makefile 中ifeq ($(SD), s140) NRFUTIL_SD_REQ 0xB6。八、Bluetooth LE REPL通過 BLE 使用交互式解釋器該移植版實(shí)現(xiàn)了BLE REPL 驅(qū)動(dòng)。此功能默認(rèn)關(guān)閉因?yàn)閱⒂煤髸?huì)停用 UART REPLnRF 部分器件只有一個(gè) UART使用 BLE REPL 可以把 UART 釋放出來當(dāng)作普通外設(shè)使用。啟用方式編輯 ports/nrf/bluetooth_conf.h將MICROPY_PY_BLE_NUS設(shè)為 1即 Nordic UART Service 的 REPL 通道。這與mpconfigport.h中MICROPY_HW_ENABLE_UART_REPL的默認(rèn)邏輯呼應(yīng)當(dāng)MICROPY_PY_BLE_NUS或MICROPY_HW_USB_CDC啟用時(shí)UART REPL 自動(dòng)關(guān)閉。啟用后可選擇的測試工具NUS Console for Linux推薦命令行下連接 BLE NUS 服務(wù)WebBluetooth REPL實(shí)驗(yàn)性瀏覽器內(nèi)連接。此外手機(jī)/平板可安裝 nRF UART 應(yīng)用連接。WebBluetooth 模式還可以進(jìn)一步配置在bluetooth_conf.h中設(shè)置BLUETOOTH_WEBBLUETOOTH_REPL為 1。此時(shí)設(shè)備會(huì)在Eddystone URL 廣播與普通可連接廣播之間交替Eddystone URL 引導(dǎo)手機(jī)或電腦瀏覽器打開 WebBluetooth REPL 頁面隨后即可通過瀏覽器連接 BLE REPL。注意bluetooth_conf.h中 s110/s132/s140 三種協(xié)議棧的BLUETOOTH_WEBBLUETOOTH_REPL默認(rèn)值均為 0需要手動(dòng)開啟。九、nRF52840 板卡的引腳編號(hào)規(guī)則對(duì)于 nRF52840 系列板卡軟件引腳編號(hào)與物理引腳存在固定映射軟件 Pin 0–31 對(duì)應(yīng)物理引腳 0.xP0.00–P0.31軟件 Pin 32–47 對(duì)應(yīng)物理引腳 1.xP1.00–P1.15。例如在 PCA10059 上Pin(47)對(duì)應(yīng)物理引腳1.15。這一規(guī)則的落地體現(xiàn)在板卡引腳生成機(jī)制中Makefile 通過 boards/make-pins.py 讀取板卡的pins.csv、芯片的nrf52_af.csv及nrf52_prefix.c生成build/pins_gen.c與build/pins.h見 ports/nrf/Makefile 中MAKE_PINS/BOARD_PINS/AF_FILE/PREFIX_FILE定義。以 PCA10056 的 mpconfigboard.h 為例LED1–LED4 分別映射到引腳 13/14/15/16SPI0 的 SCK/MOSI/MISO 為 47/45/46UART1 的 RX/TX/CTS/RTS 為 8/6/7/5且啟用硬件流控MICROPY_HW_UART1_HWFC (1)這些數(shù)字均遵循上述軟件引腳編號(hào)規(guī)則。十、構(gòu)建產(chǎn)物與固件目標(biāo)ports/nrf/Makefile 定義了兩個(gè)主要產(chǎn)物目標(biāo)binary生成firmware.binobjcopy -O binaryhex生成firmware.hexobjcopy -O ihex這是deploy/sd燒錄使用的格式。nRF91 平臺(tái)的all目標(biāo)還會(huì)額外構(gòu)建secureboot因?yàn)?nRF9160 使用帶 TrustZone 的 Cortex-M33需要安全啟動(dòng)鏡像對(duì)應(yīng) drivers/secureboot/secureboot.mk。同時(shí)ports/nrf/mpconfigport.h 顯示 nRF9160 未啟用MICROPY_PY_MACHINE_MEM_BACKUP因?yàn)槠銹OWER-GPREGRET為數(shù)組且涉及安全/非安全外設(shè)劃分這也再次體現(xiàn)了不同芯片在移植版中的差異化處理。結(jié)語通過本文可以完成 nRF 移植版的完整開發(fā)閉環(huán)根據(jù)硬件選型nRF51/nRF52/nRF9160選擇合適的BOARD與SD協(xié)議棧參數(shù)執(zhí)行make submodules make make deploy或sd構(gòu)建燒錄需要文件系統(tǒng)時(shí)按需開啟MICROPY_VFS_FAT/MICROPY_VFS_LFS2并用FS_SIZE調(diào)整分區(qū)大小想通過藍(lán)牙調(diào)試時(shí)啟用MICROPY_PY_BLE_NUS的 BLE REPL。深入閱讀 ports/nrf/Makefile、ports/nrf/mpconfigport.h 與 ports/nrf/bluetooth_conf.h 等源碼文件可以進(jìn)一步掌握每個(gè)構(gòu)建開關(guān)背后的底層實(shí)現(xiàn)為定制自己的 nRF 板卡固件打下基礎(chǔ)?!久赓M(fèi)下載鏈接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems項(xiàng)目地址: https://gitcode.com/gh_mirrors/mi/micropython創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考