给MicroPython添加RP2040电压调节能力
最近买了几块RP2040-Zero,是Waveshare基于Raspberry Pi Pico设计的一个迷你版本,MCU是RP2040,这个板子比官方Pico还多带了一个WS2812和一个Reset按钮。但我买到的也不是Waveshare官方的,是仿造的更便宜的版本,不过这个不影响功能。

开发板介绍
开发板有两种编程方式,一种方式是官方的C++ SDK,写完代码后用它的toolchain编译好二进制上传到板子,另外一种方式是通过Micropython,如果没有性能和访问底层的要求用Micropython会比较简单,它相当于封装了一层转义,提供Python 3的接口,底层其实也是调用的官方C++ SDK,有点像Arduino的Bootloader的感觉,我们把Micropython固件上传到板子后就能串口来操作了。
超频初测
RP2040搭载双核ARM Cortex-M0+,官方描述的最高运行频率是133MHz,我想看看超频极限,MicroPython官方有一个machine.freq()函数可以调整频率,我简单测试发现在240MHz到250MHz之间就死机了。一般要测试超频,需要在高负载长期运行也稳定不出问题,才能算超频成功,不过这里就简化一下,调整频率后能响应就算OK,看个大概的数值。

初步看这个核的频率可以到240MHz。
电压调节能力
看了Pico官方的SDK文档,发现有个vreg_set_voltage()函数可以调节电压,查看对应的enum,调节范围是从0.85V到1.3V,最小调节单位0.05V,预设是在1.1V。

如果我提高电压,内部晶体管的开关频率更高,理论上核心在高频情况下会更稳定,容易能达更高的超频频率,当然提高电压也会有缺点,功耗会提高、发热更高、和影响寿命,不过我只是好奇实验,在这里不考虑这些缺点。
二次开发MicroPython
我研究了MicroPython本身不支持调节电压,没有相关的函数,于是我二次开发MicroPython,把调节电压的功能加上。我在machine包里,先引入RP2040官方SDK的vreg相关定义(第44行),然后定义了要新加的volt函数(第61行),这个函数接收1个参数用来输入电压值(第129行),最终实现函数逻辑,通过调用底层vreg_set_voltage()来完成设置,代码如下:

添加U盘能力
另外,板载Flash芯片是25Q16,有2MB容量,扣除编译后固件的大小,还有1.6MB左右可以当作用户空间,用来放python代码和数据,MicroPython预设指定了1.4MB,于是也调整了一下,用尽所有空间。以及我定义了MICROPY_HW_USB_MSC,MicroPython会模拟一个FAT文件系统的U盘,可以用电脑自带的explorer或者手机自带的文件浏览器,来操作Flash内的用户空间,不需要每次通过Thonny之类的IDE来更新和上传代码。

测试结果
编译后,上传固件到板子开始测试。
通过machine.volt()来设置电压,设置最高的1.3V,实测超频极限能到260MHz-270MHz之间。

相反如果设置低电压0.9V,超频极限能到160MHz-170MHz之间(如果设置最低0.85V,直接死机)。

所以理论上,如果在嵌入式设备上使用,可以通过降低电压来更省电,提高电池使用时长,不过我这里只是测试了个大概,没有真正跑稳定性,建议大家如果要降低电压使用,需要测试好稳定性满足需求。
U盘效果:

大功告成!