# RP2040_Pico_W **Repository Path**: wavepeak_yang/RP2040_Pico_W ## Basic Information - **Project Name**: RP2040_Pico_W - **Description**: RP2040_Pico_W的使用总结 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-03-07 - **Last Updated**: 2026-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## RP2040_Pico_W的C代码部署总结(依赖DeepSeek的强力AI辅助) - 1.开发工具相关 - 2.编写调试代码 - 3.编译代码 && 下载和烧录编译产物 ## 开发环境相关 - 1.windows的应用商店安装最新版的Ubuntu,例如:ubuntu 24.04.1 LTS - 2.安装必要的工具链 - 添加 Kitware 的 APT 仓库来获取更新的 CMake 版本: - wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - - sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ noble main' - sudo apt update 3.安装更新的 CMake - sudo apt install cmake 4.然后安装 ARM 工具链 - sudo apt install gcc-arm-none-eabi - sudo apt install python3 python3-pip 5.安装完成后,验证工具链: - 检查 ARM GCC:arm-none-eabi-gcc --version - 检查 CMake:cmake --version - 检查 Python:python3 --version 6.获取Pico SDK - mkdir -p /mnt/e/my_project_rp2040 - cd /mnt/e/my_project_rp2040 - git clone -b master https://github.com/raspberrypi/pico-sdk.git - cd pico-sdk - git submodule update --init 7.设置环境变量 (添加到 ~/.bashrc 或 ~/.zshrc) - export PICO_SDK_PATH=/mnt/e/my_project_rp2040/pico-sdk - source ~/.bashrc - 确认PICO_SDK_PATH 已设置且正确:echo $PICO_SDK_PATH ## 创建项目结构 my_pico_project/ ├── CMakeLists.txt ├── pico_sdk_import.cmake └── src/ └── main.c - 1.从Pico SDK复制pico_sdk_import.cmake文件到创建的项目文件夹的根目录 - 2.进入项目根目录:cd my_project_rp2040 - 3.检查是否有pico_sdk_import.cmake文件:ls -la - 如果没有的话,从Pico SDK 复制一份:cp $PICO_SDK_PATH/external/pico_sdk_import.cmake 4.CMakeLists.txt的配置信息 ```cmake cmake_minimum_required(VERSION 3.13) # 导入 Pico SDK(如果 SDK 不在标准路径,可先设置 PICO_SDK_PATH) include(pico_sdk_import.cmake) # 设置目标板为 Pico W(必须在 project 之前) set(PICO_BOARD pico_w) # 定义项目名称和编程语言 project(pico_w_blink C CXX ASM) # 初始化 SDK(必须) pico_sdk_init() # 在 pico_sdk_init() 之后添加 # message(STATUS "Pico SDK Version: ${PICO_SDK_VERSION_STRING}") # 添加可执行文件 add_executable(pico_w_blink src/main.c ) # 链接必要的库(注意只保留一个 cyw43 架构) target_link_libraries(pico_w_blink pico_stdlib # 包含基础库和 stdio pico_cyw43_arch_lwip_poll # Pico W 无线架构(轮询模式) ) # 在 target_link_libraries 之后添加 target_include_directories(pico_w_blink PRIVATE ${PICO_SDK_PATH}/src/rp2_common/pico_lwip/include ${PICO_SDK_PATH}/src/rp2_common/pico_cyw43_arch/include ${PICO_SDK_PATH}/lib/lwip/src/include ${PICO_SDK_PATH}/lib/cyw43-driver/src ) # 生成 UF2 等输出文件 pico_add_extra_outputs(pico_w_blink) # 启用 USB 输出(用于 printf),禁用 UART(可选) pico_enable_stdio_usb(pico_w_blink 1) pico_enable_stdio_uart(pico_w_blink 0) ``` 5.检查cyw43-driver子模块是否存在 - 检查命令:ls -la $PICO_SDK_PATH/lib/cyw43-driver/ - 如果不存在,到pico-sdk网站下载cyw43-driver压缩包解压到本地同样目录;网址:https://github.com/raspberrypi/pico-sdk/ - 在Pico SDK目录下,查找cyw43_arch.h文件:find $PICO_SDK_PATH -name "cyw43_arch.h" | head -5 6.基础示例代码 (src/main.c) ```c #include "pico/stdlib.h" #include "pico/cyw43_arch.h" #include "hardware/gpio.h" int main() { // 初始化标准库 stdio_init_all(); // 初始化WiFi芯片 if (cyw43_arch_init()) { printf("WiFi初始化失败\n"); return -1; } // 设置LED引脚(Pico W板载LED) const uint LED_PIN = CYW43_WL_GPIO_LED_PIN; while (true) { // 点亮LED cyw43_arch_gpio_put(LED_PIN, 1); printf("LED ON\n"); sleep_ms(500); // 熄灭LED cyw43_arch_gpio_put(LED_PIN, 0); printf("LED OFF\n"); sleep_ms(500); } return 0; } ``` ## 创建构建目录并编译 - cd my_pico_project/ - mkdir build - rm -rf build/* - cd build 1.如果是编译普通的LED反转驱动,需要使用这个命令: - cmake .. 2.如果是编译cyw43-driver驱动,需要使用这个命令,指定板型为Pico W: - cmake -DPICO_BOARD=pico_w .. - make -j4 3.构建输出 构建完成后会生成以下文件: - my_pico_project.uf2 - 用于拖放编程 - my_pico_project.elf - 用于调试 - my_pico_project.bin - 二进制文件 ## 部署到Pico W 1.UF2文件部署 - 按住Pico W上的BOOTSEL按钮 - 通过USB连接电脑 - 释放BOOTSEL按钮 - 将生成的.uf2文件拖放到出现的RPI-RP2驱动器 - Pico W会自动重启并运行程序 2.使用picotool(命令行工具)部署 安装picotool - git clone https://github.com/raspberrypi/picotool.git 安装必要的 USB 库 - sudo apt update - sudo apt install libusb-1.0-0-dev - cd picotool - mkdir build - cd build 配置 CMake 启用 USB 支持 - cmake -DPICOTOOL_USB=ON .. - make -j4 - sudo cp picotool /usr/local/bin/ - picotool version --verbose 部署固件 - picotool load my_pico_project.uf2 ## 优化编译选项 在CMakeLists.txt中添加: - 1.优化级别 - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2") - 2.调试信息 - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") ## 内存配置 1.根据项目需求调整内存分配在CMakeLists.txt中设置: - pico_set_binary_type(my_pico_project no_flash) ## 整体构建流程 main.c的CMakeLists.txt是一个**构建配置文件**,告诉 CMake 如何编译、链接Pico W 项目, 最终生成可烧录的二进制文件。下面逐行解释一下: --- ### **1. 基础设置** ```cmake cmake_minimum_required(VERSION 3.13) ``` - **作用**:指定所需 CMake 的最低版本(3.13) - **生成**:无直接输出,但确保使用兼容的 CMake 版本 ```cmake include(pico_sdk_import.cmake) ``` - **作用**:导入 Pico SDK 的构建系统,加载所有预定义的函数和变量(设置CMAKE_TOOLCHAIN_FILE变量指定工具链文件) - CMake调用指定的工具链文件的位置:/usr/share/cmake-4.2/Modules/CMakeDetermineSystem.cmake(146) - **生成**:使后续能使用 `pico_sdk_init()`、`pico_add_extra_outputs()` 等 SDK 函数 ```cmake set(PICO_BOARD pico_w) ``` - **作用**:指定目标硬件为 Pico W(影响引脚定义、无线芯片支持等) - **生成**:使编译器包含 `boards/pico_w.h`,定义 `CYW43_WL_GPIO_LED_PIN` 等板级常量 ```cmake project(pico_w_blink C CXX ASM) ``` - **作用**:定义项目名称和支持的编程语言(C、C++、汇编) - **生成**:创建项目作用域,设置输出文件名前缀为 `pico_w_blink` ```cmake pico_sdk_init() ``` - **作用**:初始化 SDK,设置编译器、查找依赖、配置工具链 - **生成**:确定编译选项、包含路径,检查子模块(如TinyUSB) --- ### **2. 可执行文件定义** ```cmake add_executable(pico_w_blink src/main.c) ``` - **作用**:创建可执行文件目标,指定源文件 - **生成**:告诉 CMake 要生成 `pico_w_blink.elf`,将 `main.c` 加入编译列表 --- ### **3. 链接库** ```cmake target_link_libraries(pico_w_blink pico_stdlib # 包含基础库和 stdio pico_cyw43_arch_lwip_poll # Pico W 无线架构(轮询模式) ) ``` - **作用**:链接必要的 SDK 库到可执行文件 - **生成**: - **`pico_stdlib`**:拉取核心库(硬件抽象、定时器、GPIO、printf 等) - **`pico_cyw43_arch_lwip_poll`**:拉取无线芯片驱动、lwIP 网络栈(轮询模式) 这些库会递归引入依赖(如 `hardware_gpio`、`pico_lwip`、`cyw43-driver` 等) --- ### **4. 额外包含路径(手动修复)** ```cmake target_include_directories(pico_w_blink PRIVATE ${PICO_SDK_PATH}/src/rp2_common/pico_lwip/include ${PICO_SDK_PATH}/src/rp2_common/pico_cyw43_arch/include ${PICO_SDK_PATH}/lib/lwip/src/include ${PICO_SDK_PATH}/lib/cyw43-driver/src ) ``` - **作用**:手动添加关键头文件路径(解决 SDK 自动传播失效的问题) - **生成**:确保编译时能找到 `arch/sys_arch.h`、`cyw43.h` 等关键头文件 --- ### **5. 输出文件生成** ```cmake pico_add_extra_outputs(pico_w_blink) ``` - **作用**:为可执行文件生成多种格式的输出文件 - **生成**: - `pico_w_blink.elf` - 标准可执行文件 - `pico_w_blink.uf2` - 可直接拖放烧录的格式 - `pico_w_blink.hex` - Intel HEX 格式 - `pico_w_blink.bin` - 原始二进制 - `pico_w_blink.dis` - 反汇编文件(调试用) - `pico_w_blink.map` - 内存映射文件 --- ### **6. 输入输出配置** ```cmake pico_enable_stdio_usb(pico_w_blink 1) pico_enable_stdio_uart(pico_w_blink 0) ``` - **作用**:配置标准输入输出(printf)的 backend - **生成**: - `pico_enable_stdio_usb(1)`:启用 USB CDC 串口,`printf` 输出到 USB - `pico_enable_stdio_uart(0)`:禁用硬件 UART 输出 最终效果:程序中的 `printf` 会通过 USB 发送到电脑(需串口监视器查看) --- ### **7. 构建命令** ```cmake cmake -DPICO_BOARD=pico_w .. # 配置构建系统并指定目标硬件为 Pico W make -j4 ``` | 部分 | 含义 | |------|------------| | **cmake** | CMake 配置命令 | | **-D** | 定义变量的选项(类似 C 语言的 #define)| | **PICO_BOARD=pico_w** | 定义变量名为 PICO_BOARD,值为 pico_w | | **..** | 指定 CMakeLists.txt 所在的目录(上级目录) | - 运行 cmake -DPICO_BOARD=pico_w .. 时,实际发生的步骤: graph TD A[cmake -DPICO_BOARD=pico_w ..] --> B[读取 CMakeLists.txt] B --> C[设置 PICO_BOARD=pico_w] C --> D[包含 pico_sdk_import.cmake] D --> E[pico_sdk_init] E --> F[查找 boards/pico_w.h] F --> G[定义板级常量] G --> H[启用 CYW43 无线支持] H --> I[配置工具链] I --> J[生成构建文件] --- | 部分 | 含义 | |------|------------| | **make** | GNU Make 构建工具,读取 Makefile 并执行编译 | | **-j** | --jobs 的简写,指定并行任务数 | | **4** | 同时运行的编译任务数量 | - 实际作用:并行编译多个源文件 --- ## **整体构建流程** | 阶段 | 生成的内容 | 最终产物 | |------|------------|----------| | **配置** | CMakeCache.txt、构建规则 | 确定编译选项、依赖关系 | | **编译** | 每个 `.c` → `.o` 目标文件 | 几十个 `.o` 文件(SDK 和自己的代码) | | **链接** | 所有 `.o` + 库 → `.elf` | `pico_w_blink.elf` | | **后处理** | 格式转换 | `.uf2`、`.hex`、`.bin`、`.dis`、`.map` | ## **关键生成文件详解** | 文件 | 用途 | |------|------| | `pico_w_blink.elf` | 带调试信息的可执行文件(给调试器用) | | `pico_w_blink.uf2` | **烧录到 Pico W 的文件**(拖放即可) | | `pico_w_blink.hex` | Intel HEX 格式(某些烧录工具用) | | `pico_w_blink.map` | 内存分布图(分析 RAM/Flash 使用) | | `pico_w_blink.dis` | 反汇编代码(调试优化问题) | ## **写的代码在其中的位置** `src/main.c` 通过 `add_executable` 加入编译链,经过: 1. **预处理**:展开宏、包含头文件 2. **编译**:生成汇编/机器码 3. **链接**:与 SDK 库(如 `cyw43_arch_gpio_put` 的实现)合并 4. **后处理**:转换成可烧录的 `.uf2` 最终,Pico W 执行的就是 `main()` 函数中的 LED 闪烁逻辑。 --- ## project和pico-sdk代码关系的一些总结 1.build/pico-sdk/src/rp2_common/pico_stdlib和pico-sdk/src/rp2_common/pico_stdlib的关系 - build/pico-sdk/src/rp2_common/pico_stdlib - CMake构建系统为了组织编译产物而创建的**影子目录** - **存放编译产物**:pico_stdlib 本身是一个“聚合库”,通过target_link_libraries将其他基础库(如hardware_gpio, pico_runtime等)组合在一起。作为构建系统的一个逻辑节点用于管理依赖关系和生成传递性编译命令。 - **保持源码目录清洁**:将编译过程中产生的临时文件(如.d依赖文件)和最终的目标文件全部隔离在build目录下。源代码目录 (pico-sdk) 始终保持着原始状态不会被污染。 - **生成传递性依赖**:还会生成一些用于描述pico_stdlib这个“库接口”的文件,告诉链接器链接pico_stdlib时,实际需要链接哪些具体的底层库,以及需要哪些头文件路径。 - pico-sdk/src/rp2_common/pico_stdlib - SDK**源码目录** - 二者是**镜像**与**源头**的关系 **关键生成文件详解** | 目录层级 | pico-sdk/src/rp2_common/pico_stdlib | build/pico-sdk/src/rp2_common/pico_stdlib (构建目录) | | --- | --- | --- | | **文件性质** | 包含源代码和 CMakeLists.txt | 包含编译产生的中间文件(.o)和 cmake_install.cmake、Makefile 等构建系统生成的文件 | | **在构建中的角色** | 作为输入,CMake读取这里的 CMakeLists.txt,了解如何编译pico_stdlib | 作为输出。是编译器写回目标文件的地方,也是 make 命令执行的工作目录。 | | **生命周期** | 永久存在是SDK的一部分,只读(在构建意义上)。 | 是cmake命令的产物,可以被安全地删除和重新生成。 | 💡 总结一下 - **源码目录** (pico-sdk/.../pico_stdlib) 是“设计图纸”,定义了pico_stdlib库由哪些部分组成。 - **构建目录** (build/.../pico_stdlib) 是“施工现场”,cmake 命令在这里根据图纸创建了脚手架(Makefile),make 命令则在这里调用编译器,最终将你的 main.c和pico_stdlib涉及的所有底层模块,编译成.o和.a文件,最终链接成.uf2文件。 --- ## 编译pico-examples 1.下载pico-examples库 - git clone git@github.com:raspberrypi/pico-examples.git 2.检查pico-sdk库下是否有cyw43-driver和lwip,检查命令如下: - ls -l $PICO_SDK_PATH/lib/cyw43-driver - ls -l $PICO_SDK_PATH/lib/lwip 如果上面两个库都没有,需要进行下载: - git clone git@github.com:georgerobotics/cyw43-driver.git - git clone https://git.savannah.nongnu.org/git/lwip.git 3.编译pico-examples库 - cd pico-examples/ - mkdir build - rm -rf build/* - cd build 如果是编译cyw43-driver驱动,需要使用这个命令,指定板型为Pico W: - cmake -DPICO_BOARD=pico_w .. - make -j4 > build.log