树莓派 5 (Raspberry Pi 5)

元器件
开发板
库存 58

介绍

最新旗舰单板计算机,搭载BCM2712四核Cortex-A76 2.4GHz、VideoCore VII GPU、4GB/8GB LPDDR4X RAM、双4Kp60 HDMI输出、PCIe 2.0 x1接口、千兆以太网、双频WiFi 5/BT 5.0、USB 3.0×2+USB 2.0×2、40Pin GPIO、支持RTC电池供电

规格参数

参数
CPUBCM2712 四核 Cortex-A76 @ 2.4GHz
GPUVideoCore VII @ 800MHz
RAM4GB/8GB LPDDR4X-4267
USB2×USB 3.0 (5Gbps) + 2×USB 2.0
GPIO40Pin标准树莓派排针
PCIePCIe 2.0 x1 (FPC连接器)
存储MicroSD卡槽,支持高速SDR104模式
尺寸85×56mm
电源5V/5A (USB-PD),主动散热风扇接口
网络千兆以太网 + 双频802.11ac WiFi 5 + BT 5.0/BLE
实时时钟内置RTC,支持外接电池
视频输出双micro-HDMI 4Kp60

代码例程

树莓派 5 GPIO 编程例程 — Python + C + Shell.md
# 树莓派 5 GPIO 编程例程

树莓派 5 使用 RP1 南桥控制 GPIO,推荐使用 **libgpiod** 或 **gpiozero**(底层已适配 RP1)。传统 RPi.GPIO 可能不完全兼容。

---

## 示例 1:Python gpiozero — LED 闪烁

```python
#!/usr/bin/env python3
"""树莓派5 LED闪烁 — gpiozero版"""
from gpiozero import LED
from time import sleep
import signal

led = LED(17)  # BCM编号 GPIO17 (Pin 11)

try:
    print("LED开始闪烁,Ctrl+C 退出")
    while True:
        led.on()
        sleep(0.5)
        led.off()
        sleep(0.5)
except KeyboardInterrupt:
    print("\n退出")
finally:
    led.close()
```

## 示例 2:Python libgpiod — GPIO 控制(原生 RP1 支持)

```python
#!/usr/bin/env python3
"""树莓派5 GPIO控制 — libgpiod(推荐)"""
import gpiod
import time

CHIP = "/dev/gpiochip4"   # RP1 的 gpiochip,Pi5 上固定为 gpiochip4
LINE = 17                 # BCM GPIO17

chip = gpiod.Chip(CHIP)
line = chip.get_line(LINE)
line.request(consumer="blink", type=gpiod.LINE_REQ_DIR_OUT)

try:
    print(f"GPIO{LINE} 闪烁中...")
    while True:
        line.set_value(1)
        time.sleep(0.5)
        line.set_value(0)
        time.sleep(0.5)
except KeyboardInterrupt:
    print("\n退出")
finally:
    line.set_value(0)
    line.release()
    chip.close()
```

## 示例 3:Shell — gpioset/gpioget 命令行控制

```bash
#!/bin/bash
# 树莓派5 命令行 GPIO 控制

CHIP="gpiochip4"
PIN=17

# 设置 GPIO17 为输出、高电平
gpioset $CHIP $PIN=1
echo "GPIO$PIN → HIGH"
sleep 2

# 低电平
gpioset $CHIP $PIN=0
echo "GPIO$PIN → LOW"

# 读 GPIO27(Pin 13),先设为输入
gpioget $CHIP 27
echo "GPIO27 输入值: $?"
```

## 示例 4:C 语言 — libgpiod 读取按键

```c
/*
 * 树莓派5 按键读取 — libgpiod C API
 * 编译: gcc -o button button.c -lgpiod
 * 运行: ./button
 */
#include <gpiod.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define CHIP_NAME "/dev/gpiochip4"
#define BUTTON_PIN 27    // BCM 27 (Pin 13)
#define LED_PIN    17    // BCM 17 (Pin 11)

int main() {
    struct gpiod_chip *chip;
    struct gpiod_line *btn_line, *led_line;
    int btn_val, last_val = 1;

    chip = gpiod_chip_open(CHIP_NAME);
    if (!chip) { perror("打开 gpiochip 失败"); return 1; }

    btn_line = gpiod_chip_get_line(chip, BUTTON_PIN);
    led_line = gpiod_chip_get_line(chip, LED_PIN);

    gpiod_line_request_input(btn_line, "button");
    gpiod_line_request_output(led_line, "led", 0);

    printf("等待按键按下(BCM GPIO%d)...\n", BUTTON_PIN);

    while (1) {
        btn_val = gpiod_line_get_value(btn_line);
        if (btn_val == 0 && last_val == 1) {  // 下降沿(按键按下)
            printf("按键按下!LED 翻转\n");
            gpiod_line_set_value(led_line, 1);
        } else if (btn_val == 1 && last_val == 0) {
            gpiod_line_set_value(led_line, 0);
        }
        last_val = btn_val;
        // 简单去抖延时
        struct timespec ts = {0, 5000000}; // 5ms
        nanosleep(&ts, NULL);
    }

    gpiod_line_release(btn_line);
    gpiod_line_release(led_line);
    gpiod_chip_close(chip);
    return 0;
}
```

## 示例 5:Python — PWM 控制(硬件 PWM)

```python
#!/usr/bin/env python3
"""树莓派5 硬件PWM — gpiozero"""
from gpiozero import PWMLED
from time import sleep

# GPIO18 (Pin 12) 和 GPIO19 (Pin 35) 支持硬件PWM
led = PWMLED(18)

try:
    print("PWM 呼吸灯效果...")
    while True:
        # 渐亮
        for duty in range(0, 101, 2):
            led.value = duty / 100.0
            sleep(0.02)
        # 渐暗
        for duty in range(100, -1, -2):
            led.value = duty / 100.0
            sleep(0.02)
except KeyboardInterrupt:
    print("\n退出")
finally:
    led.close()
```

## 示例 6:I²C 扫描总线

```python
#!/usr/bin/env python3
"""树莓派5 I2C总线扫描 — 查找设备地址"""
import smbus2

# Pi5 默认I2C总线: /dev/i2c-1 (GPIO2=SDA, GPIO3=SCL)
bus = smbus2.SMBus(1)

print("扫描 I²C 总线...")
devices = []
for addr in range(0x03, 0x78):
    try:
        bus.read_byte(addr)
        devices.append(hex(addr))
        print(f"  发现设备: 0x{addr:02X}")
    except:
        pass

if not devices:
    print("  未发现设备,请检查接线和 i2c_detect")
else:
    print(f"扫描完成,共 {len(devices)} 个设备")

bus.close()
```

## 示例 7:SPI 回环测试

```python
#!/usr/bin/env python3
"""树莓派5 SPI回环测试 — 将MOSI短接MISO进行测试"""
import spidev

spi = spidev.SpiDev()
spi.open(0, 0)          # SPI0, CE0
spi.max_speed_hz = 1000000
spi.mode = 0

# 发送数据并接收(需将MOSI(GPIO10)与MISO(GPIO9)短接)
tx_data = [0xAA, 0x55, 0x12, 0x34]
rx_data = spi.xfer2(tx_data)
print(f"发送: {[hex(x) for x in tx_data]}")
print(f"接收: {[hex(x) for x in rx_data]}")

if tx_data == rx_data:
    print("✅ SPI 回环测试通过")
else:
    print("❌ SPI 回环测试失败,检查接线")

spi.close()
```

---

## ⚠️ 树莓派 5 编程要点

1. **gpiochip 编号**:Pi5 使用 `/dev/gpiochip4`(RP1),而 Pi4/3 使用 `/dev/gpiochip0`。
2. **避免 RPi.GPIO**:该库未适配 RP1,推荐使用 `gpiozero`(>=2.0)或 `libgpiod`。
3. **I²C/SPI/UART**:通过 `raspi-config` 启用后,设备路径与 Pi4 一致(`/dev/i2c-1`, `/dev/spidev0.x`, `/dev/ttyAMA0`)。
4. **PWM**:硬件 PWM 仅限 GPIO12/13/18/19,共 2 通道(PWM0: GPIO12+18, PWM1: GPIO13+19)。
5. **Python 环境**:Pi5 预装 Python 3.11+,建议使用 `venv` 隔离包环境。

参考资料

暂无参考文献