如何用MDK来开发树莓Pico

【说在前面的话】
按照树莓派基金会的说法:
raspberry pi pico is a tiny, fast, and versatile board built using rp2040, a brand new microcontroller chip designed by raspberry pi in the uk.
https://www.raspberrypi.org/products/raspberry-pi-pico/
树莓派 pico是一个小巧、“迅速”且多功能的开发板,基于独家定制的rp2040芯片打造,是在英国的树莓派团队设计的全新微控制器。
以30rmb左右的价格来看,pico作为一个开发板具有非常吸引人的特性:
搭载了设计最大频率为133mhz的双核cortex-m0+
实际可以轻松超频到250mhz,甚至是400mhz
256k + 8k 的sram
由多个sram总线从机接口构成,从而保证了多总线主机访问时不易出现冲突的问题——双向八车道的高速,几乎不会堵车——吞吐量杠杠的
大量充满奇思妙想的外设(这里就不做赘述)
在开发环境上,pico身为单片机,却有着linux般豪华的富贵病——这么说吧,你要是没玩过cmake、gcc、没用过命令行、没搞过openocd,你都不好意思说你是pico的c玩家。
在pico官方论坛上,曾经有一个带节奏的帖子叫做《pi pico - the most user un-friendly mcu?》(中文:树莓派pico——对用户最不友好的mcu)?如果你可以看懂英文,建议去观摩下这个13页的热帖。其中你可以看到:
pico-sdk团队开发者下场撕逼亲切的与各种暴躁老哥用户交流使用经验
pico-sdk开发者谈pico开发环境的设计思路,总结如下:
不会玩cmake的请学习cmake,用不了你多少时间
windows我们也支持啊,你装个linux模拟环境……
我们推荐所有用户都应该用树莓派4的linux环境来开发pico这个mcu
别人都玩得好好的,你玩不好一定是你不熟悉cmake
makefile玩家、iar玩家、mdk玩家请自寻出路(“on your own”)
我们团队庙小,4美元的开发板你还要啥自行车?
……
然而,mcu的开发并不同于mpu的开发。我的观察中,树莓派这类能跑linux的系统,基本上使用的是linux生态,在这一生态下,很多工具比如cmake、命令行、gdb或者openocd之类都是如空气和水一样自然的东西。然而,树莓派团队在处理pico这类mcu时可能多少有点“屁股决定脑袋”了,仍然按照自己的习惯照搬了linux的那套开发习惯到mcu环境中。
我经常说,抛开正态分布的中央主极大、用两端的个案来举反例,就是耍流氓。
对mcu开发环境来说,虽然也有不少人使用gcc、cmake之类的工具,但主体的大多数人还是以ide等“一站式”开发工具为主体的。rp2040无论多么优秀,它本质上就是个装了两个cortex-m0+的大号mcu,凭什么非要上linux环境才能开发?
mdk虽然老旧、不支持多级工程管理、偶尔闪退、语法提示经常出错、被破解的爹妈都不认识……被人骂了那么多,但cortex-m用mdk开发仍然是主流。但无奈,人家的孩子人家说了算,官方明确态度说暂时不支持arm compiler 6,也不支持用mdk这样的不带cmake支持的ide,你也没办法啊。
好在pico-sdk是一个基于bsd 3-clause协议的开源项目;rp2040的数据手册写的也很清晰。官方说不支持,我们就自己来呗?于是就有了这个mdk专属的pico-template开源项目。
实际上:
pico-template 是目前世界上第一个用mdk配合arm compiler 6开发pico的模板;
使用该模板你可以使用pico-sdk来访问全部的外设
实际使用中 pico-template 具有以下特点:
支持arm compiler 6
可以使用rte和pack-installer获得各类中间件软件包
告别纯汇编编写的startup文件,使用纯c语言进行开发
配置栈和堆的大小更为简单
支持使用jlink进行调试
默认搭载了perf_counter服务
一键切换不同的地址空间布局
在外部flash里执行代码
在sram里执行代码(代码仍保存在外部flash里)
在sram里调试
【裸机思维】对该开源项目提供持续的维护和更新
【pico-template的部署】
一个合格的工程模板,应该做到只要成功的下载到了本地,就能够立即使用——pico-template也是这样。因此,所谓的pico-template的部署,实际上有三种方式:它们主要围绕着如何处理pico-template所依赖的第三方仓库而有所区别。
第一种方式:使用git工具进行下载
1、新建一个目录,比如叫做 pico-mdk来保存模板,并进入该目录
mkdir pico-mdkcd pico-mdk
2、使用git工具clone模板到本地:
git clone https://github.com/gorgonmeducer/pico_template 。
3、将pico-template所依赖的其它仓库以submodule的形式更新到本地:
git submodule update --remote --init
至此,我们已经成功的将pico-template同步到了本地一个叫做pico-mdk的目录下。
第二种方式:手工下载压缩包
1、打开pico-template在github上的release页面,下载最新版本的压缩包。
https://github.com/gorgonmeducer/pico_template/releases
完成下载后,解压缩到本地。
2、打开pico-sdk在github上的release页面,下载最新的压缩包:
https://github.com/raspberrypi/pico-sdk/releases
完成下载后,解压缩到本地。打开解压后的目录,应该看到类似下图的内容:
全选上述目录列表中的内容后,将它们拷贝到pico-template的pico-sdk目录内
3、打开perf_counter在github上的release页面,下载最新的压缩包:
https://github.com/gorgonmeducer/perf_counter/releases
完成下载后,解压缩到本地。打开解压后的目录,应该看到类似下图的内容:
全选上述目录列表中的内容后,将它们拷贝到pico-template/project/mdk/perf_counter目录内:
至此,我们成功的完成了pico-template的合体工作。恭喜恭喜!
第三种方式:网盘见
如果你觉得上述方法都挺麻烦的,尤其是你无法稳定的访问github,那么可以在订阅【裸机思维】公众号后发送关键字 “pico”来获取网盘链接。下载成功后立即可以使用。
这一方法唯一的缺点是:我可能会忘记更新网盘上的压缩包。
【如何编译和下载】
当你获得了pico-template后,可以通过路径project/mdk找到工程文件:
双击后,就可以见到我们熟悉的界面:
单击编译,应该可以顺利的看到类似如下的结果:
可以看到,在工程目录下(project/mdk/) 生成了一个名为 template.uf2 的文件——这就是pico专用的镜像文件:
此时,我们可以按住pico上的白色按钮不放、将pico的usb接口连接pc。当我们在文件管理器中发现一个新的叫做 pri-rp2 的u盘时,说明pico已经成功进入烧录准备状态。
将template.uf2拖放到u盘中即可。
如果一切顺利,可以看到pico上的led以大约0.5hz的频率进行呼吸。
【如何配置栈和堆的大小】
一个实用的工程模板,最绕不开的问题之一就是:如何设置栈和堆的大小。pico-template提供了极其简单的方法。步骤如下:
1、打开options for target窗口,进入linker选项卡:
单击图中红圈内选中的“edit”按钮。
这里宏stack_0_size和heap_0_size就是我们要配置的栈与堆的尺寸。请暂时无视其它宏的内容,也不要修改它们。
完成修改后,保存、重新编译即可。
【如何在sram中执行代码】
由于rp2040芯片并没有片内flash,因此通常会像pico那样使用外部flash来保存程序。由于rp2040的xip已经将外部flash的内容映射到了cortex-m0+的地址空间中(从0x10000000开始),因此可以直接在外部flash上执行代码。众所周知,外部flash是通过spi或者qspi来连接的,其速度肯定无法媲美芯片内部的flash,因此即便 xip有cache来提高速度,直接从0x1000-0000的地址上运行程序(或者是读取数据)显然存在性能上的瓶颈。为了解决这一问题,在sram富余的情况下(rp2040带了264kb的sram)对一些小的应用来说,完全允许用户直接在sram中执行代码。为了提供这一功能,pico-template贴心的提供了对应的工程配置:我们可以在下拉列表中直接一键切换:
这一操作的本质实际上是更换了对应的scatter-script脚本。所有用到的链接脚本都保存在工程目录下:
有兴趣的小伙伴可以自行把玩。
【如何使用mdk进行调试】
在众多的商业调试工具中,segger 的j-link很迅捷的就添加了对rp2040的调试支持,具体细节可以通过下面的网址来了解:
https://wiki.segger.com/raspberry_pi_pico
pico-template默认已经选择j-link作为调试工具。需要注意的是,并非所有的j-link都能支持rp2040的调试,按照官方的说法,只有v9版本的j-link硬件才有对应的功能。如果你手头正好有符合要求的j-link,恭喜你,获得了完整的mdk体验——基本告别了手动拖放uf2文件,调试全靠led的生活。
【elf2uf2转换工具】
最后,值得特别说明的是,在pico_template的tool目录下有一个我亲手定制过的elf2uf2.exe——增加了自动计算0x1000-0000地址开始的252个字节的crc32校验码,并将校验结果追加其后的功能——如果不这么做,生成的uf2将无法通过stage2-boot的校验。
工程模板会在每次编译完成后执行 axf2uf2.bat,将生成的elf/axf文件转换成pico可以直接使用的uf2文件,方便用户进行u盘拖放操作。
【说在后面的话】
说句实话,我挺喜欢树莓派pico的——即便我对官方的“pico官方只支持用cmake开发不然自己想办法”的态度有些许不满,但仍然架不住它的小巧和魅力。这个模板已经涵盖了除tinyusb支持以外的几乎大部分功能,成功的将pico以普通cortex-m0+的身份拉回了国内大部分嵌入式工程师所熟悉的开发环境中。
最后的最后,我一定要把心里憋了很久的那句话吐出来:
就一个m0+而已,干嘛开发它我还要去用命令行、用linux、学cmake?凭什么?
你们linux玩家人均cmake、命令行、openocd、gdb、gcc,所以就不管单片机玩家的死活了么?
跟我这儿玩啥凡尔赛?
老子就不想用cmake……你还不让我玩了?
就一个m0+而已,我就要用mdk来开发!怎么地吧!


智能传感器两大功能介绍,它的未来发展方向如何
易华录致力于打造大数据协同创新产业链
气敏传感器的温湿度补偿
机器学习在网络中的5个重要应用
如何在阿里云物联网平台上上传LoRa节点设备的物模型
如何用MDK来开发树莓Pico
AI是如何为安防监控赋能的?
帕金森AI辅诊国际联合研发 腾讯联合Medopad领衔
Linux开发_ Linux命令复习与文件目录复习
自动气象站设备产品特点及应用范围
SX1278/SX1276/SX1272中文规格书
C++基础语法十大排序算法后五个分享
迅为2K1000龙芯开发板-pmon 下常用命令
为军事应用提供小型嵌入式计算案例
家电全渠道占比行业第一 亿台空调里程碑见证霸主地位
人工成本高企?华为云耀云服务器 L 实例打通企业网站开发最后堵着
can总线与485总线五大区别
华为麒麟 990 下载速率领先,联发科天玑1000 + 数据传输功耗表现出色
串行通信技术具备怎样的特点
乌鲁木齐35kv户外柱上高压真空断路器ZW32-40.5系列厂家安装案例