扩展c模块的教程见下文

Esp-idf

如已安装,请见下文

!注意!请安装micropython支持的esp-idf版本,否则会出现奇怪的报错

详情见 esp-idf 官方安装文档 (Mac/Linux),以下是适用于我电脑的简单概括

安装依赖

使用homebrew:

brew install cmake ninja dfu-util ccache

cd ~/Tools
git clone -b v5.4.2 --recursive https://github.com/espressif/esp-idf.git
# 如果github速度慢,可以使用镜像下载
# git clone -b v5.4.2 --recursive https://bgithub.xyz/espressif/esp-idf.git

mv esp-idf esp-idfv5.4
cd esp-idfv5.4

# 国内使用以下命令设置github镜像
# export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets"
./install.sh

# 将以下命令添加到你的shell配置文件中
alias get_idf='. $HOME/Tools/esp-idfv5.4/export.sh'

# 重启shell或运行:
# source [你的shell配置文件路径]

# 进入esp-idf的环境
get_idf

至此,esp-idf环境配置成功

Micropython

cd ~/Tools

# 不要忘记进入虚拟环境(如果上面运行过,就不用再运行了)
get_idf

# 克隆micropython仓库
git clone https://github.com/micropython/micropython
# 国内镜像加速
# git clone https://bgithub.xyz/micropython/micropython

sudo chmod a+rwx micropython
cd micropython

# 编译mpy-cross
make -C mpy-cross

cd ports/esp32
make submodules

添加自定义模块

将模块文件夹放入ports/esp32下的modules即可

!注意! 如果模块中含有使用c编译的mpy文件,请阅读以下文档

详情见 micropython文档

如果原来的c模块导入了 #include "py/dynruntime.h"

那么就要讲代码转换为使用#include "py/runtime.h"的代码,注意,不只是要修改一行代码

可以让ai帮忙修改,跟他说:

帮我把以下代码转换成使用runtime.h的c代码,我将要把它编译进micropython固件

注意事项:static是小写的,需要定义模块全局字典、模块结构、要默认注册到micropython

之后,在micropython文件夹下新建一个usrmod文件夹,进入

创建一个文件夹,用于保存你的一个扩展模块

进入刚创建的文件夹,将你的模块放进去(只要源码,不需要Makefile

接下来,新建文件micropython.cmake,并输入以下内容

add_library(usermod_模块名 INTERFACE)

target_sources(usermod_模块名 INTERFACE
    ${CMAKE_CURRENT_LIST_DIR}/模块的c文件
)

# 如果项目含有头文件
target_include_directories(usermod_模块名 INTERFACE
    ${CMAKE_CURRENT_LIST_DIR}
)

target_link_libraries(usermod INTERFACE usermod_模块名)

usrmod文件夹中创建一个micropython.cmake,并输入以下内容:

include(${CMAKE_CURRENT_LIST_DIR}/上面创建文件夹的名字/micropython.cmake)
# 如果有多个模块,就写多条语句

编译

# 在ports/esp32下执行
# 如果没有自定义c模块:
make
# 如果有自定义c模块:
make USER_C_MODULES=../../../usrmod/micropython.cmake

烧入

不建议使用idf.py flash,特别是在使用自定义c模块时

# 进入输出结果文件夹内
cd build-ESP32_GENERIC

python -m esptool --chip esp32 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args"

其实就是在编译完成后终端输出烧入方法中的最后一种方法,编译完成的终端输出:

Project build complete. To flash, run:
 idf.py flash
or
 idf.py -p PORT flash
or
 python -m esptool --chip esp32 -b 460800 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_size 4MB --flash_freq 40m 0x1000 build-ESP32_GENERIC/bootloader/bootloader.bin 0x8000 build-ESP32_GENERIC/partition_table/partition-table.bin 0x10000 build-ESP32_GENERIC/micropython.bin
or from the "/Users/kaixin/Tools/micropython/ports/esp32/build-ESP32_GENERIC" directory
 python -m esptool --chip esp32 -b 460800 --before default_reset --after hard_reset write_flash "@flash_args"