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 的项目,极大提高了开发的灵活性和可扩展性。

posted @ 2025-05-05 16:36  FBshark  阅读(303)  评论(0)    收藏  举报