树莓派 Pico C SDK 入门 — 环境搭建

环境搭建 - 图2为什么会有这个教程?

网上已经有很多关于树莓派的使用教程,但是大部分都是使用 Python 进行教学。如果你只是想玩玩树莓派,那么使用 Python (下文通指 MicroPython) 可以快速实现你想要的效果,你也无须考虑代码编译细节和代码性能。但是如果你想通过树莓派入门学习嵌入式,那么使用 C/C++ SDK 会更合适,因为在实际的商业项目中,大部分项目都是使用 C/C++ 开发,通过使用 C SDK 我们也可以学习到 CMake 编译配置、更底层的接口实现细节。

网络上大部分课程使用 Windows 开发环境,而我平时开发都是使用 Mac 。本教程也是我使用 Mac 开发树莓派的经验总结,如果你也是一位 Mac 用户,那么本教程可以避免你踩很多”坑”。

关于树莓派 Pico

环境搭建 - 图3

树莓派 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 插件。(本插件为预发布版本,会有弹窗提示,点击确认安装即可)

环境搭建 - 图4环境搭建 - 图5

安装完成后,左侧有一个 pico 形状的图标,点击图标显示 Pico 工具选项。

你可以选择创建一个新项目或者导入已经创建的项目。

环境搭建 - 图6

点击新建项目出现如右图所示的页面,输入项目名称、选择开发板类型、SDK 版本即可创建项目。

方法二:手动下载配置 C SDK

你可以根据官方手册,按照教程一步一步的配置环境和创建项目。

首先,使用 git 拉取 Pico C SDK。

  1. cd ~
  2. mkdir pico
  3. cd pico
  4. # 使用 SSH
  5. git clone git@github.com:raspberrypi/pico-sdk.git --branch master
  6. # 进入sdk 目录
  7. cd pico-sdk
  8. # 拉取并初始化子目录(主要是一些库依赖)
  9. git submodule update --init

下载安装 Cmake 和 交叉编译工具链 arm-none-eabi-gcc

  1. # 使用 HomeBrew 安装 cmake (没有 brew 请自行 Google [安装](https://brew.sh/))
  2. brew install cmake
  3. # 版本检查
  4. 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 对应芯片的链接下载:

环境搭建 - 图7环境搭建 - 图8

可以直接下载.pkg 的安装包,安装完成后,在Application 目录下会多出 ArmGNUToolchain 的工具链文件夹。

配置环境变量

  1. # 编辑.zprofile 或者 .bash_profile
  2. vim .zprofile
  3. # 插入以下内容
  4. # PICO SDK
  5. export PICO_SDK_PATH="$HOME/pico/pico-sdk"
  6. export PICO_TOOLCHAIN_PATH="/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin"
  7. export PATH=/Applications/ArmGNUToolchain/13.2.Rel1/arm-none-eabi/bin:$PATH
  8. # ESC wq 保存退出 vim
  9. source .zprofile

PICO_SDK_PATH 是你刚才拉取 pico-sdk 的目录,PICO_TOOLCHAIN_PATH 是工具链的 bin 目录,export PATH 后即可在终端上运行 arm-none-eabi 工具链命令。

  1. arm-none-eabi-gcc --version
  2. #arm-none-eabi-gcc (Arm GNU Toolchain 13.2.rel1 (Build arm-13.7)) 13.2.1 20231009
  3. #Copyright (C) 2023 Free Software Foundation, Inc.
  4. #This is free software; see the source for copying conditions. There is NO
  5. #warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

完成上面的这些配置后,你就获得了开发树莓派 Pico C 的完整环境,如果你需要 Nijia 编译环境请需要自行安装。

示例项目 - 点个灯

正如软件编程里的 hello world 是每一位入门软件开发的第一个程序 ,而嵌入式开发入门则是点灯(点亮一个发光二极管)。

我们将参照树莓派官方提供的示例工程,一步步创建和编译工程,自己动手实践每一步很重要,这有助于你后续遇到bug 时排查问题,如果你都是使用工具创建整个工程,你不了解编译的细节,当编译出现问题时,你会变得无从下手。

在你的工作空间目录下,创建一个 raspberrypi 目录,用于存放你的树莓派项目。

  1. mkdir raspberrypi
  2. cd raspberrypi

创建点灯项目目录

  1. mkdir blink
  2. cd blink

创建 CmakeLists.txt 和 blink.c 文件

  1. touch blink.c CMakeLists.txt

CMakeLists.txt 是 cmake 项目的配置文件,blink.c 则是我们这次点灯项目的主程序存放文件。

在 CMakeLists.txt 文件中输入一下内容:

  1. # 设置Cmake 最小依赖版本
  2. cmake_minimum_required(VERSION 3.17)
  3. # 设置c/c++ 编译版本
  4. set(CMAKE_C_STANDARD 11)
  5. set(CMAKE_CXX_STANDARD 17)
  6. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  7. # 导入 pico sdk cmake
  8. include(pico_sdk_import.cmake)
  9. # ====================================================================================
  10. # 设置开发板为 pico w (如果你的开发板是 pico 可以注释这行)
  11. set(PICO_BOARD pico_w CACHE STRING "Board type")
  12. # 设置项目名
  13. project(blink C CXX ASM)
  14. # 初始化sdk
  15. pico_sdk_init()
  16. # 添加执行文件
  17. add_executable(blink
  18. blink.c
  19. )
  20. # 设置项目名称字符串
  21. pico_set_program_name(blink "blink")
  22. # 设置项目版本号
  23. pico_set_program_version(blink "0.1")
  24. # Modify the below lines to enable/disable output over UART/USB
  25. # 是否打开 UART 串口
  26. pico_enable_stdio_uart(blink 0)
  27. # 是否打开USB 串口
  28. pico_enable_stdio_usb(blink 1)
  29. # 添加依赖库 (pico w 必须加入 pico_cyw43_arch_none )
  30. target_link_libraries(blink
  31. pico_stdlib # for core functionality
  32. pico_cyw43_arch_none # we need Wifi to access the GPIO, but we don't need anything else
  33. )
  34. # 设置输出文件
  35. pico_add_extra_outputs(blink)

Cmake 项目依赖 Pico SDK 的 Cmake ( include(pico_sdk_import.cmake) ),所以我们需要将 SDK 的 Cmake 文件拷贝到项目中。输入一下命令拷贝或手动拷贝文件:

  1. cp $PICO_SDK_PATH/external/pico_sdk_import.cmake .

接下编写点亮 LED 的程序,代码如下:

  1. #include "pico/stdlib.h"
  2. const uint LED_PIN = 25;
  3. int main() {
  4. gpio_init(LED_PIN);
  5. gpio_set_dir(LED_PIN, GPIO_OUT);
  6. gpio_put(LED_PIN, 0);
  7. while (true) {
  8. gpio_put(LED_PIN, 1);
  9. sleep_ms(250);
  10. gpio_put(LED_PIN, 0);
  11. sleep_ms(250);
  12. }

代码先导入了 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,这种情况下使用的代码如下:

  1. #include "pico/stdlib.h"
  2. #include "pico/cyw43_arch.h"
  3. int main() {
  4. stdio_init_all();
  5. if (cyw43_arch_init()) {
  6. printf("Wi-Fi init failed");
  7. return -1;
  8. }
  9. while (true) {
  10. cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
  11. sleep_ms(250);
  12. cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0);
  13. sleep_ms(250);
  14. }
  15. }

接下来,我们新建一个名为 build 的目录来存放构建文件,命令如下:

  1. mkdir build
  2. cd build

下一次构建时,我们可以使用

  1. rm -rf build && mkdir build && cd build

命令来清除整个构建目录,然后再用上面的创建目录创建一个全新的构建目录,这样每次构建都是新的构建文件,防止旧构建文件干扰,导致编译失败。

使用下面的命令生成构建文件和编译代码:

  1. cmake ..
  2. make -j4
  3. #Scanning dependencies of target ELF2UF2Build
  4. #Scanning dependencies of target boot_stage2_original
  5. #[ 0%] Creating directories for 'ELF2UF2Build'
  6. # .
  7. # .
  8. # .
  9. #[100%] Linking CXX executable blink.elf
  10. #[100%] Built target blink

cmake .. 命令会使用 cmake 编译上一级目录下的文件,make -j4 命令则会开启 4 个线程去编译当前目录,当然你可以使用 make -j8 (8个线程同时编译) 或者 make . 命令编译项目。

编译完成后,你可以在 build 目录下找到 blink.uf2 文件。

环境搭建 - 图9

环境搭建 - 图10

烧录程序到 PICO

导入的方法很简单,首先拔下来你的树莓派 Pico,然后按住树莓派上的白色按钮“BOOTSEL”,如下

环境搭建 - 图11环境搭建 - 图12

插入 Micro USB 数据线,放开按键。电脑会将树莓派 PICO 识别为硬盘,将刚才编译好的 uf2 文件拖拽拷贝到硬盘,拷贝完成后树莓派 PICO 将自动重启,硬盘被推出,烧录完成,树莓派会运行烧录的代码。

环境搭建 - 图13环境搭建 - 图14

你可以看到 LED 灯间隔 250 毫秒闪烁。

常见问题:

Cmake 编译失败 ?

cmake 编译失败是经常出现的问题,首先排查环境是否配置好,第二,查看编译错误信息,如果有明显可以看懂的提示,比如代码编译报错,则可以针对性的解决问题。第三,可以将编译错误信息复制 Google 搜索一下。

按住 BootSEL 插入 USB-C 没有反应 ?

首先检查数据线是否支持数据传输(有些线只支持充电,换根线试一下);第二,检查是否连接外部电源,比如插了 GPIO 38 、GPIO 39 ;第三,按的时间是否太短,多试几次。

如有其他疑问,欢迎大家回复一起讨论。

希望这篇文章可以帮助大家更好的入门树莓派 PICO,内容皆为原创,码字不易还请大家动动小手点个赞,谢谢~~

参考:

https://blog.csdn.net/qq_33919450/article/details/132136272

作者也是按照上面这篇文章一点点调试的,希望多一点上面这种原创文章,拒绝直接 copy 内容。