Arduino RP2040板卡引脚适配
Arduino 是一个完全开源的平台,支持多种微控制器架构,除了官方集成的开发板外,还允许用户添加和修改第三方非 AVR 单片机的内核。例如,mbed_rp2040 作为 Raspberry Pi Pico 的底层支持库,我们可以通过修改其 pins_arduino.h 文件,来自定义引脚定义,以适配不同的硬件需求。
软硬件准备
- Arduino
- RP2040 Game Kit
添加RP2040开发板
首先需要确保 Arduino Mbed OS RP2040 Boards 已正确安装。在 Arduino IDE 左侧边栏中,打开 开发板管理器,搜索 2040,然后找到 Arduino Mbed OS RP2040 Boards 进行安装。
安装完成后,在上侧工具栏中点击选择开发板,就能够搜索到我们的Raspberry Pi Pico开发板了。
引脚定义
定位pins_arduino.h文件
由于Game RP2040 Kit开发板的硬件设计与 Raspberry Pi Pico 不同,所以并不能直接选择该开发板进行程序的编译下载,因此我们还需要对其默认的引脚配置进行修改,才能够进行编程和烧录。Arduino中关于引脚定义在pins_arduino.h中。
我们前面安装的RASPBERRY_PI_PICO开发板文件默认保存在以下路径:
C:\Users\用户名\AppData\Local\Arduino15\packages\arduino\hardware\mbed_rp2040\4.2.1\variants\RASPBERRY_PI_PICO
在其中找到 pins_arduino.h 文件后,使用文本编辑器或 IDE(如 VS Code)打开它。
修改引脚定义
在 pins_arduino.h 文件中,根据 RP2040 Game Kit 的硬件原理图,对引脚定义进行如下修改:
LED灯
开发板带有一个可控绿色 LED,连接至 IO4,外部未接上拉,高电平有效。
// LEDs
// ----
#define PIN_LED (4u)
#define LED_BUILTIN PIN_LED
LCD显示屏
开发板配备 ST7789 显示屏,分辨率 240x240。
//LCD
#define LCD_DC (1u)
#define LCD_RST (0u)
#define LCD_SCK (2u)
#define LCD_SDA (3u)
IMU传感器
开发板上的IMU型号为MMA7660FC,通过I2C接口与单片机进行通信,并且包含一个中断引脚INT。
//IMU
#define IMU_INT (9u)
Button按键
开发板共有四个按键,低电平触发。
//Buttons
#define BUTTON_A (6u)
#define BUTTON_B (5u)
#define BUTTON_START (7u)
#define BUTTON_SELECT (8u)
红外传感器
开发板还包含一个红外接收头和一个红外发射头,引脚定义如下:
//IR
#define IR_TX (24u)
#define IR_RX (25u)
蜂鸣器
开发板上的蜂鸣器可通过PWM控制,引脚定义如下:
//Buzz
#define BUZZER (23u)
SPI接口

// SPI
#define PIN_SPI_MISO (12u)
#define PIN_SPI_MOSI (15u)
#define PIN_SPI_SCK (14u)
#define PIN_SPI_SS (13u)
I2C接口
开发板上共有两组I2C,其中I2C0引出到背面排针,I2C1与IMU相连,引脚定义如下:

// Wire
#define PIN_WIRE0_SDA (16u)
#define PIN_WIRE0_SCL (17u)
#define PIN_WIRE1_SDA (10u)
#define PIN_WIRE1_SCL (11u)
#define WIRE_HOWMANY (2)
#define I2C_SDA (digitalPinToPinName(PIN_WIRE0_SDA))
#define I2C_SCL (digitalPinToPinName(PIN_WIRE0_SCL))
#define I2C_SDA1 (digitalPinToPinName(PIN_WIRE1_SDA))
#define I2C_SCL1 (digitalPinToPinName(PIN_WIRE1_SCL))
完成上述修改后,pins_arduino.h完整内容如下:
#pragma once
#include <macros.h>
#include <stdint.h>
#ifndef __PINS_ARDUINO__
#define __PINS_ARDUINO__
#ifdef __cplusplus
extern "C" unsigned int PINCOUNT_fn();
#endif
// Pin count
// ----
#define PINS_COUNT (PINCOUNT_fn())
#define NUM_DIGITAL_PINS (30u)
#define NUM_ANALOG_INPUTS (4u)
#define NUM_ANALOG_OUTPUTS (0u)
extern PinName digitalPinToPinName(pin_size_t P);
// LEDs
// ----
#define PIN_LED (4u)
#define LED_BUILTIN PIN_LED
//LCD
#define LCD_DC (1u)
#define LCD_RST (0u)
#define LCD_SCK (2u)
#define LCD_SDA (3u)
//IMU
#define IMU_INT (9u)
//Buttons
#define BUTTON_A (6u)
#define BUTTON_B (5u)
#define BUTTON_START (7u)
#define BUTTON_SELECT (8u)
//IR
#define IR_TX (24u)
#define IR_RX (25u)
//Buzz
#define BUZZER (23u)
// Analog pins
// -----------
#define PIN_A0 (26u)
#define PIN_A1 (27u)
#define PIN_A2 (28u)
#define PIN_A3 (29u)
static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
#define ADC_RESOLUTION 12
// Serial
#define PIN_SERIAL_TX (0ul)
#define PIN_SERIAL_RX (1ul)
// SPI
#define PIN_SPI_MISO (12u)
#define PIN_SPI_MOSI (15u)
#define PIN_SPI_SCK (14u)
#define PIN_SPI_SS (13u)
static const uint8_t SS = PIN_SPI_SS; // SPI Slave SS not used. Set here only for reference.
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK = PIN_SPI_SCK;
// Wire
#define PIN_WIRE0_SDA (16u)
#define PIN_WIRE0_SCL (17u)
#define PIN_WIRE1_SDA (10u)
#define PIN_WIRE1_SCL (11u)
#define SERIAL_HOWMANY 1
#define SERIAL1_TX (digitalPinToPinName(PIN_SERIAL_TX))
#define SERIAL1_RX (digitalPinToPinName(PIN_SERIAL_RX))
#define SERIAL_CDC 1
#define HAS_UNIQUE_ISERIAL_DESCRIPTOR
#define BOARD_VENDORID 0x2e8a
#define BOARD_PRODUCTID 0x00c0
#define BOARD_NAME "RP2040 Game Kit"
uint8_t getUniqueSerialNumber(uint8_t* name);
void _ontouch1200bps_();
#define SPI_HOWMANY (1)
#define SPI_MISO (digitalPinToPinName(PIN_SPI_MISO))
#define SPI_MOSI (digitalPinToPinName(PIN_SPI_MOSI))
#define SPI_SCK (digitalPinToPinName(PIN_SPI_SCK))
#define WIRE_HOWMANY (2)
#define I2C_SDA (digitalPinToPinName(PIN_WIRE0_SDA))
#define I2C_SCL (digitalPinToPinName(PIN_WIRE0_SCL))
#define I2C_SDA1 (digitalPinToPinName(PIN_WIRE1_SDA))
#define I2C_SCL1 (digitalPinToPinName(PIN_WIRE1_SCL))
#define digitalPinToPort(P) (digitalPinToPinName(P)/32)
#define SERIAL_PORT_USBVIRTUAL SerialUSB
#define SERIAL_PORT_MONITOR SerialUSB
#define SERIAL_PORT_HARDWARE Serial1
#define SERIAL_PORT_HARDWARE_OPEN Serial1
#define USB_MAX_POWER (500)
#endif //__PINS_ARDUINO__
功能验证
修改完成后,在 Arduino IDE 中编写并上传测试代码,验证 LED 是否按预期工作。下面是Arduino中一个LED闪烁的示例程序:
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
选择开发板并上传至开发板编译运行后,就能看到我们开发板背面的LED灯开始闪烁啦!
小结
在Arduino中,通过修改 pins_arduino.h,我们可以灵活地自定义 RP2040 的引脚分配,使其适配特定的硬件需求。这个方法适用于各种基于 RP2040 的项目,极大提高了开发的灵活性和可扩展性。

浙公网安备 33010602011771号