树莓派Pico学习笔记-Win下Clion环境搭建

最近掏出了吃灰已久的合宙RP2040,打算先搭建好环境,借助它学习一下win下交叉编译与调试环境的搭建,以及CMake与Clion的使用。

下载安装

首先完成以下软件的安装:

  • Clion
  • CMake——C语言生成器(Clion自带)
  • ninja——C语言构建器(同make,nmake功能)(Clion自带)
  • git——主要用于从github下载代码
  • arm-gcc工具链——编译代码
  • mingw——win上的gcc,用来编译elf2uf2工具(Clion自带)
  • OpenOCD——调试工具
  • Pico-SDK

注意添加到环境变量

基于Clion

创建工程目录

将SDK/external目录下的pico_sdk_import.cmake复制到工程目录。

添加程序代码文件main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 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
}

添加CMakeLists.txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cmake_minimum_required(VERSION 3.13)

# initialize the SDK directly
include(pico_sdk_import.cmake)
project(picotest)

# initialize the Raspberry Pi Pico SDK
pico_sdk_init()

add_executable(blink main.c)

# pull in common dependencies
target_link_libraries(blink pico_stdlib)

# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(blink)

添加工具链

这里基本与STM32环境的搭建过程一样。

在Clion的设置中构建、部署、执行->工具链添加新工具链ARM-GCC

CMake自带,构建工具使用自带的Ninja。选择编译器和调试器为上面安装的ARM工具链中的。

其实无所谓,树莓派Pico的SDK已经指定好了,只需要将编译器添加到环境变量就可以直接用了,搞的我还以为mingw可以交叉编译了

之后点击CMake,选择工具链为刚刚创建的ARM-GCC,在下面的环境中添加PICO_SDK_PATH环境变量。

编译下载调试

编译后在build中就会有uf2文件可以直接下载,或者使用调试器下载调试。

配置调试也与stm32相似,只需要注意一下配置文件的写法:

1
2
3
4
#pico.cfg
source [find interface/picoprobe.cfg]

source [find target/rp2040.cfg]

基于命令行的搭建——接触底层

添加环境变量

image-20240207171248032

将PicoSDK目录添加到环境变量PICO_SDK_PATH

或者在使用CMake命令时使用-DPICO_SDK_PATH=参数传递。

或者在txt中使用SET设置。

创建工程文件夹

将SDK/external目录下的pico_sdk_import.cmake复制到工程目录。

添加程序代码文件main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 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
}

添加CMakeLists.txt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.13)

# initialize the SDK directly
include(pico_sdk_import.cmake)
#这句对交叉编译很重要,跳过编译器检查
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
project(picotest)

# initialize the Raspberry Pi Pico SDK
pico_sdk_init()

add_executable(blink main.c)

# pull in common dependencies
target_link_libraries(blink pico_stdlib)

# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(blink)

构建编译工程

创建build文件夹,进入,在该文件夹下执行命令:

1
cmake .. -G Ninja

-G Ninja是为了生成Ninja使用的文件。否则,在Windos下,会优先使用VS的nmake。这里没有装vs,会提示nmake找不到。

当然也可以使用mingw自带的msys2,修改-G的参数即可。

也可以在这里传入PICO_SDK_PATH。

构建完成后,执行命令:

1
cmake --build .

这里需要注意安装一个c语言编译器,因为这里会编译elf2uf2工具。

之后就可以在目录下看见uf2文件了。

下载elf文件并调试

详见参考文章。

这里注意,openocd的配置文件已经在其目录下了,可以自行查看支持种类。

使用GDB远程调试功能连接到OpenOCD进行调试。

参考文章

使用 DAPLink 调试烧录树莓派 Picohexo