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

news/2024/7/8 2:27:44 标签: windows, 单片机, 嵌入式硬件, python, msys2

就是想试试看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_38">编译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 之后,这里提示的板子名称就变成了刚才自己设置的名字。

在这里插入图片描述


http://www.niftyadmin.cn/n/5536059.html

相关文章

品牌营销:白加黑经典案例分析,社交电商代运营公司,新零售全案策划

#白加黑营销 #品牌策划 #独特销售主张 #市场占领 品牌的核心目标是盈利,而品牌策划就是为了推动这一目标的实现,使整个过程更加顺利和成功。每一位企业家创建品牌的最终目的都是为了获取更多的利润。然而,理想与现实往往存在差距。在实际操作…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置(transpose)矩阵与向量的转化 线性代数-张量(tensor…

Pip的缓存机制解析:提升Python包管理效率的秘密武器

Pip的缓存机制解析:提升Python包管理效率的秘密武器 Pip是Python的包管理工具,用于安装和管理Python库。从pip 20.3版本开始,引入了一项重要的特性——缓存机制。这一机制显著提升了包安装的速度和效率,尤其是在网络条件不佳或需…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中,政务大厅作为服务民众的前沿阵地,其服务效率和质量直接影响着政府形象和民众满意度。然而,许多政务大厅仍面临着缺乏智能化导航系统的挑战,这不仅增加了群众的办事难度,也降低了服务效率。维小帮…

NPM(Node Package Manager)常用指令详解

NPM(Node Package Manager)是Node.js的包管理工具,它允许用户从NPM仓库中安装、更新、删除软件包,以及管理项目的依赖关系。以下是NPM的一些常用命令及其详解: 查看版本 npm -v:查看当前NPM的版本号。 初始…

Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程,当然真正的服务远程引入、以及配置迁移啥的都还没讲,但是本次我们先不接着讲MigrationRuleListener#onRefer方法,而是先…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…

背包问题(一)

一.P3985 不开心的金明(01背包变式) 解析: 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做. …