树莓派 Pico C SDK 入门 — 环境搭建
为什么会有这个教程?
网上已经有很多关于树莓派的使用教程,但是大部分都是使用 Python 进行教学。如果你只是想玩玩树莓派,那么使用 Python (下文通指 MicroPython) 可以快速实现你想要的效果,你也无须考虑代码编译细节和代码性能。但是如果你想通过树莓派入门学习嵌入式,那么使用 C/C++ SDK 会更合适,因为在实际的商业项目中,大部分项目都是使用 C/C++ 开发,通过使用 C SDK 我们也可以学习到 CMake 编译配置、更底层的接口实现细节。
网络上大部分课程使用 Windows 开发环境,而我平时开发都是使用 Mac 。本教程也是我使用 Mac 开发树莓派的经验总结,如果你也是一位 Mac 用户,那么本教程可以避免你踩很多”坑”。
关于树莓派 Pico
树莓派 Pico 是树莓派基金会发布的微处理器开发板,该产品基于其自研芯片 RP 2040,售价仅为 4 美元。
- 搭载上述 RP 2040 芯片。
- 采用双核 ARM Cortex M0+ 处理器,运行频率 133 MHz。
- 搭载 264 KB 的片上 RAM,板载 2 MB 闪存。
- 主机和设备支持的 USB1.1。
- 支持低功耗的睡眠和休眠模式。
- 采用拖放式编程。
- 拥有 26 个 GPIO 引脚,其中 3 个可用于模拟信号输入(即 3 路 12 位 ADC)。
- 拥有 2 个 SPI、2 个 I2C、2 个 UART、16 路 PWM。
- 片上时钟、计时器;片上浮点库;搭载温度传感器。
- 可通过 Micro USB 供电,也支持 1.8-5.5 V 直流电源供电。因此我们用串联的干电池或者锂电池即可驱动 Pico,这使得 Pico 的应用更加灵活。
- 配备 1 个 LED 灯和一个开关按钮。该按钮用于向 Pico 烧录程序时控制 Pico 进入 USB 大容量存储模式,也可用于通用的输入。
- 40 个引脚均为 “焊孔 + 齿状边缘” 的形态,由用户灵活选择安装方式,便于与其他开发板焊接。
环境搭建
首先我们需要下载安装 C 语言开发的 IDE,我推荐大家使用 VSCode。VSCode 是目前最流行的免费编辑器,没有之一,其拥有丰富的插件扩展。当然,如果你愿意花钱购买JetBrains IDEs 授权,你也可以使用 CLion。
方法一:安装官方 VSCode 扩展 Raspberry Pi Pico
Raspberry Pi Pico 是树莓派官方出品的适用于树莓派 Pico 开发的 VSCode 扩展插件。它可以一建创建基于 Pico SDK 的项目,自动帮你下载 pico sdk 、arm gcc 编译工具、Ninja 编译器 和 Python 环境。基本就是一键安装就可以完成所有步骤,但是依赖比较多,所以下载等待时间比较久。
在 VSCode 插件市场上搜索”pico” ,选择下载 Raspberry Pi Pico 插件。(本插件为预发布版本,会有弹窗提示,点击确认安装即可)
安装完成后,左侧有一个 pico 形状的图标,点击图标显示 Pico 工具选项。
你可以选择创建一个新项目或者导入已经创建的项目。
点击新建项目出现如右图所示的页面,输入项目名称、选择开发板类型、SDK 版本即可创建项目。
方法二:手动下载配置 C SDK
你可以根据官方手册,按照教程一步一步的配置环境和创建项目。
首先,使用 git 拉取 Pico C SDK。
cd ~
mkdir pico
cd pico
# 使用 SSH
git clone git@github.com:raspberrypi/pico-sdk.git --branch master
# 进入sdk 目录
cd pico-sdk
# 拉取并初始化子目录(主要是一些库依赖)
git submodule update --init
下载安装 Cmake 和 交叉编译工具链 arm-none-eabi-gcc
# 使用 HomeBrew 安装 cmake (没有 brew 请自行 Google [安装](https://brew.sh/))
brew install cmake
# 版本检查
cmake --version
不要直接使用**brew**
下载安装 arm-none-eabi-gcc! 不要直接使用**brew**
下载安装 arm-none-eabi-gcc! 不要直接使用**brew**
下载安装 arm-none-eabi-gcc!
进入 Arm GNU Toolchain Downloads,command + F 搜一下“macOS”,找到你的 Mac 对应芯片的链接下载:
可以直接下载.pkg 的安装包,安装完成后,在Application 目录下会多出 ArmGNUToolchain 的工具链文件夹。
配置环境变量
# 编辑.zprofile 或者 .bash_profile
vim .zprofile
# 插入以下内容
# PICO SDK
export PICO_SDK_PATH="$HOME/pico/pico-sdk"
export PICO_TOOLCHAIN_PATH="/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin"
export PATH=/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin:$PATH
# ESC wq 保存退出 vim
source .zprofile
PICO_SDK_PATH 是你刚才拉取 pico-sdk 的目录,PICO_TOOLCHAIN_PATH 是工具链的 bin 目录,export PATH 后即可在终端上运行 arm-none-eabi 工具链命令。
arm-none-eabi-gcc --version
#arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009
#Copyright (C) 2023 Free Software Foundation, Inc.
#This is free software; see the source for copying conditions. There is NO
#warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
完成上面的这些配置后,你就获得了开发树莓派 Pico C 的完整环境,如果你需要 Nijia 编译环境请需要自行安装。
示例项目 - 点个灯
正如软件编程里的 hello world 是每一位入门软件开发的第一个程序 ,而嵌入式开发入门则是点灯(点亮一个发光二极管)。
我们将参照树莓派官方提供的示例工程,一步步创建和编译工程,自己动手实践每一步很重要,这有助于你后续遇到bug 时排查问题,如果你都是使用工具创建整个工程,你不了解编译的细节,当编译出现问题时,你会变得无从下手。
在你的工作空间目录下,创建一个 raspberrypi 目录,用于存放你的树莓派项目。
mkdir raspberrypi
cd raspberrypi
创建点灯项目目录
mkdir blink
cd blink
创建 CmakeLists.txt 和 blink.c 文件
touch blink.c CMakeLists.txt
CMakeLists.txt 是 cmake 项目的配置文件,blink.c 则是我们这次点灯项目的主程序存放文件。
在 CMakeLists.txt 文件中输入一下内容:
# 设置Cmake 最小依赖版本
cmake_minimum_required(VERSION 3.17)
# 设置c/c++ 编译版本
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 导入 pico sdk cmake
include(pico_sdk_import.cmake)
# ====================================================================================
# 设置开发板为 pico w (如果你的开发板是 pico 可以注释这行)
set(PICO_BOARD pico_w CACHE STRING "Board type")
# 设置项目名
project(blink C CXX ASM)
# 初始化sdk
pico_sdk_init()
# 添加执行文件
add_executable(blink
blink.c
)
# 设置项目名称字符串
pico_set_program_name(blink "blink")
# 设置项目版本号
pico_set_program_version(blink "0.1")
# Modify the below lines to enable/disable output over UART/USB
# 是否打开 UART 串口
pico_enable_stdio_uart(blink 0)
# 是否打开USB 串口
pico_enable_stdio_usb(blink 1)
# 添加依赖库 (pico w 必须加入 pico_cyw43_arch_none )
target_link_libraries(blink
pico_stdlib # for core functionality
pico_cyw43_arch_none # we need Wifi to access the GPIO, but we don't need anything else
)
# 设置输出文件
pico_add_extra_outputs(blink)
Cmake 项目依赖 Pico SDK 的 Cmake ( include(pico_sdk_import.cmake) ),所以我们需要将 SDK 的 Cmake 文件拷贝到项目中。输入一下命令拷贝或手动拷贝文件:
cp $PICO_SDK_PATH/external/pico_sdk_import.cmake .
接下编写点亮 LED 的程序,代码如下:
#include "pico/stdlib.h"
const uint LED_PIN = 25;
int main() {
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 0);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(250);
gpio_put(LED_PIN, 0);
sleep_ms(250);
}
代码先导入了 Pico SDK 的标准库,并且在 mian 主入口函数中控制 LED 的开关。Pico 的 LED 默认连接是 GPIO 的 25 号引脚,所以我们首先需要初始化 LED_PIN ,并且设置此 GPIO 为输出模式。并且默认设置LED_PIN 输出信号为 0,即不输出电压。
在一个 while 死循环中,我们不断的切换 LED_PIN 的输出电压,从而达到 LED 灯不断闪烁。闪烁周期为 250 毫秒。
如果你的是 Pico W,那么使用下面的代码,而不是上面的,这是因为 Pico W 的板载 LED 没有连接到 RP2040 GPIO上,而是连接到无线芯片的 GPIO 上了,这就导致上面使用的25
引脚是 Wi-Fi 而不是 LED,这种情况下使用的代码如下:
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
int main() {
stdio_init_all();
if (cyw43_arch_init()) {
printf("Wi-Fi init failed");
return -1;
}
while (true) {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
sleep_ms(250);
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0);
sleep_ms(250);
}
}
接下来,我们新建一个名为 build 的目录来存放构建文件,命令如下:
mkdir build
cd build
下一次构建时,我们可以使用
rm -rf build && mkdir build && cd build
命令来清除整个构建目录,然后再用上面的创建目录创建一个全新的构建目录,这样每次构建都是新的构建文件,防止旧构建文件干扰,导致编译失败。
使用下面的命令生成构建文件和编译代码:
cmake ..
make -j4
#Scanning dependencies of target ELF2UF2Build
#Scanning dependencies of target boot_stage2_original
#[ 0%] Creating directories for 'ELF2UF2Build'
# .
# .
# .
#[100%] Linking CXX executable blink.elf
#[100%] Built target blink
cmake .. 命令会使用 cmake 编译上一级目录下的文件,make -j4 命令则会开启 4 个线程去编译当前目录,当然你可以使用 make -j8 (8个线程同时编译) 或者 make . 命令编译项目。
编译完成后,你可以在 build 目录下找到 blink.uf2 文件。
烧录程序到 PICO
导入的方法很简单,首先拔下来你的树莓派 Pico,然后按住树莓派上的白色按钮“BOOTSEL”,如下
插入 Micro USB 数据线,放开按键。电脑会将树莓派 PICO 识别为硬盘,将刚才编译好的 uf2 文件拖拽拷贝到硬盘,拷贝完成后树莓派 PICO 将自动重启,硬盘被推出,烧录完成,树莓派会运行烧录的代码。
你可以看到 LED 灯间隔 250 毫秒闪烁。
常见问题:
Cmake 编译失败 ?
cmake 编译失败是经常出现的问题,首先排查环境是否配置好,第二,查看编译错误信息,如果有明显可以看懂的提示,比如代码编译报错,则可以针对性的解决问题。第三,可以将编译错误信息复制 Google 搜索一下。
按住 BootSEL 插入 USB-C 没有反应 ?
首先检查数据线是否支持数据传输(有些线只支持充电,换根线试一下);第二,检查是否连接外部电源,比如插了 GPIO 38 、GPIO 39 ;第三,按的时间是否太短,多试几次。
如有其他疑问,欢迎大家回复一起讨论。
希望这篇文章可以帮助大家更好的入门树莓派 PICO,内容皆为原创,码字不易还请大家动动小手点个赞,谢谢~~
参考:
https://blog.csdn.net/qq_33919450/article/details/132136272
作者也是按照上面这篇文章一点点调试的,希望多一点上面这种原创文章,拒绝直接 copy 内容。