跳转到正文
嵌入式研发札记
返回

我为什么做 SchemCP:让 AI 真正读懂嘉立创 EDA 原理图

我平时会把 AI 用在固件、驱动和工具链开发里,但到了硬件这一侧,总有一段上下文需要自己补。

模型知道 STM32F407 有哪些外设,却不知道我这块板上的 PA4 已经接了什么;它能解释 CAN 收发器,却不知道当前工程有没有装终端电阻;它也可以画一棵漂亮的电源树,但如果没有实际网络和器件引脚,那棵树很可能只是合理猜测。

把整张原理图截成图片发过去,只适合讨论局部。工程一旦出现层级页面、多单元器件、隐藏电源脚、DNP 和核心板/底板组合,截图就很难提供完整上下文。

所以我做了 SchemCP:在本地只读解析嘉立创 EDA 专业版 .epro2 工程,再通过 MCP 把结构化、可追溯的原理图信息交给 AI。

flowchart LR
  EPRO2[".epro2 原理图工程"] --> CORE["核心板上下文"]
  ENET[".enet 导出网表(可选)"] --> CORE
  EPRO2B[".epro2 原理图工程"] --> BASE["底板上下文"]
  ENETB[".enet 导出网表(可选)"] --> BASE

  CORE --> MCP["SchemCP<br/>本地只读解析"]
  BASE --> MCP
  MCP --> FACT["工程事实<br/>页面 · 器件 · 引脚 · 网络"]
  MCP --> CANDIDATE["规则候选<br/>接口 · 电源 · 时钟 · 连接器"]
  MCP --> LIMIT["证据边界<br/>诊断 · DNP · 未验证项"]

  FACT --> AI["AI 工程上下文"]
  CANDIDATE --> AI
  LIMIT --> AI
  AI --> WORK["固件规划 · 设计评审<br/>测试文档 · 故障分析"]

一、SchemCP 解决的不是“看图”,而是上下文缺口

一份真正能帮助嵌入式开发的原理图上下文,至少要回答下面几类问题:

上下文AI 应该拿到什么可以继续做什么
工程结构页面、层级实例、器件所在功能页快速定位电源、主控、通信和接口
器件身份位号、型号、MPN、装配状态、完整引脚查 Datasheet、BOM、DNP 和替代料风险
MCU 资源实际连接的 GPIO、时钟、复位、BOOT、调试口规划 CubeMX、BSP 和外设初始化顺序
接口关系UART、I²C、SPI、CAN、USB、Ethernet、SDIO 等候选建立驱动边界,检查信号是否完整
电源上下文输入、保护、转换、负载开关、隔离域和负载域做上电顺序、回灌、压差、热耗散审查
装配上下文DNP、0Ω 电阻、跳线和 Variant决定某个接口在当前板型上是否真的成立
多板关系连接器、针数、候选针序和已确认映射把核心板 GPIO 追到底板外设
证据状态工程候选、网表确认、未验证项和诊断防止模型把推断写成设计事实

这也是 SchemCP 和普通图片识别的区别。它不是让 AI “看起来懂了”,而是给模型一个可以查询、分页、交叉核对的工程数据源。

Important

SchemCP 当前读取的是嘉立创 EDA 专业版 .epro2 原理图工程。它不读取 PCB,不修改工程,也不替代 ERC、Datasheet 核对和工程师评审。

二、它具体能提供哪些信息

1. 工程、页面和层级

SchemCP 可以先列出工程摘要、页面树和实例上下文,再按页面查询器件。这样 AI 不必一次吞下整份原理图,而是先建立地图,再进入某一页追网络。

对于层级复用工程,这一步尤其重要。同一个基础页面可能被多个实例复用,位号和属性也可能被覆盖;只看基础页面,很容易把默认对象当成实际装配对象。

2. 器件与完整逻辑引脚

查询结果会保留位号、器件标题、制造商、MPN、立创商城编号、装配状态和引脚信息。多 PART 的逻辑器件会被合并,分离电源单元和显式隐藏引脚不会因为不在主符号旁边就被丢掉。

这类上下文适合用来检查:

3. 接口、电源、时钟、复位和 MCU 占用

SchemCP 会根据实际接触导线的引脚整理接口候选,而不是看到 MCU 有某个复用功能就断言工程已经用了它。缺少必要信号时,接口会保留为 PARTIAL_CANDIDATE

电源树也遵循相同原则:从明确的网络和器件引脚出发,区分输入、转换、负载和隔离域;时钟只整理外部晶振和相关网络,不猜 MCU 内部 PLL;复位和启动路径只描述板外连接,不代替芯片内部逻辑。

4. .enet 网表绑定

普通查询只提供 .epro2 也能工作;如果同时提供对应的 .enet,SchemCP 可以把几何/标签候选与导出网表端点进行比较。

这一步的意义不是把结论包装成“100% 正确”,而是让 AI 知道当前依据属于哪一层:

5. 核心板、底板与扩展板装配

多个工程可以分别打开,再组成同一个装配上下文。SchemCP 会列出连接器候选,但不会只因为两个连接器都是 40Pin 就自动确认它们相连。

实际插接还需要人工确认连接器位号、1 脚方向、上下板视角和镜像关系。确认以后,AI 才适合把“核心板 MCU 引脚”继续追到“底板外设”。

三、真实案例:天空星核心板 + 筑基学习底板

为了确认上面的能力不是停留在演示数据,我使用了两套真实工程:

两块板各自提供 .epro2 与同日导出的 .enet。四个源文件只作为本机解析样本使用,没有复制进网站仓库。下面不铺满几百个器件和引脚,而是只保留 AI 在后续开发中最有价值的上下文。

1. 工程上下文卡

项目核心板底板
工程规模9 页、7 个层级实例20 个平铺功能页
主要角色STM32F407 最小系统、调试、存储、排针电源、通信、传感、音频、电机和人机接口
带位号器件103619
BUS15 组、102 个入口无显式 BUS
DNP025
网表端点426 个已连接引脚1,879 个已连接引脚
网表比较层级投影存在重复和差异1,879 / 1,879 精确匹配

这个对照先告诉 AI 两件事:底板可以较高置信度按网表追端点;核心板虽然能读取完整 MCU 和板载资源,但涉及层级匿名网和跨页连接时必须保留疑问。

2. 核心板上下文卡

主控是 STM32F407VET6,LQFP-100。100 个逻辑引脚已经合并并绑定网表,但这里不需要在正文列出 100 行;AI 真正需要先拿到的是资源分组:

资源已解析上下文对开发的直接意义
系统时钟PH0/PH1 接 8 MHz 晶振;PC14/PC15 接 32.768 kHz 晶振配置 HSE、LSE 和时钟源前有明确外部条件
调试PA13/PA14 为 SWDIO/SWCLK,PB3 为 SWO,NRST 引出能生成下载、调试和日志接线说明
调试串口PA9/PA10 引到 H1可作为早期启动日志候选
USB FSPA11/PA12 接 USB_FS_N/P提醒固件保留 USB 复用资源
板载 SPI FlashPA4–PA7 接 GD25Q32底板复用这些针脚时必须检查冲突
板载 TF 卡PC8–PC12、PD2、PD3 接 SDIO 与卡检测可直接形成 SDIO 初始化资源组
启动/复位BOOT0、PB2/BOOT1、NRST 及 RC/按键网络用于启动模式、复位源和产测设计
电源域+5V、+3V3、VDDA、AGND、VBAT、CHIP_VREF能区分数字、模拟和备份电源关注点
flowchart LR
  MCU["U1<br/>STM32F407VET6<br/>LQFP-100"]

  CLOCK["外部时钟<br/>PH0/PH1:8 MHz<br/>PC14/PC15:32.768 kHz"] --- MCU
  DEBUG["调试与启动<br/>SWDIO · SWCLK · SWO · NRST<br/>BOOT0 · PB2/BOOT1"] --- MCU
  FLASH["板载 SPI Flash<br/>PA4–PA7<br/>GD25Q32"] --- MCU
  SDIO["TF / SDIO<br/>PC8–PC12 · PD2 · PD3"] --- MCU
  USB["USB FS<br/>PA11 / PA12"] --- MCU
  POWER["电源域<br/>+5V · +3V3 · VDDA · AGND<br/>VBAT · CHIP_VREF"] --- MCU
  HEADER["P1 / P2<br/>双 40Pin 排针"] --- MCU

这里还暴露出两个比“识别成功”更有价值的问题:

3. 底板上下文卡

底板 20 页可以压缩成 5 个固件功能域:

功能域关键器件/资源AI 可以继续生成的内容
通信LAN8720A RMII、隔离 CAN、隔离 RS485、扩展 UART引脚规划、PHY/收发器初始化顺序、终端配置检查
存储与传感W25Q128、ICM-42688、AT24C02、SD3078、INA226、AHT20SPI/I²C 地址表、驱动清单和中断资源规划
音频ES8388、双路 HT6872MCLK/WS/数据时钟关系和音频上电流程
执行与采集TMC2209、双路 AT8236、编码器、HX711、ADC、舵机定时器、PWM、编码器和采样资源规划
人机接口WS2812、按键、EC11、LCD、LED、蜂鸣器、继电器GPIO 安全态、消抖、显示和产测项目

检测器输出了 67 条活动接口记录,但它们是器件级记录,不等于 67 条独立总线。例如多个 I²C 器件共享同一组 SCL/SDA;部分 SPI 器件因为片选或时钟证据不完整,仍然只是部分候选。给 AI 时应先按总线和功能域合并,而不是直接把接口记录数当作外设数量。

4. 电源上下文卡

底板电源比接口更应该先交给 AI,因为它决定后面哪些功能可以安全上电:

DC 8–24 V
  → 开关 / 自恢复保险 / TVS / 共模滤波
  → 15 mΩ 分流器
  → XL4015 降压与输出控制
  → DCDC_OUT_VCC_5V

USB_IN+5V → MT9700 ───────────────┘

DCDC_OUT_VCC_5V
  ├─ EXT_+5V0_OUT
  ├─ ONBOARD_+3V3
  ├─ EXT_+3V3_OUT
  ├─ IPS1 隔离 5V / GND
  └─ IPS2 隔离 5V / GND
flowchart TD
  DC["DC1 / P3<br/>8–24 V"] --> PROTECT["SW1 · 自恢复保险<br/>TVS · 共模滤波"]
  PROTECT --> SHUNT["15 mΩ 分流器<br/>INA226_VIN+"]
  SHUNT --> BUCK["XL4015 降压<br/>续流 · 储能 · 输出控制"]
  BUCK --> BUS["DCDC_OUT_VCC_5V"]

  USB["USB_IN+5V"] --> LOAD["U14 · MT9700"]
  LOAD --> BUS

  BUS --> EXT5["EXT_+5V0_OUT"]
  BUS --> LDO1["U8 1117 → U11"]
  LDO1 --> ONBOARD3["ONBOARD_+3V3"]
  BUS --> LDO2["U9 1117 → U12"]
  LDO2 --> EXT3["EXT_+3V3_OUT"]
  BUS --> ISO1["U15 B0505S<br/>IPS1 5V / GND"]
  BUS --> ISO2["U16 B0505S<br/>IPS2 5V / GND"]

  CORE3["核心板排针"] -. 独立输入域 .-> SKY3["SKYSTAR_+3V3"]

这段上下文足以让 AI 提出正确的下一批问题:DC 与 USB 同时输入是否回灌、XL4015 与 LDO 的热耗散是否满足负载、隔离地有没有被其他网络跨接,以及核心板输入的 SKYSTAR_+3V3 是否与底板自产 ONBOARD_+3V3 混用。

它不能仅凭网络图回答这些问题,但至少不会漏掉问题。

5. 双板映射只保留固件真正关心的部分

核心板和底板都有 P1/P2 两个 40Pin 连接器。按相同引脚编号对齐后,可以得到下面这些高价值候选:

MCU 资源底板功能网用途
PA2 / PA1ETH_MDIO / ETH_REF_CLKEthernet 管理与参考时钟
PD1 / PD0MCU_CAN_TX / MCU_CAN_RXCAN 控制器接口
PD9 / PD8 / PD15RS485_RX / TX / RE-DE隔离 RS485
PB7 / PB6I2C1_SDA_PRE / SCL_PREI²C 总线预处理
PC6 / PB9ES8388_MCLK / WS音频时钟
PA8ONE_WIRE_DATADS18B20 等单总线设备
PC0ADC_POT模拟电位器输入

这不是已确认互连,仍需核对实物方向。但它已经能让 AI 发现关键资源冲突:

相比把 80 个针脚全部摊在正文里,这几组资源和冲突更适合直接进入 AI 上下文。完整针脚表可以由工具按需查询,不应该长期占用模型窗口。

四、哪些结果不能让 AI 自己补全

这次实测里,底板工程候选与网表达到了精确匹配;核心板却只有 181 条端点在两侧直接匹配,并出现 10 组候选重复。核心板还有层级表、导线父级缺失等诊断。

因此,可靠的上下文不应该只有“结果”,还必须带上限制:

当前证据可以说什么不能说什么
.epro2 器件/页面工程里存在该对象和属性实物一定安装、属性一定正确
.enet 引脚端点导出网表记录了该连接当前实物与该文件完全一致
接口候选信号组合像某类接口固件已经启用该外设
电源路径器件引脚和网络形成这条路径电流、稳定性、回灌和热设计已通过
同针号连接器映射两侧针号可以形成候选实物方向、镜像和插接关系已确认
DNP / 跳线当前工程记录了装配状态所有生产批次都采用同一配置

我宁愿让模型回答“这一步证据不足”,也不希望它凭经验把缺失部分补成一个看起来完整的方案。

五、从安装到第一次查询

本文使用 @yuanzihao/schemcp@0.2.0,需要 Node.js 22 或更高版本。

Codex:

codex mcp add schemcp -- npx -y @yuanzihao/schemcp@0.2.0
codex mcp list

Claude Code:

claude mcp add --transport stdio schemcp -- \
  npx -y @yuanzihao/schemcp@0.2.0

其他支持 stdio MCP 的客户端,核心配置也是运行同一个 npm 包。安装后没有打开工程时返回 binding=NOT_BOUND 是正常状态,表示服务已经启动,只是尚未绑定用户提供的工程。

第一次使用可以直接这样问:

请使用 SchemCP 分别打开我提供的核心板和底板 .epro2,
并把两份 .enet 绑定到对应工程,不要串用。

先建立 AI 上下文摘要,只输出:
1. 工程页面与功能域;
2. 主 MCU、板载占用、时钟、复位、BOOT 和调试资源;
3. 电源输入、转换、隔离域和主要负载域;
4. 按总线合并后的通信与外设清单;
5. DNP、跳线、属性冲突和解析诊断;
6. 核心板/底板连接器候选和可能的引脚冲突。

所有分页必须读到 nextCursor 为空。
把网表事实、规则候选和未验证项分开表述。
不要直接展开全部器件和全部引脚,等我追问时再按需查询。

这个流程比一开始就要求“分析完整原理图”更稳定。模型先得到一页左右的工程摘要,后续讨论 Ethernet、CAN、电源或 CubeMX 时,再沿对应页面和网络取细节。

六、我希望它最终沉淀成什么

SchemCP 不是自动画原理图的插件,也不是硬件设计判定器。它更像一层位于 EDA 工程和 AI 之间的只读上下文协议。

对我来说,它最实际的用途是:

下一步还需要继续解决核心板层级网表差异、匿名网络投影和实物连接器方向确认。等这些证据补齐后,才适合从“上下文摘要”进一步生成可进入项目的 BSP 引脚定义、CubeMX 配置建议和板级测试清单。

项目地址:github.com/yuanzihao/SchemCP