一、前言
树莓派pico/pico2是树莓派推出的基于自家MCU(RP2040、RP2350)的核心板。现已有很多基于RP2040和RP2350芯片的各类核心板和开发板,也有用户自己制作的板子。如果用户使用的板子,其引脚定义、Flash配置和树莓派pico/pico2相差比较大,该如何处理?
二、pico-sdk的板子定义
pico-sdk是树莓派MCU软件开发的基础,所有树莓派MCU软件都是在这个sdk基础上开发的。pico-sdk对于不同的板子处理方式是使用pico-sdk\src\boards\include\boards下的对应板子的头文件来进行软件配置,如根据板子头文件内stdio串口引脚号初始化串口、根据头文件定义的Flash容量配置link文件中MEMORY的FLASH字段。在pico-sdk\src\boards\include\boards目录下已包含很多核心板和开发板的定义。
哇,2.2.0版sdk已经有131个板子定义了。
如果,这里现有的板子定义还是与您的板子不同,您可以加个自己的头文件,自定义一个板子。
三、pico-sdk的板子定义怎么用
下面是使用vscode插件raspberry-pi-pico建立新的C工程截图。
好吧,非树莓派pico/pico2的板子板子类型都被归到了“Other”。建工程时,板子和树莓派pico/pico2不兼容时就选这个“Other”吧。
建立工程后,在vscode界面右下角有个Board设置。
在这个位置上点一下就可以设置pico-sdk\src\boards\include\boards目录下的各种板子。上图的pico_plus_rp2350是我自己定义的板子。
四、怎么写自定义板子头文件
Step1: 拷贝并重命名一个相近的板子头文件。我的pico_plus_rp2350板子是在pico2板子上增加了个PSRAM芯片,所以直接复制个pico2头文件。
Step2:修改
我的pico_plus_rp2350板子在pico2基础上修改很少,除了定义新的板名宏,就是增加了PSRAM片选引脚定义。
下面是我的pico_plus_rp2350.h文件。
/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ // ----------------------------------------------------- // NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO // SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES // ----------------------------------------------------- // This header may be included by other board headers as // "boards/pico_plus_rp2350.h" #ifndef _BOARDS_PICO_PLUS_RP2350_H #define _BOARDS_PICO_PLUS_RP2350_H pico_board_cmake_set(PICO_PLATFORM, rp2350) // For board detection #define PICO_PLUS_RP2350 // --- RP2350 VARIANT --- #define PICO_RP2350A 1 // --- BOARD SPECIFIC --- #define PICO_PLUS_PSRAM_CS_PIN 19 // --- UART --- #ifndef PICO_DEFAULT_UART #define PICO_DEFAULT_UART 0 #endif #ifndef PICO_DEFAULT_UART_TX_PIN #define PICO_DEFAULT_UART_TX_PIN 0 #endif #ifndef PICO_DEFAULT_UART_RX_PIN #define PICO_DEFAULT_UART_RX_PIN 1 #endif // --- LED --- #ifndef PICO_DEFAULT_LED_PIN #define PICO_DEFAULT_LED_PIN 25 #endif // no PICO_DEFAULT_WS2812_PIN // --- I2C --- #ifndef PICO_DEFAULT_I2C #define PICO_DEFAULT_I2C 0 #endif #ifndef PICO_DEFAULT_I2C_SDA_PIN #define PICO_DEFAULT_I2C_SDA_PIN 4 #endif #ifndef PICO_DEFAULT_I2C_SCL_PIN #define PICO_DEFAULT_I2C_SCL_PIN 5 #endif // --- SPI --- #ifndef PICO_DEFAULT_SPI #define PICO_DEFAULT_SPI 0 #endif #ifndef PICO_DEFAULT_SPI_SCK_PIN #define PICO_DEFAULT_SPI_SCK_PIN 18 #endif #ifndef PICO_DEFAULT_SPI_TX_PIN #define PICO_DEFAULT_SPI_TX_PIN 19 #endif #ifndef PICO_DEFAULT_SPI_RX_PIN #define PICO_DEFAULT_SPI_RX_PIN 16 #endif #ifndef PICO_DEFAULT_SPI_CSN_PIN #define PICO_DEFAULT_SPI_CSN_PIN 17 #endif // --- FLASH --- #define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1 #ifndef PICO_FLASH_SPI_CLKDIV #define PICO_FLASH_SPI_CLKDIV 2 #endif pico_board_cmake_set_default(PICO_FLASH_SIZE_BYTES, (4 * 1024 * 1024)) #ifndef PICO_FLASH_SIZE_BYTES #define PICO_FLASH_SIZE_BYTES (4 * 1024 * 1024) #endif // Drive high to force power supply into PWM mode (lower ripple on 3V3 at light // loads) #define PICO_SMPS_MODE_PIN 23 // The GPIO Pin used to read VBUS to determine if the device is battery powered. #ifndef PICO_VBUS_PIN #define PICO_VBUS_PIN 24 #endif // The GPIO Pin used to monitor VSYS. Typically you would use this with ADC. // There is an example in adc/read_vsys in pico-examples. #ifndef PICO_VSYS_PIN #define PICO_VSYS_PIN 29 #endif pico_board_cmake_set_default(PICO_RP2350_A2_SUPPORTED, 1) #ifndef PICO_RP2350_A2_SUPPORTED #define PICO_RP2350_A2_SUPPORTED 1 #endif #endif修改自定义板子头文件时,除了板名宏外还有下面的宏定义是要关注的(个人以为)。
| 宏 | 功能 | 常见值 |
| PICO_RP2350A | RP2350芯片版本 | 1:RP2350A 0:RP2350B |
| PICO_DEFAULT_UART | stdio串口号 | 0 |
| PICO_DEFAULT_UART_TX_PIN | stdio串口tx引脚pin值 | 0 |
| PICO_DEFAULT_UART_RX_PIN | stdio串口rx引脚pin值 | 1 |
| PICO_BOOT_STAGE2_CHOOSE_W25Q080 | MCU的FLASH使用W25Q080兼容SPI Flash,如果是其它QSPI Flash如Atmel AT25SF128A得换个宏 | |
| PICO_FLASH_SPI_CLKDIV | SPI Flash的SPI clock在系统时钟上的分频。SPI Flash的工作频率小于系统时钟,需按实际情况分频 | 2 |
| PICO_FLASH_SIZE_BYTES | flash大小,安照Flash芯片修改 | 4 |
另外,头文件中的3个pico_board_cmake_set_default的cmake宏值要与代码宏定义一致哦。
至此,在pico-sdk自定义的板子就完成了。