文档版本:V1.0 | 适用系统:Linux 6.1 / RT-Thread | 适用硬件:C-3576BQ V10 核心板 + M4-R2(ShimetaPi)底板 | 更新日期:2026-10-23
工业控制方案基于 M4-R2(RK3576)丰富的工业外设接口(CAN/CAN FD、UART、GPIO、I2C/SPI、双千兆以太网),为工业 HMI、设备控制器、产线数据采集、运动控制等场景提供控制与通信支撑。
RK3576 平台支持 Linux + RT-Thread 的 AMP 混合运行模式(RT-Thread 运行在 A53 核心,32 位模式,详见Linux与RTOS_AMP),可实现"Linux 负责显示与业务,RT-Thread 负责实时控制"的分工架构。底板提供 5V 供电与宽泛外设引出,适配工业现场。
- 工业 HMI:设备状态监控、触摸交互界面、数据可视化
- 产线数据采集:UART/CAN 采集 PLC、传感器数据并上云
- 设备控制器:GPIO 控制继电器、指示灯、电磁阀
- 运动控制:步进/伺服控制信号输出(以实际 SDK 与硬件为准)
- 协议网关:Modbus/CANopen 等工业协议转换与汇聚
| 接口 | 规格 | 说明 |
|---|
| CAN | CAN / CAN FD 接口 | 工业总线通信(详见CAN-CAN-FD驱动) |
| UART | 多路串口(最多 7 路 UART,S-02 已验证,以实际引出为准) | TTL 3 路引出(2 路与 I2C 复用) |
| GPIO | 40PIN 引出,支持输入/输出/中断 | 通用 IO 控制 |
| I2C/SPI | 底板引出(S-01 标注 I2C8,与规格书 6 路 I2C 存在出入,以实际为准) | 传感器/外设扩展 |
| 以太网 | 双路千兆(GMAC0/GMAC1) | 工业以太网、数据上云 |
| 电源 | 5V(典型 5V,最大 5.5V,纹波 50mV,电流 4A) | 工业现场供电 |
注意:40PIN 标注 I2C8_SDA/SCL(S-01)与核心板规格书"最多 6 路 I2C"(S-02)存在出入,具体复用与引出以底板原理图(S-04)与实际物料为准(待板上验证)。RK3576 无 M0 核心,实时任务运行在 A53 核心(32 位模式)。
| 系统 | 适用场景 | 说明 |
|---|
| Linux | 工业 HMI、数据上云、复杂业务处理 | 生态丰富、驱动完善、网络能力强 |
| RT-Thread | 实时控制、确定性响应、裸机外设控制 | 轻量实时操作系统,运行于 A53 核心 |
| AMP 混合 | Linux(显示/网络)+ RT-Thread(实时控制) | 通过 RPMsg 通信,见Linux与RTOS_AMP |
+-------------------------------------------------------------+
| Linux Core(A72 / A53,主系统) |
| 业务应用 | HMI界面(Qt) | 网络服务 | 数据存储 |
+-------------------------------------------------------------+
| RPMsg 核间通信 |
+-------------------------------------------------------------+
| RT-Thread Core(A53,32位,实时) |
| 运动控制 | 传感器采集 | CAN通信 | GPIO控制 |
+-------------------------------------------------------------+
| 硬件层(Hardware) |
| RK3576 SoC | CAN/UART/GPIO/I2C/SPI | 双千兆以太网 |
+-------------------------------------------------------------+
传感器/PLC ──> CAN(UART) ──> RT-Thread 实时采集 ──> RPMsg ──> Linux 业务处理 ──> 显示/上云
│
GPIO 输出 ──> 继电器/指示灯/执行器
| 模块 | 说明 |
|---|
| 实时控制 | RT-Thread 运行于 A53 核心,确定性响应(详见RT-Thread环境与工程入门) |
| 工业通信 | CAN/CAN FD、UART 串口、Modbus 等协议 |
| IO 控制 | GPIO 输入/输出/中断、PWM(以实际 SDK 为准) |
| 人机交互 | Qt 工业界面(Linux 侧),触摸屏支持 |
| 数据上云 | 双千兆以太网 / WiFi5 回传数据 |
| 类别 | 名称/型号 | 数量 | 说明 |
|---|
| 核心板 | C-3576BQ V10(RK3576) | 1 | 4GB LPDDR5 + eMMC |
| 底板 | M4-R2(ShimetaPi) | 1 | CAN/UART/GPIO/网络接口 |
| 显示屏 | HDMI 显示器 或 MIPI/eDP 屏 | 1 | HMI 显示(可选) |
| 触摸屏 | USB 触摸屏 或 MIPI 屏自带触控 | 1 | HMI 交互(可选) |
| 电源 | 5V 适配器(典型 5V,最大 5.5V,电流 4A) | 1 | 工业现场供电 |
# 查看 CAN 接口
ip link show can0
# 配置波特率并启用(以实际设备树与驱动为准)
ip link set can0 up type can bitrate 500000
# 发送/接收测试
cansend can0 123#DEADBEEF
candump can0
# 导出 GPIO(以实际编号为准,可查 /sys/kernel/debug/gpio)
echo <gpio_number> > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio<gpio_number>/direction
echo 1 > /sys/class/gpio/gpio<gpio_number>/value
推荐使用 libgpiod(gpioset / gpioget)替代 sysfs(见GPIO驱动与控制)。
RT-Thread 运行于 A53 核心(32 位模式),实时任务开发详见RT-Thread环境与工程入门与IO外设驱动(CAN-FD 与串口)。AMP 模式下通过 RPMsg 与 Linux 通信,示例见Linux与RTOS_AMP。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/can.h>
#include <linux/can/raw.h>
int can_send_example(const char *ifname)
{
int s;
struct sockaddr_can addr;
struct ifreq ifr;
struct can_frame frame;
/* 创建 SocketCAN 套接字 */
s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if (s < 0)
return -1;
strcpy(ifr.ifr_name, ifname);
ioctl(s, SIOCGIFINDEX, &ifr);
memset(&addr, 0, sizeof(addr));
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
close(s);
return -1;
}
/* 构造并发送一帧标准帧 */
frame.can_id = 0x123; /* 标准帧 ID */
frame.can_dlc = 3;
frame.data[0] = 0xDE;
frame.data[1] = 0xAD;
frame.data[2] = 0xBE;
if (write(s, &frame, sizeof(frame)) < 0) {
close(s);
return -1;
}
close(s);
return 0;
}
#include <gpiod.h>
int gpio_toggle_example(const char *chip_path, int line_offset)
{
struct gpiod_chip *chip;
struct gpiod_line *line;
chip = gpiod_chip_open(chip_path); /* 如 /dev/gpiochip0 */
if (!chip)
return -1;
line = gpiod_chip_get_line(chip, line_offset);
if (!line) {
gpiod_chip_close(chip);
return -1;
}
gpiod_line_request_output(line, "example", 0);
/* 输出高电平 */
gpiod_line_set_value(line, 1);
/* 输出低电平 */
gpiod_line_set_value(line, 0);
gpiod_line_release(line);
gpiod_chip_close(chip);
return 0;
}
| 问题 | 处理方法 |
|---|
| CAN 接口无法打开 | 检查设备树 CAN 节点使能与驱动加载(见外设驱动问题) |
| CAN 通信错误帧多 | 确认波特率一致、总线终端电阻(120Ω)正确 |
| 串口乱码 | 确认收发双方波特率一致(调试串口 1500000) |
| GPIO 引脚被占用 | 检查引脚复用冲突(/sys/kernel/debug/gpio),对照40PIN引脚定义 |
| AMP 下外设不可用 | 确认外设资源在 Linux/RT-Thread 间的分配(避免资源冲突) |
| RT-Thread 任务不调度 | 检查线程优先级与延时释放 CPU,确认 A53 核心启动配置(见调试与日志) |