傻孩子(GorgonMeducer) · 2023年03月09日

【独家】MDK开发树莓派Pico超进化——爷支持Flash下载了!

image.png

【说在前面的话】


事情是这样的:前一阵儿,一位与我关系不错的博主kk发了一篇关于如何在MDK环境下给任意芯片编写Flash下载算法的文章,本着(能水一周是一周,不能水就鸽了的思想)有好文章一定要推荐给大家的想法,我转载了《从零编写STM32H7的MDK SPI FLASH下载算法》。

哎,这不巧了么?我们的Pico-Template常年来一直缺一个Flash 下载算法,导致大家在MDK中只能用宝贵的 SRAM 搞开发调试——不是程序稍微大点 SRAM 就不够了,就是RAM多消耗点程序就装不下了——真叫个憋屈。

俗话说:走三家不如坐一家——为什么不能(一鱼两吃)请大师帮忙为树莓派Pico开发一个MDK下的Flash下载算法,彻底解决这一痛点呢?
image.png

image.png

作为一个不请自来的甲方,我充分发挥了脸皮厚的优点,不停的催促工期:

image.png

终于到了今天:

image.png

640.gif

这事情就成了。

image.png

借助这一新的Flash下载算法,Pico-Template总算成了完全体——可以像其他普通MCU那样编译、下载和调试了。

image.png

这看似简单的几个步骤 Pico-Template 整整等了一年多,太不容易了。

这里为那些对 Pico-Template还不熟悉的小伙伴做个简单的介绍:

  • Pico-Template 是一个MDK的工程模板,可以让你在熟悉的MCU开发环境下使用最新的Arm Compiler 6对树莓派Pico进行开发

喜欢白嫖的小伙伴也可以“安全”的使用MDK,因为MDK为开源社区专门提供了一个无代码尺寸限制、无调试尺寸限制、无芯片限制的社区License(Community License),任何人都可以通过简单的步骤申请到(申请入口在这里:https://www.keil.com/pr/artic...


  • 无需额外的仿真器,无需额外的Pico,连接Pico上的USB接口就可以进行调试(使用cmsis-dap协议)
  • 无需额外设备就可以在 MDK 的 Debug (printf) View 窗口中实现 printf输出。
  • 内嵌了 240*240 SPI LCD 的驱动
  • 内嵌了对 PikaScript (一个超轻量级python虚拟机)的支持
  •  AC6-flash 和 AC6-RunInSRAM 引入了 Flash下载算法,小伙伴只要在编译后直接进入Debug模式即可,无需手动拖放生成的 u2f 文件;
  • 为Flash下载算法引入了自动部署功能

简单说就是在第一次成功的编译后,Pico-Template会尝试将下载算法Raspberry_Pi_Pico.FLM 文件拷贝到 C:/Keil_v5/ARM/Flash 文件夹下,比如下面这样的结果:

image.png

如果我们看到了 1 file(s) copied 这样的字样,说明拷贝成功。如果看到 “Access is denied” 或是你的 MDK 根本没有安装在 C:\Keil_v5\ 目录下,就需要你手动将 Raspberry_Pi_Pico.FLM拷贝到MDK安装目录下的 ARM\Flash 文件夹中了。如果一切顺利,可以在 Debug -> Settings -> Flash Download 窗口中看到 Raspberry Pi Pico Flash 算法,如果没有,也可以手动添加,这里就不再赘述。

image.png


  • 删除了多余的 AC6-DebugInSRAM-printf。实际上,从现在开始,无论你使用哪个工程配置(比如AC6-flash),只要你在RTE里将 stdout 重定向为 EventRecorder,就可以直接从MDK的 Debug (printf) view 中观察到 printf输出。

image.png

  • Coremark

    跑分做好了准备(详情请看后面的教程)

  • Arm-2D

    的跑分做好了准备(详情请看后面的教程)

  • 更新了教程
  

  

是不是很棒呢?  

  

image.png

【如何获取最新版本】


一个合格的工程模板,应该做到只要成功的下载到了本地,就能够立即使用——Pico-Template也是这样。因此,所谓的Pico-Template的部署,实际上有三种方式:它们主要围绕着如何处理Pico-Template所依赖的第三方仓库而有所区别。

第一种方式:使用git工具进行下载


1、新建一个目录,比如叫做 pico-mdk来保存模板,并进入该目录

mkdir pico-mdk

2、使用git工具clone模板到本地:

git clone https://github.com/GorgonMeducer/Pico_Template .

特别提示:不要漏了上面命令行最后的 "." 哦,它表示“将Pico_Template克隆到当前目录”

image.png

3、将Pico-Template所依赖的其它仓库以submodule的形式更新到本地:

git submodule update --init

image.png

至此,我们已经成功的将Pico-Template同步到了本地一个叫做pico-mdk的目录下。

4、别忘记安装 perf_counter cmsis-pack哦!它为Pico-Template提供了所需的各类时间服务,包括但不限于:

  • 测量指定代码/函数片断的执行时间(cpu周期数)(___cycleof__()_)
  • 获得当前的系统时间戳(get_system_ticks()get_system_us()get_system_ms()
  • 提供阻塞式的延时服务(delay_us()delay_ms()
  • 各类C语言扩展

perf_counter v2.0.0开始,小伙伴们可以直接从 MDKPack-Installer 中找到它:

image.png
也可以从KEIL的官网中下载:

https://www.keil.com/dd2/pack/

image.png

感兴趣的小伙伴可以阅读这篇文章《【喂到嘴边了的模块】超级嵌入式系统“性能/时间”工具箱》来获取详细的帮助。

但总的来说,Pico-Template已经完成了对 perf_counter 的移植,拿起来用就行了

image.png

第二种方式:网盘见


如果你觉得上述方法都挺麻烦的,尤其是你无法稳定的访问Github,那么可以在订阅【裸机思维】公众号后发送关键字 "Pico"来获取网盘链接。下载成功后立即可以使用。

这一方法唯一的缺点是:我可能会忘记更新网盘上的压缩包。

image.png

【如何实现“单体自助”式调试】


要想让你手中的Pico变成自带调试器的单片机,你需要访问下面的网址复制链接到浏览器中打开):

https://github.com/majbthrd/pico-debug/releases

image.png

下载这里的 _pico-debug-gimmecache.uf2_ 文件(不要下错了哦),留着备用。

Pico-Template所提供的 AC6-flash 实现了“编译、下载、调试”一条龙服务。

image.png
由于pico-debug所实现的CMSIS-DAP调试器运行在SRAM中,因此很容易注意到每次对Pico进行断电后,都需要重新进行一次如下步骤:

1、按住Pico上的白色按钮不放、将PicoUSB接口连接PC。当我们在文件管理器中发现一个新的叫做 PRI-RP2 的U盘时,说明Pico已经成功进入烧录准备状态。

image.png

2、将__pico-debug-gimmecache.uf2_拖放到U盘中即可。

3、如果一切顺利,我们可以在资源管理器中发现一个新的HID-compiliant设备。

image.png

这里,还请放宽心,这个步骤每次断电后的第一次连接都只要做一次就行——不必每次启动调试都做一遍

打开MDK,切换到 _AC6-DebugInSRAM-printf_ 工程配置。在Options for Target窗口中,我们可以从Debug选项卡里看到:调试器已经被选择为 CMSIS-DAP Debugger

image.png

单击 Settings,我们应该看到 Pico 的其中一个 Cortex-M0+已经被检测到了:

image.png


注意:由于MDK工程模板中所有三个工程configuration(也就是AC6-flash、_AC6-RunInSRAM_和_AC6-DebugInSRAM_)都使用了同一个Objects文件夹来保存生成的 axf 文件,为了避免误会,在开始_AC6-DebugInSRAM_环境下的调试之前,一定要对当前工程进行至少一次重新编译——以确保载入的template.axf是对应当前工程配置的。


对工程进行编译后,单击调试按钮,我们应该看到指针停在了main()函数上:

image.png

【复位Pico的正确姿势】


由于树莓派Pico的特殊性,目前MDK中的普通的复位按钮其实并不足以正确对芯片进行复位。为此,Pico-Template提供了专门的方法——一个由脚本生成的按钮“Reset Pico”:

image.png

如果你的调试界面中找不到它,不要紧,在启动调试后,顺着菜单依次找到“View->Toolbox Window”,点开即可。

image.png

【如何在MDK中观察printf输出】


打开工程模板后,只要你的RTE配置中将stdout重定位成了 EventRecorder,你就可以直接在MDK中观察printf的输出结果:

image.png

编译后,正常进入调试模式。依次通过菜单 View->Serial Windows 打开 Debug (printf) Viewer 窗口:

image.png

一般它会出现在MDK窗体的右下角位置,如下图所示:

image.png

由于我们的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_中看到如下的输出结果:

image.png

这下PICO借助仅仅一根USB线,不仅能:

  • 单体自助式的“我调试我自己”——其实是用两个Cortex-M0+核中的一个在tinyUSB的帮助下实现为 CMSIS-DAP

还可以:

  • 单体自助式的在MDK中实现 printf 输出,不光省了USB转串口的各类工具,连上位机都省了

【如何开启 240*240 的 LCD驱动】


处于我本人的原因,Pico-Template中内嵌了一个 240*240 RGB565 SPI LCD 驱动。它的实物如下:

image.png

为了避免广告嫌疑,这里就不放上淘宝链接了。要开启对该屏幕的支持,只需要在工程配置文件中将宏 PICO_USE_LCD_1IN3 定义为 1 即可:
image.png

此后,我们将获得以下的功能和对应的API:

  • 使用 Disp0_DrawBitmap() 对屏幕进行刷新
extern 
void Disp0_DrawBitmap(   int_fast16_t x, int_fast16_t y, 
                        int_fast16_t width, int_fast16_t height,
                        uint8_t *frame_ptr); 
  • 使用 dev\_read\_key() 来获取 LCD 上的按键状态:

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做个小游戏应该问题不大。

【如何跑Arm-2D的Benchmark 】


Pico-Template 没有Arm-2D 做好移植,如果你问我是不小心还是故意的,那一定是故意的。

image.png

原因其实很简单,Pico-Template 也算是方便大家做 Arm-2D 移植练手用的,我把工作做完了,大家还怎么做练习呢?

但另一方面,很多人确有用 Arm-2D 跑分的需求,因此我在Pico-Template 中增加了对 Arm-2D 两个 Benchmark 跑分的准备性代码:


#if defined(__RTE_ACCELERATION_ARM_2D__)
#   include "arm_2d.h"
#endif

#if     defined(__RTE_ACCELERATION_ARM_2D_EXTRA_BENCHMARK_WATCH_PANEL__)            \
    ||  defined(__RTE_ACCELERATION_ARM_2D_EXTRA_BENCHMARK_GENERIC__)
#   include "arm_2d_benchmark.h"
#endif
...

int main(void) 
{
    system_init();
    ...

#if     defined(__RTE_ACCELERATION_ARM_2D_EXTRA_BENCHMARK_WATCH_PANEL__)            \
    ||  defined(__RTE_ACCELERATION_ARM_2D_EXTRA_BENCHMARK_GENERIC__)
    arm_2d_run_benchmark();
#endif
    ...
}

只要你安装了 Arm-2Dcmsis-pack,并在 RTE 中勾选了 GenericWatchpanel 中任意一个跑分选项,对于开启了内置的240*240 LCD驱动的情况,Pico-Template 一行代码都不用改就能立即运行指定的跑分例程,非常方便。

image.png

感兴趣的小伙伴,请参考 Arm-2D 部署相关的文章《【喂到嘴边了的模块】准备徒手撸GUI?用Arm-2D三分钟就够了》,这里就不在赘述。

【如何使用 PikaScript 】


PikaScript 是一款开源的超轻量级 python 虚拟机,它自身的资源消耗让 mpy 望尘莫及,有兴趣的小伙伴可以在同样的 LVGL例子进行对比,这里就不在赘述。

由于 Pico 本身已经支持 mpy,作为一种补充,Pico-Template 为PikaScript 做了适配。默认情况下,这种适配是关闭的,也不会消耗额外的资源。当你需要在Pico-Template中使用 PikaScript 时,需要以下的步骤:

1、确保自己安装了 PikaScriptcmsis-pack。安装包和教程请参考官方文档(复制链接到浏览器中打开):

https://pikadoc.readthedocs.io/zh/latest/get-start_cmsis-pack.html

2、在RTE中勾选 PikaScript

image.png
3、在Before Build中勾选 Run #1 来开启 PikaScript 的预处理程序

image.png

至此,我们就完成了在 Pico-Template 中使用 PikaScript 的准备工作。


注意,首次编译时,由于PikaScript的预处理程序需要从官方仓库中拉去所需的文件,因此很可能会消耗“非常长”的时间(仿佛死机了一般卡在如下的输出上),这是正常的,请耐心等待

image.png
此后再进行编译,预处理所用的时间就几乎忽略不计了


编译后调试,我们可以在 Debug (printf) View中看到如下的输出:

image.png

该文件可以在工程管理器中展开 PikaScript后的一堆文件中找到:

image.png

多谢了PikaScript的预处理步骤,每次修改 main.py 后只需要在MDK中保存并编译,就会立即生效,非常方便。

更多详细内容,请参考 PikaScript 的官方文档(复制链接到浏览器中打开)。

https://pikadoc.readthedocs.io/zh/latest/index.html

【说在后面的话】


感谢大家对这个项目一直以来的支持和反馈,让我有足够的动力去不断完善它。Pico-Template将原本依赖命令行开发环境的Pico重新带回了MCU开发的舒适区——使用MDK进行调试和开发——因此更多的小伙伴得以加入进来,这真是一件美事啊!

最后提醒下小伙伴们:为了最佳的用户体验,一定要使用最新的MDK哦。

原文:裸机思维
作者:GorgonMeducer 傻孩子

专栏推荐文章

如果你喜欢我的思维,欢迎订阅裸机思维欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
1466
内容数
108
探讨嵌入式系统开发的相关思维、方法、技巧。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息