【说在前面的话】
昨天树莓派官方为树莓派Pico发布了最新的SDK,即Pico-SDK v1.5.0(复制链接到浏览器中打开):
https://github.com/raspberrypi/pico-sdk/releases/tag/1.5.0
专为树莓派Pico提供MDK开发体验的 Pico-Template 火速更新,推出了v1.8.0版本。
这里为那些对 Pico-Template 还不熟悉的小伙伴做个简单的介绍:
喜欢白嫖的小伙伴也可以“安全”的使用MDK,因为MDK为开源社区专门提供了一个无代码尺寸限制、无调试尺寸限制、无芯片限制的社区License(Community License),任何人都可以通过简单的步骤申请到(申请入口在这里:https://www.keil.com/pr/article/1299.htm)
是不是很棒呢?
【如何获取最新版本】
一个合格的工程模板,应该做到只要成功的下载到了本地,就能够立即使用——Pico-Template也是这样。因此,所谓的Pico-Template的部署,实际上有三种方式:它们主要围绕着如何处理Pico-Template所依赖的第三方仓库而有所区别。
第一种方式:使用git工具进行下载
1、新建一个目录,比如叫做 pico-mdk来保存模板,并进入该目录
mkdir pico-mdk
cd pico-mdk
2、使用git工具clone模板到本地:
git clone https://github.com/GorgonMeducer/Pico_Template .
特别提示:不要漏了上面命令行最后的 "." 哦,它表示“将Pico_Template克隆到当前目录”
3、将Pico-Template所依赖的其它仓库以submodule的形式更新到本地:
git submodule update --init
至此,我们已经成功的将Pico-Template同步到了本地一个叫做pico-mdk的目录下。
4、别忘记安装工程模板根目录下附带的 perf_counter cmsis-pack哦!它为Pico-Template提供了所需的各类时间服务,包括但不限于:
感兴趣的小伙伴可以阅读这篇文章《【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱》来获取详细的帮助。
但总的来说,Pico-Template已经完成了对 perf_counter 的移植,拿起来用就行了。
【如何实现“单体自助”式调试】
要想让你手中的Pico变成自带调试器的单片机,你需要访问下面的网址复制链接到浏览器中打开):
https://github.com/majbthrd/pico-debug/releases
下载这里的 pico-debug-gimmecache.uf2 文件(不要下错了哦),留着备用。
对大部分人来说,Pico-Template所提供的 AC6-DebugInSRAM-printf 实现了“编译、下载、调试”一条龙服务。
由于pico-debug所实现的CMSIS-DAP调试器运行在SRAM中,因此很容易注意到每次对Pico进行断电后,都需要重新进行一次如下步骤:
1、按住Pico上的白色按钮不放、将Pico的USB接口连接PC。当我们在文件管理器中发现一个新的叫做 PRI-RP2 的U盘时,说明Pico已经成功进入烧录准备状态。
2、将pico-debug-gimmecache.uf2 拖放到U盘中即可。
3、如果一切顺利,我们可以在资源管理器中发现一个新的HID-compiliant设备。
这里,还请放宽心,这个步骤每次断电后的第一次连接都只要做一次就行——不必每次启动调试都做一遍。
打开MDK,切换到 AC6-DebugInSRAM-printf 工程配置。在Options for Target窗口中,我们可以从Debug选项卡里看到:调试器已经被选择为 CMSIS-DAP Debugger。
单击 Settings,我们应该看到 Pico 的其中一个 Cortex-M0+已经被检测到了:
注意:由于MDK工程模板中所有三个工程configuration(也就是AC6-flash、AC6-RunInSRAM和AC6-DebugInSRAM-printf)都使用了同一个Objects文件夹来保存生成的 axf 文件,为了避免误会,在开始AC6-DebugInSRAM环境下的调试之前,一定要对当前工程进行至少一次重新编译——以确保载入的template.axf是对应当前工程配置的。
对工程进行编译后,单击调试按钮,我们应该看到指针停在了main()函数上:
【如何对RunInFlash和RunInSRAM进行调试】
除了前面所说的 AC6-DebugInSRAM-printf 方案外,Pico-Template模板还提供了一般工程开发所需的 AC6-Flash 和 AC6-RunInSRAM 两个配置。
它们的调试本身并不复杂,但这两个配置有自己的难言之隐,即:每次重新编译工程后,都需要用户:
总结一下:AC6-Flash和AC6-RunInSRAM的调试优点是可行、缺点是需要纯手工下载程序。
【复位Pico的正确姿势】
由于树莓派Pico的特殊性,目前MDK中的普通的复位按钮其实并不足以正确对芯片进行复位。为此,Pico-Template提供了专门的方法——一个由脚本生成的按钮“Reset Pico”:
如果你的调试界面中找不到它,不要紧,在启动调试后,顺着菜单依次找到“View->Toolbox Window”,点开即可。
【如何在MDK中观察printf输出】
打开工程模板后,切换到新增加的工程配置“AC6-DebugInSRAM-printf”:
编译后,正常进入调试模式。依次通过菜单 View->Serial Windows 打开 Debug (printf) Viewer 窗口:
一般它会出现在MDK窗体的右下角位置,如下图所示:
由于我们的main()函数中已经包含了一句 printf 输出:
int main(void)
{
system_init();
printf("Hello Pico-Template\r\n");
uint32_t n = 0;
while (true) {
breath_led();
//gpio_put(PICO_DEFAULT_LED_PIN, 1);
//sleep_ms(500);
//gpio_put(PICO_DEFAULT_LED_PIN, 0);
//sleep_ms(500);
}
//return 0;
}
当我们开始执行时,就会在Debug (printf) Viewer中看到如下的输出结果:
这下PICO借助仅仅一根USB线,不仅能:
还可以:
【如何开启 240*240 的 LCD驱动】
处于我本人的原因,Pico-Template中内嵌了一个 240*240 RGB565 SPI LCD 驱动。它的实物如下:
为了避免广告嫌疑,这里就不放上淘宝链接了。要开启对该屏幕的支持,只需要在工程配置文件中将宏 __PICO_USE_LCD_1IN3__ 定义为 1 即可:
此后,我们将获得以下的功能和对应的API:
extern
void GLCD_DrawBitmap( int_fast16_t x, int_fast16_t y,
int_fast16_t width, int_fast16_t height,
uint16_t *frame_ptr);
enum {
PIN_KEY_A = 15,
PIN_KEY_B = 17,
PIN_KEY_X = 19,
PIN_KEY_Y = 21,
PIN_KEY_UP = 2,
PIN_KEY_DOWN = 18,
PIN_KEY_LEFT = 16,
PIN_KEY_RIGHT = 20,
PIN_KEY_HOME = 3,
KEY_HOME = 0,
KEY_UP = 1,
KEY_DOWN,
KEY_LEFT,
KEY_RIGHT,
KEY_A,
KEY_B,
KEY_X,
KEY_Y,
KEY_NUM,
};
bool dev_read_key(uint8_t chkey);
一个典型的例子代码是:
#include "DEV_Config.h"
...
//! read key A
if (dev_read_key(KEY_A)) {
printf("Key A is down \r\n");
}
...
有了上述API,配合Arm-2D做个小游戏应该问题不大。
【如何使用 PikaScript 】
PikaScript 是一款开源的超轻量级 python 虚拟机,它自身的资源消耗让 mpy 望尘莫及,有兴趣的小伙伴可以在同样的 LVGL例子进行对比,这里就不在赘述。
由于 Pico 本身已经支持 mpy,作为一种补充,Pico-Template 为PikaScript 做了适配。默认情况下,这种适配是关闭的,也不会消耗额外的资源。当你需要在Pico-Template中使用 PikaScript 时,需要以下的步骤:
1、确保自己安装了 PikaScript 的cmsis-pack。安装包和教程请参考官方文档(复制链接到浏览器中打开):
https://pikadoc.readthedocs.io/zh/latest/get-start_cmsis-pack.html
2、在RTE中勾选 PikaScript
3、在Before Build中勾选 Run #1 来开启 PikaScript 的预处理程序
至此,我们就完成了在 Pico-Template 中使用 PikaScript 的准备工作。
注意,首次编译时,由于PikaScript的预处理程序需要从官方仓库中拉去所需的文件,因此很可能会消耗“非常长”的时间(仿佛死机了一般卡在如下的输出上),这是正常的,请耐心等待。
此后再进行编译,预处理所用的时间就几乎忽略不计了。
编译后调试,我们可以在 Debug (printf) View中看到如下的输出:
它实际上对应main.py的脚本内容:
该文件可以在工程管理器中展开 PikaScript 后的一堆文件中找到:
多谢了PikaScript的预处理步骤,每次修改 main.py 后只需要在MDK中保存并编译,就会立即生效,非常方便。
更多详细内容,请参考 PikaScript 的官方文档(复制链接到浏览器中打开)。
https://pikadoc.readthedocs.io/zh/latest/index.html
【说在后面的话】
感谢大家对这个项目一直以来的支持和反馈,让我有足够的动力去不断完善它。Pico-Template将原本依赖命令行开发环境的Pico重新带回了MCU开发的舒适区——使用MDK进行调试和开发——因此更多的小伙伴得以加入进来,这真是一件美事啊!
最后提醒下小伙伴们:为了最佳的用户体验,一定要使用最新的MDK哦。