跳到主要内容

40 Pin GPIO 接口

瑞莎 Cubie A7Z 板载 40-Pin GPIO(通用输入输出)接口,为硬件扩展提供了高度灵活的接口支持。

用户可以通过 40-Pin GPIO 接口连接各类传感器、执行器、通信模块、显示屏以及其他嵌入式外设,从而快速实现物联网(IoT)、机器人控制、工业自动化等领域的原型开发与功能验证。

危险

使用 40-Pin GPIO 接口时,请注意引脚和外设的接线,请确保引脚连接正确,不当操作可能导致设备硬件损坏。

GPIO 功能

Cubie A7Z 支持给板载的 GPIO 引脚外接外部设备,支持 UART、SPI、I2C、ADC 等。

Function8Function7Function6Function5Function4Function3Function2Function1Pin#Pin#Function1Function2Function3Function4Function5Function6Function7Function8Function9
3.3V
1
2
5V
PJ-EINT23TWI11-SDATWI3-SDATWI7-SDAUART2-CTSUART3-RXPWM1-5PJ23
3
4
5V
PJ-EINT23TWI11-SCKTWI3-SCKTWI7-SCKUART2-RTSUART3-TXPWM1-4PJ22
5
6
GND
PB-EINT1JTAG-MSSPI2-CS0UART0-TXUART2-TXPB0
7
8
PB9UART0-TXI2S0-DIN2I2S0-DOUBT2PWM1-1WATCHDOG-SIGTWI8-SCKTWI0-SCKPB-EINT9
GND
9
10
PB10UART0-RXI2S0-DIN3I2S0-DOUBT3PWM1-2PLL-LOCK-DBGTWI8-SDATWI0-SDAPB-EINT10
PB-EINT1JTAG-CKSPI2-CLKUART0-RXUART2-RXPB1
11
12
PB5I2S0-BCLKSPI2-CS2PWM0-1TRACE-DATA0TWI1-SDAPB-EINT5
PL-EINT6S-PWM0-4S-IR-RXS-SPI0-MOSIS-UART0-TXS-JTAG-DOPL6
13
14
GND
PL-EINT7S-PWM0-5S-SPI0-MISOS-UART0-RXS-JTAG-DIPL7
15
16
PJ24PWM1-6UART4-TXTWI4-SCKSPI3-CLKPJ-EINT24
3.3V
17
18
PJ25PWM1-7UART4-RXTWI4-SDASPI3-MOSIPJ-EINT25
PD-EINT12PWM1-2SPI1-MOSIEINK-D12DSI1-D1PLVDS1-D1PPD12
19
20
GND
PD-EINT13PWM1-3SPI1-MISOEINK-D13DSI1-D1NLVDS1-D1NPD13
21
22
PL5S-JTAG-CKS-TWI2-SDAS-SPI0-CLKS-PWM0-3PL-EINT5
PD-EINT11PWM1-1SPI1-CLKEINK-D11DSI1-D0NLVDS1-D0NPD11
23
24
PD10LVDS1-D0PDSI1-D0PEINK-D10SPI1-CS0PWM1-0PD-EINT10
GND
25
26
PD14LVDS1-D2PDSI1-CKPEINK-D14SPI1-HOLDUART3-RTSPD-EINT14
PD-EINT17UART3-RXTWI2-SDAEINK-LEHDSI1-D2NLVDS1-CKNPD17
27
28
PD16LVDS1-CKPDSI1-D2PEINK-OEHTWI2-SCKUART3-TXPD-EINT16
PB-EINT2TWI0-SCKJTAG-DOHDMI-SCLSPI2-MOSIUART2-RTSPB2
29
30
GND
PB-EINT3TWI0-SDAJTAG-DIHDMI-SDASPI2-MISOUART2-CTSPB3
31
32
PM5S-UART0-RXS-TWI2-SDAS-TWI1-SDAS-UART1-RXS-PWM0-1S-IR-RXPM-EINT5
PM-EINT3S-PWM0-5S-UART1-RXS-UART0-RXS-SPI0-MISOS-JTAG-DIPM3
33
34
GND
PB-EINT6TRACE-DATA1PWM0-8PWM0-2SPI2-CS3I2S0-LRCKCLK-FANOUT1PB6
35
36
PB4PWM0-0I2S0-MCLKSPI2-CS1HDMI-CECTRACE-CLKTWI1-SCKPB-EINT4
PM-EINT4S-IR-RXS-PWM0-0S-UART1-TXS-TWI1-SCKS-TWI2-SCKS-UART0-TXPM4
37
38
PB8CLK-FANOUT3I2S0-DIN0I2S0-DOUBT1PWM1-0OWA0-OUTTRACE-DATA3TWI1-SDAPB-EINT8
GND
39
40
PB7CLK-FANOUT2I2S0-DOUBT0I2S0-DIN1PWM0-9OWA0-INTRACE-DATA2TWI1-SCKPB-EINT7

GPIO 引脚号

控制指定引脚,你想需要根据以下公式来计算引脚号:

GPIO 芯片引脚号计算公式
GPIOCHIP0A ~ KNUM + 32 * (A ~ K)
GPIOCHIP1L ~NUM + 32 * (L ~ )

计算示例:

  • PB7

GPIOCHIP0 -> 7 + 32 * (A ~ K) -> 7 + 32 * 1 -> 39

GPIO 使用

通过板载的 40-Pin GPIO 接口,演示常见的 GPIO 使用方法。

Overlay 说明

A7Z 的同一种外设功能通常可以复用到多个不同引脚上,因此 rsetupOverlay -> Manage overlays 页面主要提供的是常见用法示例,而不是把所有可选 pinmux 组合全部列出来。

如果你需要把 PWM、UART、I2C、SPI 等功能切换到表中列出的其他引脚,建议按下面的顺序处理:

  1. 先根据上面的 GPIO 复用表确认目标功能和目标引脚
  2. 先尝试 rsetup 里现成的 overlay 示例
  3. 如果现成选项不覆盖你的目标引脚,可以参考 radxa-overlays 的写法修改 overlay
  4. 修改完成后,可通过 rsetupOverlay -> Install 3rd party overlay 安装自定义 DTS / DTBO

这样可以避免把每一种 pinmux 组合都做成单独的内置选项,同时也方便你按项目需要扩展到其他引脚。

安装 python-periphery

使用 python-periphery 库来控制 GPIO 引脚。

radxa@cubie-a7z$
sudo pip3 install python-periphery

GPIO 读取

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来读取 PB7 引脚的高低电平。

gpio_input.py
from periphery import GPIO
import time

def read_gpio_input():
# Configure GPIO input (modify pin number according to actual hardware)
# Using pin 39 of /dev/gpiochip0 here (corresponds to PB7)
try:
# Initialize GPIO in input mode
gpio_in = GPIO("/dev/gpiochip0", 39, "in")

print("Starting GPIO input reading (press Ctrl+C to exit)")
while True:
# Read pin value
value = gpio_in.read()
print(f"GPIO input value: {value} (True=High, False=Low)")
time.sleep(1) # Read once per second

except KeyboardInterrupt:
print("\nProgram exited")
except Exception as e:
print(f"Error occurred: {e}")
finally:
# Ensure resources are released
try:
gpio_in.close()
except:
pass

if __name__ == "__main__":
read_gpio_input()

测试步骤

  1. 将 PB7 引脚接 GND 或 3.3V 引脚

  2. 将代码保存为 gpio_input.py

  3. 使用 python3 gpio_input.py 命令运行测试代码

实验现象

终端会输出 False 或 True 信息。

False 代表低电平,True 代表高电平。

GPIO 输出

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来控制 PB7 引脚输出高低电平,然后通过 PB8 引脚读取 PB7 引脚的高低电平。

gpio_output.py
from periphery import GPIO
import time

def gpio_output_with_feedback():
# GPIO Configuration (modify pin numbers based on your hardware)
# PB7 (output) → maps to pin 39 of /dev/gpiochip0
# PB8 (input) → maps to pin 40 of /dev/gpiochip0
OUTPUT_PIN_CHIP = "/dev/gpiochip0"
OUTPUT_PIN_NUMBER = 39 # PB7 (output pin, controlled by the script)
INPUT_PIN_NUMBER = 40 # PB8 (input pin, reads PB7's output state)

# Initialize GPIO objects as None first (for safe release later)
gpio_out = None
gpio_in = None

try:
# Initialize PB7 as OUTPUT mode
gpio_out = GPIO(OUTPUT_PIN_CHIP, OUTPUT_PIN_NUMBER, "out")
# Initialize PB8 as INPUT mode
gpio_in = GPIO(OUTPUT_PIN_CHIP, INPUT_PIN_NUMBER, "in")

# Print test initialization info
print("=== GPIO Output-Input Feedback Test Started ===")
print(f"Controlled Pin (PB7): {OUTPUT_PIN_CHIP} - Pin {OUTPUT_PIN_NUMBER} (OUTPUT)")
print(f"Monitoring Pin (PB8): {OUTPUT_PIN_CHIP} - Pin {INPUT_PIN_NUMBER} (INPUT)")
print("Test Behavior: PB7 toggles HIGH/LOW every 1s; PB8 verifies PB7's state")
print("Press Ctrl+C to stop the test\n")

# Main loop: Toggle PB7 and read PB8 feedback
while True:
# 1. Set PB7 to HIGH level
gpio_out.write(True)
time.sleep(0.1) # Short delay for signal stabilization (avoid read lag)
pb8_reading = gpio_in.read()
print(f"PB7 Output: HIGH (True) | PB8 Reading: {pb8_reading}")

# Keep PB7 HIGH for 1 second
time.sleep(1)

# 2. Set PB7 to LOW level
gpio_out.write(False)
time.sleep(0.1) # Short delay for signal stabilization
pb8_reading = gpio_in.read()
print(f"PB7 Output: LOW (False) | PB8 Reading: {pb8_reading}")

# Keep PB7 LOW for 1 second
time.sleep(1)

# Handle user-initiated exit (Ctrl+C)
except KeyboardInterrupt:
print("\n\nTest stopped by user (Ctrl+C)")
# Handle other unexpected errors (e.g., GPIO access failure)
except Exception as e:
print(f"\nError during test: {str(e)}")
# Ensure GPIO resources are released even if an error occurs
finally:
print("\nReleasing GPIO resources...")
# Safely close PB7 (set to LOW first to avoid residual high level)
if gpio_out:
try:
gpio_out.write(False)
gpio_out.close()
print(f"Successfully closed PB7 (Pin {OUTPUT_PIN_NUMBER})")
except Exception as close_err:
print(f"Failed to close PB7 (Pin {OUTPUT_PIN_NUMBER}): {str(close_err)}")
# Safely close PB8
if gpio_in:
try:
gpio_in.close()
print(f"Successfully closed PB8 (Pin {INPUT_PIN_NUMBER})")
except Exception as close_err:
print(f"Failed to close PB8 (Pin {INPUT_PIN_NUMBER}): {str(close_err)}")
print("Resource release complete.")

# Run the test when the script is executed directly
if __name__ == "__main__":
gpio_output_with_feedback()

测试步骤

  1. 将 PB7 引脚和 PB8 引脚进行短接

  2. 将代码保存为 gpio_output.py

  3. 使用 sudo python3 gpio_output.py 命令运行测试代码

实验现象

终端会输出 False 或 True 信息。

False 代表低电平,True 代表高电平。

PWM 输出

硬件准备

  • 主板
  • LED
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 PWM 输出。

pwm_output.py
from periphery import PWM
import time

def pwm_test():
try:
# Configure PWM parameters - modify according to your hardware
# Common PWM paths: /sys/class/pwm/pwmchip0/pwm0, etc.
PWM_CHIP = 10 # PWM chip number
PWM_CHANNEL = 2 # PWM channel number

# Initialize PWM
pwm = PWM(PWM_CHIP, PWM_CHANNEL)

print(f"PWM Test: Using PWM{PWM_CHIP}.{PWM_CHANNEL} (Pin: PD12)")

# Set PWM frequency to 1kHz
frequency = 1000 # 1000 Hz
pwm.frequency = frequency
print(f" Set frequency: {frequency} Hz")

# Enable PWM output
pwm.enable()
print(" PWM enabled")

# Test different duty cycles (0% to 100%)
duty_cycles = [0.0, 0.25, 0.5, 0.75, 1.0]

for duty in duty_cycles:
pwm.duty_cycle = duty
print(f" Set duty cycle: {duty*100:.1f}%")
time.sleep(1) # Maintain current duty cycle for 1 second

# Cleanup
pwm.disable()
pwm.close()
print(" PWM disabled and closed")
print("PWM Test completed successfully")

except Exception as e:
print(f"PWM Test failed: {e}")

if __name__ == "__main__":
print("Starting PWM Signal Test...\n")
pwm_test()

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable PWM1-2 选项,勾选后重启系统

  2. 将 LED 的正极连接到 PD12 引脚

  3. 将 LED 的负极连接到 GND 引脚

  4. 将代码保存为 pwm_output.py

  5. 使用 sudo python3 pwm_output.py 命令运行测试代码

实验现象

外接的 LED 会以不同的亮度闪烁,从亮到暗变化。

UART 使用

UART(通用异步收发传输器) 是一种广泛使用的串行通信协议,用于在嵌入式系统、计算机和外设之间进行异步串行数据传输。

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 UART4 回环通信。

uart_example.py
from periphery import Serial
import time

def uart_test():
try:
# Modify the serial device path according to your hardware, common paths include /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc.
# PJ24(TX) PJ25(RX)
UART_DEVICE = "/dev/ttyAS4"
BAUDRATE = 115200

# Initialize serial port
serial = Serial(UART_DEVICE, BAUDRATE)

print(f"UART Test: Opening serial port {UART_DEVICE}, baud rate {BAUDRATE}")

# Send test data
test_message = "Hello, UART Test!\n"
serial.write(test_message.encode())
print(f" Sent data: {test_message.strip()}")

# Wait for data transmission
time.sleep(0.1)

# Try to read data (if loopback or other device responds)
if serial.input_waiting() > 0:
received_data = serial.read(serial.input_waiting())
print(f" Received data: {received_data.decode().strip()}")
else:
print(" No data received (normal unless loopback is connected)")

serial.close()
print("UART test completed")

except Exception as e:
print(f"UART test failed: {e}")

if __name__ == "__main__":
uart_test()

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable UART4 选项,勾选后重启系统

  2. 将 PJ24 引脚和 PJ25 引脚短接

  3. 将代码保存为 uart_example.py

  4. 使用 sudo python3 uart_example.py 命令运行测试代码

实验现象

终端会输出发送和接收的信息,可以根据终端输出的信息判断 UART 回环测试是否成功。

I2C 使用

I2C 是一种广泛使用的同步串行通信协议,由飞利浦(现恩智浦)开发,主要用于短距离芯片间通信。

硬件准备

  • 主板
  • I2C 设备(如 OLED 显示屏,其对应的 I2C 地址为 0x3C)
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 I2C 通信。

i2c_example.py
from periphery import I2C

def i2c_device_detection():
"""I2C Test - Check if device exists
Pin reference: PJ23 (SDA), PJ22 (SCL)
"""
# Modify according to your hardware connection
# Common I2C bus devices: /dev/i2c-0, etc.
I2C_BUS = "/dev/i2c-7"
TARGET_ADDR = 0x3C # Target address to check

i2c = None # Initialize I2C object reference
try:
# Initialize I2C object
i2c = I2C(I2C_BUS)

# Attempt a simple read/write operation to detect device
# Sending a single 0x00 byte as test communication
msgs = [I2C.Message([0x00])]
i2c.transfer(TARGET_ADDR, msgs)

print(f"I2C Test: Device found at address 0x{TARGET_ADDR:02X}")
return True

except Exception as e:
# Exception (e.g., IOError) usually indicates no device or no response
print(f"I2C Test: No device or no response at address 0x{TARGET_ADDR:02X}: {e}")
return False
finally:
# Ensure I2C resources are released
if i2c is not None:
try:
i2c.close()
except:
pass

if __name__ == "__main__":
print("Starting I2C Device Detection...")
i2c_device_detection()
print("I2C Test completed")

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable TWI7 选项,勾选后重启系统

  2. 将 OLED 显示屏的 SCL 引脚连接到 PJ22 引脚,SDA 引脚连接到 PJ23 引脚,VCC 连接到 5V,GND 连接到 GND

  3. 将代码保存为 i2c_example.py

  4. 使用 sudo python3 i2c_example.py 命令运行测试代码

实验现象

脚本功能是检查指定 I2C 总线上的特定地址是否存在可响应的 I2C 设备,可以判断 I2C 设备是否正常工作。

SPI 使用

SPI(串行外设接口)是一种高速、全双工、同步串行通信协议,由 Motorola(现为 NXP )开发,主要用于短距离芯片间通信,常见于传感器、存储器(如 Flash )、显示屏等设备与微控制器之间的数据传输。

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 SPI 回环通信。

spi_example.py
from periphery import SPI

def spi_communication_test():
# Data to be transmitted (4 bytes)
transmit_data = [0xAA, 0xBB, 0xCC, 0xDD]

try:
# Initialize SPI resource
# Parameters: SPI device path, mode 0, 1MHz clock frequency
spi = SPI("/dev/spidev1.0", 0, 1000000)

# Transmit data and receive response simultaneously
# SPI is full-duplex, so data is sent and received at the same time
received_data = spi.transfer(transmit_data)

# Print test results
print("SPI Test:")
print(" Transmitted data: [0x{:02x}, 0x{:02x}, 0x{:02x}, 0x{:02x}]".format(*transmit_data))
print(" Received data: [0x{:02x}, 0x{:02x}, 0x{:02x}, 0x{:02x}]".format(*received_data))

except Exception as e:
print(f"SPI Test failed: {e}")
finally:
# Ensure SPI resource is released
try:
spi.close()
except:
pass

if __name__ == "__main__":
print("Starting SPI Communication Test...\n")
spi_communication_test()
print("\nSPI Test completed")

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable spidev on SPI1 选项,勾选后重启系统

  2. 将 PD12 引脚和 PD13 引脚短接

  3. 将代码保存为 spi_example.py

  4. 使用 sudo python3 spi_example.py 命令运行测试代码

实验现象

终端会输出发送和接收的信息,可以根据发送和接收的数据是否一致判断 SPI 回环测试是否成功。

    您需要登录 GitHub 才能发表评论。如果您已登录,请忽略此消息。

    Radxa-docs © 2026 by Radxa Computer (Shenzhen) Co.,Ltd. is licensed under CC BY 4.0