当前位置: 首页 > news >正文

Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件

就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子,用了4MB 的Flash,默认的Micropython 固件是2MB 的,所以只能自己编译固件。

编译环境

MSYS2 的安装方法、基本配置什么的我就不管了,到处都有文章介绍这个。只提一点,现在有了Windows Terminal 以后就用不着整什么别的终端模拟器了,只需要打开powershell,运行:

msys2 -ucrt64 -shell fish

就可以直接启用MSYS2 的UCRT64 环境,并且将启动shell 设置为fish,当然需要先pacman 把fish 装上。我是用scoop 安装的MSYS2,不确定其他方式安装之后,启动方式有没有区别。

编译之前,需要pacman -S 安装gitmakecmaketoolchain(包括了gcc)、arm-none-eabi-gccpythonpython-pip-tools。注意安装的时候选择对应ucrt64 环境的版本。既然micropython 的指南里推荐了用virtualenv,那就用一下,拿pip 安装:

pip install virtualenv

然后随便创建个虚拟环境:

virtualenv upy

fish shell 下激活虚拟环境:

source ./upy/bin/activate.fish

其他shell 同理。然后找一个地方把micropython 下载下来:

git clone --recurse-submodules https://github.com/micropython/micropython.git

这样是直接把所有用到用不到的库代码也都下载了,还有库的库,所以整体下载了不少东西,大概5 个G。

编译windows 版MicroPython

可以先这么试一下,编译一份Windows 下直接能运行的MicroPython 解释器。先进入Windows 版本的文件夹

cd micropython/ports/windows

里面有一份README 可以看一下,然后就

make submodules
make

编译完成后,在build-standard 文件下会有一个micropython.exe,运行效果和python 解释器差不多。

在这里插入图片描述
顺便也能看到解释器的源代码版本和编译时间,看起来源码直接编译的话就是preview 版本。

开发板配置文件

要修改Flash 容量,只能先自定义一个开发板配置文件。先进入到rp2040 版本的文件夹:

cd micropython/ports/rp2

所有支持的开发板文件都放在boards 文件夹下,所以就复制粘贴一个别人开发板的文件,比如SPARKFUN_PROMICRO。我自定义的板子取名叫BITTER_BASIC_RP2040,文件夹名称最好保持这种格式。

每个板子的文件夹底下有三个配置文件,依次打开修改成想要的样子。json 文件就是些基本的描述,随便写;cmake 文件是空白的,不管;.h 文件里有Flash 容量有关的宏:

在这里插入图片描述

MICROPY_HW_FLASH_STORAGE_BYTES 表示安装完固件以后Flash 的剩余字节数,15 * 1024 * 1024 表示15MB,就是16MB 的FLASH 去掉1MB,所以4MB 的FLASH 芯片就把这里改成3 * 1024 * 1024。再把板子的名称改掉,我的就是"BITTER BASIC RP2040"。把下面的USB VID 和PID 删掉,这样就使用默认的PICO 开发板的信息。

除了这里,还有一份pico-sdk 的配置文件,也就是RP2040 官方库的配置。进入pico-sdk 的文件夹:

cd micropython/lib/pico-sdk

打开配置文件的位置:

cd src\boards\include\boards

这里每个板子的配置对应一个.h 头文件,一样是拿别人的文件改改。这里头文件名要和之前的文件夹名对应,改成bitter_basic_rp2040.h,我还是用SPARKFUN 的pro micro 文件修改:

在这里插入图片描述

第一个宏改成自己板子的名字BITTER_BASIC_RP2040,方便以后在条件编译里使用。下面定义了板载LED 和WS2812 RGB 的引脚,这个pro micro 板子只有RGB 连在GPIO25 上,没有普通的LED,所以他就把PICO_DEFAULT_LED_PIN 注释掉了,我的板子上LED 和RGB 都有,所以对应修改:

#ifndef PICO_DEFAULT_LED_PIN
#define PICO_DEFAULT_LED_PIN   25
#endif#ifndef PICO_DEFAULT_WS2812_PIN
#define PICO_DEFAULT_WS2812_PIN 24
#endif

其他的引脚定义没什么好说的,最后就是FLASH 相关的宏:

在这里插入图片描述

PICO_BOOT_STAGE2_CHOOSE_W25Q080 表示Flash 芯片是W25Qxx 这一系列,或者与之兼容的型号,而不是说Flash 芯片是W25Q80。自己做的板子基本都用这种Flash,不用改。

PICO_FLASH_SPI_CLKDIV 是驱动SPI 的时钟分频系数。如果RP2040 CPU 频率125MHz,那么驱动Flash 的SCLK 频率就是62.5MHz。W25Qxx 系列芯片的规格书上说它最高能到100MHz,但是为了稳定性,选个2 分频是比较合适的。

PICO_FLASH_SIZE_BYTES 就是Flash 的实际字节数,4MB 那就改成4 * 1024 * 1024。

编译固件

打开RP2040 的文件夹:

cd micropython/ports/rp2

参考文件夹里附带的README,make 的时候要指定板子的名称,编译过程中,对应的配置文件会自动被使用。开始编译:

make BOARD=BITTER_BASIC_RP2040 submodules
make BOARD=BITTER_BASIC_RP2040 clean
make BOARD=BITTER_BASIC_RP2040

第三步可能会出现报错,比如找不到头文件:

在这里插入图片描述
这可能是因为基于mingw-w64 的arm gcc 编译器不支持MSYS2 这种文件路径格式,尽管它是用pacman 安装的。这样就只能稍微走点弯路,当然,不用想法子把arm gcc 编译一遍找BUG,而是在MSYS2 之外,另外搭一套编译环境。

推荐用scoop 安装,需要的环境包括:cmakegcc-arm-none-eabipython3,如果还需要本机的gcc 编译器,可以安装mingw-winlibs,一站式解决。配置好以后,用powershell 打开刚才rp2040 文件夹,不启动MSYS2。运行make BOARD=BITTER_BASIC_RP2040,应该会输出报错信息:

在这里插入图片描述在命令运行完之前Ctrl-C 关闭掉,否则就手动删除cmake 生成的build-BITTER_BASIC_RP2040 文件夹。复制调用cmake 的命令,另外加上一个参数:

cmake -G "Unix Makefiles" -S . -B build-BITTER_BASIC_RP2040 -DPICO_BUILD_DOCS=0 -DMICROPY_BOARD=BITTER_BASIC_RP2040 -DMICROPY_BOARD_DIR="C:/Users/chris/source/MSYS2/upy-prj/micropython/ports/rp2/boards/BITTER_BASIC_RP2040"

-G "Unix Makefiles" 是让cmake 生成Makefile。这里完成之后,就可以回去MSYS2 继续剩下的步骤。手动调用make:

make -C build-BITTER_BASIC_RP2040/

这里不出意外的话就会跑完,在build-BITTER_BASIC_RP2040 文件下生成.uf2 固件,按标准程序扔进板子里就好了。打开micropython 编辑器mu-editor,没有出问题的话, 打开REPL 之后,这里提示的板子名称就变成了刚才自己设置的名字。

在这里插入图片描述

相关文章:

  • 深度学习基准模型Transformer
  • 开灯问题(数学思路)
  • 第二十条:与抽象类相比,优先选择接口
  • 程序员需要具备的核心竞争力
  • 【等保2.0是什么意思?等保2.0的基本要求有哪些? 】
  • 游戏中的坐标转换函数*2(laya2D)
  • JVM的五大内存区域
  • AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理
  • 【python】OpenCV—Nighttime Low Illumination Image Enhancement
  • 1.1.2数据结构的三要素
  • 将带有 商店idr 商品信息的json导入到mongodb后,能不能根据商店id把所有商品全部提取并转为电子表格
  • 基于Echarts进行图表组件的封装
  • 在Linux/Debian/Ubuntu中出现“Could not get lock /var/lib/dpkg/lock-frontend”问题的解决办法
  • maven项目、idea抽风问题解决
  • 【React性能优化】父组件渲染如何避免子组件不必要的渲染
  • [译]前端离线指南(上)
  • 2017届校招提前批面试回顾
  • Apache的基本使用
  • conda常用的命令
  • Linux CTF 逆向入门
  • MySQL-事务管理(基础)
  • oschina
  • php的插入排序,通过双层for循环
  • underscore源码剖析之整体架构
  • 动态魔术使用DBMS_SQL
  • 基于遗传算法的优化问题求解
  • 检测对象或数组
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • Spring第一个helloWorld
  • 扩展资源服务器解决oauth2 性能瓶颈
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)球球大作战
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (ZT)一个美国文科博士的YardLife
  • (差分)胡桃爱原石
  • (三)终结任务
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .equals()到底是什么意思?
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET值类型变量“活”在哪?
  • @Builder用法
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [2016.7.Test1] T1 三进制异或
  • [20160807][系统设计的三次迭代]
  • [AIGC] 解题神器:Python中常用的高级数据结构
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C#]DataTable常用操作总结【转】
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [CentOs7]iptables防火墙安装与设置
  • [Dxperience.8.*]报表预览控件PrintControl设置