使用 C 语言开始学习 Raspberry Pi Pico 多核微控制器板

作者:Jacob Beningo

投稿人:DigiKey 北美编辑

在嵌入式系统中,有一个内在的需求,就是要有一个强大的、低成本的微控制器单元 (MCU)。这些设备不仅在产品中发挥着重要作用,而且在支持测试、快速原型设计和机器学习 (ML) 之类能力方面也发挥着重要作用。然而,使用 MCU 通常需要对 MCU 技术和底层编程语言有深入的了解。除此之外,开发板的价格往往在 20 美元到 1000 美元之间,这对许多开发人员来说可能太昂贵了。此外,并不总是有开发板,即使有开发板,设计者也常常要花很多精力让开发板启动并运行起来。

本文介绍了作为用于 RP2040 MCU 的低成本开发板的 Raspberry Pi Pico (SC0915),该板能为开发者提供广泛的功能。文章探讨了 Pico 和一些扩展板,研究了 Raspberry Pi Pico 支持的不同软件开发工具包,并演示了如何使用 C SDK 创建一个 LED 闪光应用。

Raspberry Pi Pico 简介

Raspberry Pi Pico 作为 RP2040 微控制器的开发平台而于 2021 年首次推出。Pico 可以作为独立的开发板使用,或者通过边缘连接焊接到载板上,因此可以直接设计导入产品(图 1)。因其低于 5 美元的成本及其多用途特性,Pico 已经成为创客和专业开发者的一个很受欢迎的解决方案。

Raspberry Pi Pico 是一个低成本的开发板图片图 1:Raspberry Pi Pico 是一块低成本的开发板,包含了在 RP2040 微控制器上开发应用所需的一切。(图片来源:Raspberry Pi)

RP2040 带有一个双核 Arm® Cortex®-M0+ 处理器,时钟频率为 133 兆赫(MHz),包括高至 264 千字节 (Kb) 的 SRAM。RP2040 不包括片上闪存。不过 Raspberry Pi Pico 提供了一个 2 兆字节 (Mb) 的外部闪存芯片,通过一个四路串行外设接口 (QSPI) 与 RP2040 连接。该板还提供了一个用户 LED,一个锁相环 (PLL) 用来创建稳定高速 CPU 时钟的晶体振荡器,以及一个用来配置处理器是正常引导还是进入引导程序的按钮。

一个广泛的生态系统

Raspberry Pi Pico 已经有了一个广泛的生态系统,允许开发者选择使用 MicroPython 或 C 软件开发工具包来为电路板编写应用程序。关于 Raspberry Pi Pico 还有一点有趣的要说明的是,并不是只有一块开发板可用。而是有三个;只有一个标准配置的原版 SC0915、包括针座连接器的 SC0917以及带有用于联网应用的低成本 Wi-Fi 芯片的 SC0918(图 2)。

Raspberry Pi Pico 有三种配置可供选择图片图 2:Raspberry Pi Pico 有三种配置。(图片来源:Beningo Embedded Group, LLC)

这些版本中的每一个板子的引脚尺寸都是相同的。板子边缘连接由 40 针边缘连接组成,用于图 3 所示的外围设备和连接选件。其中包括电源、地线、通用异步接收器和发射器 (UART)、通用输入和输出 (GPIO)、脉冲宽度调制 (PWM)、模数转换器 (ADC)、串行外设互连 (SPI)、内部集成电路 (I2C) 接口和调试。

Raspberry Pi Pico 边缘连接引脚分配(点击放大)图 3:Raspberry Pi Pico 边缘连接引脚分配提供了多种多样的外设接入方式。(图片来源:Raspberry Pi)

分线板选件

当 Raspberry Pi 要用于快速原型开发时,有必要方便接入电路板的边缘连接器。接入它们的一个选择是使用焊接针座并使用试验板。但这种解决方案往往会导致线路混乱,并从而导致差错。因此,取而代之的是,有多种分线板的选择,将边缘连接器扩展到更容易获得的接口。

例如,BridgetekMM2040EV Pico 模块板将大部分边缘连接器分解为插针和插座连接。此外,还有 Seeed Studio 为 Pico 提供的 103100142 盾板,能以连接器的形式提供每个外设接口。每个连接器都与扩展板引脚兼容,以便增加像惯性传感器、电机驱动器和测距仪之类功能。

用 C 还是用 MicroPython?

嵌入式系统传统上都是用 C 语言编写的,因为它兼顾了低层的控制和高层的系统应用方法。今天 C 语言的问题是,它是一种过时的、有着 50 年历史的编程语言,在大学里很少被教授。也更容易意外引入漏洞并造成损坏。尽管有这些潜在的问题,但 C 语言仍然是大多数嵌入式系统开发的首选语言。

Raspberry Pi Pico 生态系统提供的一个替代 C 语言的方案是 MicroPython。MicroPython 是一个 CPython 端口,旨在运行在基于 MCU 的系统上。虽然它无疑是一个比 C 语言更重度消耗处理器的用户,但它是一种现代语言,许多开发人员都熟悉和适应它。MicroPython 可以抽象出 MCU 和硬件的低层细节。硬件访问是通过高级应用编程接口 (API) 进行的,很容易学习——这是在项目期限紧迫的情况下的一个重要因素。

当选择使用哪种软件开发工具包 (SDK) 时(C 或 MicroPython),开发者需要关注其具体的需求。与 MicroPython 相比,使用 C 语言将提供对 MCU 寄存器的低层访问,具有更小的内存占用,而且效率更高。

设置 C SDK

当使用 C SDK 创建 LED 闪烁应用时,有几种选择。第一种是查看 SDK 文档并按照说明进行操作。第二种是使用预设的 Docker 容器来自动安装所有必要的工具,以便开始使用。第三种选择是手动安装工具链和 Raspberry Pi Pico 示例代码,包括:

  • Git
  • Python 3
  • Cmake
  • gcc-arm-none-eabi \
  • libnewlib-arm-none-eabi

可以通过使用以下命令克隆 Raspberry Pi 的 git repo 来完成获取 Raspberry Pi Pico 示例代码:

git clone https://github.com/raspberrypi/pico-sdk /home/sdk/pico-sdk && \

cd /home/sdk/pico-sdk && \

git submodule update --init &&

这些库和源代码安装完毕后,下一步就是探索和编译 LED 闪烁应用程序。

编写第一个闪烁应用程序

C SDK 带有一个闪烁实例,开发者可以用它来建立其第一个应用程序。以下代码清单使用 Pico 的板载 LED 和 PICO_DEFAULT_LED_PIN 指令来设置 I/O 引脚,并以 250 毫秒 (ms) 的延迟进行闪烁。

副本
	/**
	 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
	 *
	 * SPDX-License-Identifier: BSD-3-Clause
	 */
	

	#include "pico/stdlib.h"
	

	int main() {
	#ifndef PICO_DEFAULT_LED_PIN
	#warning blink example requires a board with a regular LED
	#else
	    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
	    gpio_init(LED_PIN);
	    gpio_set_dir(LED_PIN, GPIO_OUT);
	    while (true) {
	        gpio_put(LED_PIN, 1);
	        sleep_ms(250);
	        gpio_put(LED_PIN, 0);
	        sleep_ms(250);
	    }
	#endif
	}

代码清单:Raspberry Pi Pico 使用 PICO_DEFAULT_LED_PIN 指令来设置 I/O 引脚,并以 250 毫秒的延迟进行闪烁。(代码来源:Raspberry Pi)

根据清单,LED_PIN 被指定为默认引脚;然后调用 C gpio API。gpio_init 用于初始化引脚,而 gpio_set_dir 则用于将 LED_PIN 设置为输出。然后创建一个无限循环,每 250 毫秒切换一次 LED 的状态。

编译应用程序是相对简单的。首先,开发者需要使用以下命令在他们的 Raspberry Pi Pico 文件夹中创建一个构建目录:

mkdir build

cd build

接下来,cmake 需要通过执行以下命令为构建做准备:

cmake

现在,开发者可以换到 blinky 目录并运行 make:

cd blink

make

构建过程的输出将是一个 blinky.uf2 文件。通过按住 BOOTSEL 引脚并给电路板通电,可以将编译好的程序加载到 Raspberry Pi Pico 上。然后,RP2 将作为一个大容量存储设备出现。开发者需要将 blinky.uf2 文件拖到驱动器上,这时,引导程序将安装该应用程序。一旦完成,LED 应该就会开始闪烁。

结语

对于希望能够掌控开发节奏的嵌入式开发者来说,Raspberry Pi Pico 是一个很有吸引力的解决方案。这个方案提供多种选择,包括独立的解决方案或带有无线连接的板卡。此外,其生态系统支持 C 和 C++,以及 MicroPython。开发人员可以选择最适合其应用的语言,然后利用相应的 SDK 来加速软件开发。

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此作者

Jacob Beningo

Jacob Beningo 是一位嵌入式软件顾问,目前与十几个国家的客户保持合作,通过帮助客户改善产品质量、降低成本和加快上市时间来大幅改变他们的业务。Jacob 先后发表了 200 多篇关于嵌入式软件开发技术的文章,是一位广受欢迎的演讲者和技术培训师。他拥有三个学位,其中包括密歇根大学的工程硕士学位。如有需要,欢迎随时通过 jacob@beningo.com 与其联系,也可访问其网站 www.beningo.com,并订阅其月度 Embedded Bytes Newsletter

关于此出版商

DigiKey 北美编辑