
1. 当AI开始画原理图这件事到底靠不靠谱第一次跟朋友提让AI帮我画STM32最小系统原理图这个想法时对方回了一句你是想让它帮你画还是想让它帮你把板子烧了这个反应其实挺有代表性的。在硬件圈子里大家对AI辅助设计的态度一直是能用但不敢全信尤其是原理图这种一旦画错、后面PCB打样、焊接、调试全都要跟着遭殃的环节。但实际情况是STM32F103C8T6最小系统板这个东西几乎是每个嵌入式工程师入门时都画过一遍的标准答案。它的电路结构高度固定一颗MCU、一组去耦电容、一个复位电路、一个8MHz晶振加两个负载电容、一个BOOT跳线、一个SWD调试口、一个电源指示LED再加上稳压部分。正因为结构足够标准化它反而成了验证AI能不能参与硬件设计流程的绝佳试验田。我这次做的事情是用Claude Code作为执行代理通过脚本化的方式去驱动嘉立创EDA专业版把上面这套最小系统的原理图自动生成出来。整个过程不是AI一键出图那种营销话术而是把原理图绘制拆解成一系列可编程的原子操作——放置元件、设置位号、连线、加网络标签、放电源符号——然后让AI根据一份结构化的电路描述去逐条执行。这篇文章适合三类人看一是想了解AI Agent怎么跟EDA工具打交道的硬件工程师二是已经会用嘉立创EDA但想提升效率、减少重复劳动的人三是对AI硬件这个交叉方向好奇、想自己动手试一下的开发者。我会把整个链路的原理、踩过的坑、实际可复现的步骤都摊开讲不藏私。需要先说明一点这套方案的核心价值不在于省下画一张图的时间而在于把重复性的、结构固定的原理图绘制变成可复用、可参数化的流程。你画一次STM32F103C8T6下次换成F103C6T6或者加个CAN收发器改几个参数就能重新生成这才是真正省时间的地方。2. 为什么选Claude Code 嘉立创EDA这个组合2.1 Claude Code在硬件脚本场景里的定位Claude Code本质上是一个能读写文件、执行命令、调用工具的AI Agent。它跟普通聊天式AI最大的区别在于它能真正动手——读你的工程文件、写脚本、跑命令、看结果、再修正。这个能力放到硬件设计场景里就变成了一个能理解电路意图、能生成操作脚本、能根据报错自我调整的中间层。我试过几种不同的AI参与方式。纯对话式让AI给网表它给的元件参数经常是拍脑袋的比如去耦电容给你写个0.5uF晶振负载电容写个33pF却不告诉你这是针对特定CLK规格的。而用Agent模式AI可以直接读到我提供的元件库文件、封装信息、引脚定义输出的东西就有据可依。Claude Code还有一个我很看重的特性它能维护一个上下文工程。整个绘制过程中它知道当前已经放了哪些元件、哪些网络已经连好、哪些还悬空。这种状态管理能力是让自动化绘制从玩具变成能用的关键。2.2 嘉立创EDA专业版的脚本接口能力选嘉立创EDA专业版而不是其他工具主要原因是它的扩展脚本体系相对开放。专业版支持通过JavaScript API去操作原理图文档对象包括创建元件、设置属性、绘制导线、添加网络标签等。这意味着只要我能生成符合它API规范的脚本就能程序化地完成绘制。对比一下几个常见选择工具脚本/自动化能力元件库友好度上手成本嘉立创EDA专业版支持JS扩展API可操作原理图对象立创商城库直接调用封装齐全中某国外开源EDA支持Python脚本生态成熟库需自行维护高传统商业EDA部分支持宏命令库庞大但授权复杂高嘉立创EDA专业版的优势在于它的元件库跟立创商城的物料是打通的。我画STM32F103C8T6的时候直接调用商城里的元件封装、引脚、位号规则都是现成的省掉了大量核对引脚的工作。这一点对自动化流程特别重要——如果元件库本身不规范AI生成的脚本再准也没用。2.3 这个组合真正解决的问题说句实在话如果只是画一张STM32F103C8T6最小系统手动画也就一两个小时的事用AI折腾脚本可能前期投入还更大。所以这个方案的价值点必须说清楚批量变体同一套核心电路换MCU型号、换晶振频率、加不同外设参数化生成。减少低级错误位号重复、网络标签拼写错误、去耦电容漏放这些人工容易犯的错脚本化后基本杜绝。知识沉淀把STM32最小系统该怎么画这件事从某个人的经验变成一份可执行的电路描述文件。教学演示给新人讲最小系统时可以现场改参数、现场重新生成比对着静态图讲直观得多。提示不要指望AI能替你完成电路设计决策。它擅长的是执行你已经想清楚的方案而不是替你想方案。电源怎么分配、去耦电容放几颗、晶振走线怎么处理这些还是得你自己定。3. 让AI看懂电路结构化描述文件的设计3.1 为什么不能直接让AI自由发挥我一开始的想法很天真直接跟Claude Code说帮我画一个STM32F103C8T6最小系统原理图然后等它输出。结果它给出来的东西元件是齐的但连接关系全靠猜——VDDA和VDD它给你连一起了NRST上的电容它放了个100nF实际应该是100nF没错但它没说明为什么BOOT0它直接接地了却没提这是从Flash启动的配置。问题出在AI对最小系统这个词的理解是模糊的。它知道大概要放哪些东西但不知道你的具体设计意图。所以正确做法是——先由人写一份结构化的电路描述再让AI去执行。3.2 电路描述文件应该包含什么我最后定下来的描述文件格式是这样的用JSON组织分几个层次{ project: STM32F103C8T6_MinimalSystem, mcu: { part: STM32F103C8T6, package: LQFP48, power_pins: [VBAT, VDD_1, VDD_2, VDD_3, VDDA], ground_pins: [VSS_1, VSS_2, VSS_3, VSSA], reset_pin: NRST, boot_pins: [BOOT0, BOOT1] }, power: { input: 5V_USB, regulator: AMS1117-3.3, output: 3V3 }, decoupling: { target: 3V3, capacitors: [100nF x4, 10uF x1] }, clock: { type: HSE, frequency: 8MHz, load_cap: 20pF }, reset: { type: RC, resistor: 10k, capacitor: 100nF }, debug: { interface: SWD, pins: [SWDIO, SWCLK, NRST, 3V3, GND] } }这份文件的关键在于每个参数都有明确的物理含义AI不需要猜。比如去耦电容写100nF x4AI就知道要放4颗100nF晶振负载电容写20pF它就不会乱填。3.3 描述文件到脚本的映射逻辑有了描述文件下一步是让Claude Code把它翻译成嘉立创EDA的API调用序列。这个映射关系需要提前定义好我整理了一张对照表描述文件字段对应EDA操作注意事项mcu.part从库中检索并放置元件需确认库中位号前缀为Upower.regulator放置稳压芯片注意输入输出引脚方向decoupling.capacitors批量放置电容并连到电源网络位号前缀C需自动编号clock.load_cap放置晶振负载电容容值需与晶振规格匹配reset.resistor放置复位电阻位号前缀Rdebug.pins放置排针或调试座网络标签需与MCU引脚对应这张表是整个自动化流程的字典。Claude Code拿到描述文件和这张映射表就能生成对应的脚本。我实际用下来映射表越细生成结果越准。一开始我只写了放置去耦电容结果AI把电容全堆在一起没连线后来改成放置电容并连接到3V3和GND网络它就知道要加网络标签了。3.4 描述文件的版本管理这一点很多人会忽略。电路描述文件应该跟代码一样纳入版本管理。我现在的做法是每个项目一个描述文件改动记录写清楚。比如从8MHz晶振改成16MHz描述文件里改一个字段重新生成diff一下就知道原理图哪里变了。这样做还有个好处当AI生成的图和你的预期不符时你能快速定位是描述文件写错了还是AI理解错了。如果是描述文件的锅改文件如果是AI的锅调整映射规则或提示词。责任边界清晰排查效率高。4. 从零跑通环境搭建与脚本生成实操4.1 环境准备清单在开始之前你需要准备这些东西嘉立创EDA专业版建议用较新版本老版本的扩展API可能不完整。Claude Code安装在你的开发机上能访问本地文件系统。Node.js环境因为嘉立创EDA的扩展脚本是JavaScript本地调试需要Node。一个空的EDA工程新建一个原理图工程作为脚本操作的目标。安装Claude Code的过程这里不展开官方文档写得很清楚。重点说一下配置你需要让Claude Code能访问到你的工程目录和描述文件目录。我一般会在项目根目录放一个CLAUDE.md里面写清楚这个项目的结构、描述文件位置、映射表位置这样Claude Code一进来就知道该干什么。4.2 第一步让AI读取并校验描述文件环境好了之后第一件事不是直接生成脚本而是让Claude Code先读描述文件做一次逻辑校验。我用的提示词大概是这样读取 ./circuit/stm32_minimal.json检查以下内容 1. 所有电源引脚是否都有对应的去耦电容 2. 晶振负载电容是否与晶振频率匹配8MHz通常配20pF 3. 复位电路是否完整电阻电容 4. BOOT引脚是否有明确配置 5. SWD调试口是否包含必要信号线 输出一份检查报告列出缺失项和可疑项。这一步非常关键。我实测下来AI在校验任务上的表现比生成任务稳定得多。它能发现一些我自己写描述文件时漏掉的东西比如有一次我忘了给VDDA单独加去耦电容它直接指出来了。4.3 第二步生成嘉立创EDA操作脚本校验通过后让Claude Code生成脚本。这里要注意嘉立创EDA的API调用是有顺序要求的——必须先创建元件再设置属性最后连线。顺序错了会报错。我让AI生成的脚本结构大致是这样的// 伪代码示意实际API名称以官方文档为准 const eda require(eda_api); // 1. 放置MCU const mcu eda.placeComponent(STM32F103C8T6, U1, {x: 200, y: 150}); // 2. 放置电源稳压 const ldo eda.placeComponent(AMS1117-3.3, U2, {x: 100, y: 100}); // 3. 批量放置去耦电容 const capPositions [ {x: 250, y: 100}, {x: 270, y: 100}, {x: 250, y: 120}, {x: 270, y: 120} ]; capPositions.forEach((pos, i) { eda.placeComponent(100nF, C${i1}, pos); }); // 4. 放置晶振及负载电容 eda.placeComponent(8MHz_Crystal, Y1, {x: 150, y: 200}); eda.placeComponent(20pF, C5, {x: 130, y: 220}); eda.placeComponent(20pF, C6, {x: 170, y: 220}); // 5. 连线与网络标签 eda.addNetLabel(3V3, {x: 250, y: 90}); eda.connectPins(U1.VDD_1, 3V3); // ... 后续连接实际脚本比这个长得多但结构就是这样。Claude Code会根据描述文件自动展开这些调用。4.4 第三步在EDA中执行并观察结果脚本生成后在嘉立创EDA的扩展脚本环境里执行。第一次跑大概率会报错常见的有元件库中找不到指定型号型号名拼写问题引脚名称不匹配比如库里叫VDD你写的是VDD_1坐标重叠导致元件堆叠这时候不要慌把报错信息贴回给Claude Code让它修正脚本。我实测下来一般迭代2到3轮就能跑通。这个过程本身就是AI人工协作的典型形态——AI负责快速试错人负责判断方向。4.5 第四步人工复核不可省略脚本跑完原理图出来了但这不代表完事。必须人工复核。我复核的时候重点看这几项电源网络是否全部连通有没有悬空的电源引脚去耦电容是否都接到了正确的电源和地晶振负载电容容值是否正确复位电路极性是否正确电容接VCC还是接GND取决于复位芯片类型网络标签有没有拼写错误有一次AI把BOOT0写成了BOOT_0网络标签对不上导致BOOT0引脚悬空。这种错误肉眼扫一遍就能发现但如果不复核打样出来就是一块废板。5. 那些让我熬夜的坑位号冲突、引脚悬空与网络标签5.1 位号自动编号的坑嘉立创EDA在放置元件时会自动分配位号但脚本批量放置时如果不同时指定位号它可能给你生成一堆重复的。我第一次跑的时候4颗去耦电容全叫C?后面手动改了半天。解决办法是在脚本里显式指定位号并且用一个计数器保证唯一性。Claude Code生成的脚本里我让它维护一个位号池const refCounters { R: 0, C: 0, U: 0, Y: 0 }; function nextRef(prefix) { refCounters[prefix] (refCounters[prefix] || 0) 1; return ${prefix}${refCounters[prefix]}; }这样每放一个元件位号自动递增不会冲突。这个逻辑看起来简单但如果不提前设计后面改起来很麻烦。5.2 引脚悬空的隐蔽性引脚悬空是最难发现的问题之一。原理图上看起来连线都连了但某个引脚就是没接。AI生成脚本时如果描述文件里没明确说某个引脚要接什么它可能就跳过了。我的应对策略是在描述文件里强制要求每个引脚都有归属。要么接到某个网络要么明确标记为NC不连接。然后在脚本里加一个校验步骤遍历MCU所有引脚检查是否都有网络归属。没有的就报错。这个校验逻辑我让Claude Code写成了一个独立函数每次生成脚本后自动跑一遍。实测下来这个检查帮我抓出了至少三次引脚遗漏。5.3 网络标签的命名一致性网络标签是原理图的神经系统标签对不上电气连接就是断的。AI生成标签时容易出现大小写不一致、下划线位置不对、缩写不统一的问题。我现在的做法是在描述文件里定义一份网络标签字典所有标签必须从字典里取。比如{ net_labels: { power_3v3: 3V3, power_5v: 5V, ground: GND, reset: NRST, boot0: BOOT0, swdio: SWDIO, swclk: SWCLK } }脚本里所有网络标签都通过字典引用不直接写字符串。这样即使要改命名规则改一处就行不会漏改。5.4 元件库型号匹配的坑嘉立创EDA的元件库很庞大同一个型号可能有多个版本不同封装、不同厂商。AI检索时如果只给型号名可能匹配到错误的那个。我的经验是在描述文件里同时指定型号和封装。比如不写STM32F103C8T6而是写STM32F103C8T6 LQFP48。这样匹配精度高很多。另外对于常用元件我会在描述文件里直接写立创商城的物料编号这样最准。5.5 坐标重叠导致元件堆叠脚本批量放置元件时如果坐标没算好元件会叠在一起。原理图上看起来只有一个元件实际上下面压着好几个。这个问题在后期DRC检查时才会暴露排查起来很烦。解决办法是在脚本里实现一个简单的布局算法。我让Claude Code写了一个按功能分区放置的逻辑——电源部分放左上、MCU放中间、晶振放右下、调试口放右侧。每个区域内的元件按网格排列间距固定。这样生成的原理图虽然不如手工布局美观但至少不会重叠而且结构清晰。6. 生成之后DRC检查与人工复核的配合6.1 让AI先跑一遍自动检查脚本执行完先别急着看。让Claude Code调用嘉立创EDA的DRC设计规则检查接口跑一遍自动检查。常见的检查项包括未连接的引脚重复的位号网络标签冲突电源和地短路AI拿到DRC报告后可以自动分析哪些是误报、哪些是真问题。比如未连接引脚有时候是因为该引脚本来就该NC这时候在描述文件里标记一下就行。6.2 人工复核的重点清单自动检查过了人工复核还是要做。我整理了一份复核清单每次生成后逐项过检查项检查方法常见问题电源连通性看电源网络是否覆盖所有电源引脚VDDA漏接去耦电容数数量、看容值、看连接数量不足或容值错误晶振电路看负载电容容值和连接容值不匹配复位电路看电阻电容值和拓扑极性接反BOOT配置看BOOT0/BOOT1电平配置错误导致启动模式不对调试口看SWD信号线是否齐全漏接NRST网络标签逐个核对拼写大小写不一致这份清单看起来基础但每次都能查出点东西。我印象最深的一次是VDDA的去耦电容漏了自动检查没报因为VDDA确实连到了3V3但人工复核时发现VDDA和VDD共用了一颗电容这在要求高的场合是不行的。6.3 从原理图到PCB的衔接原理图确认无误后下一步是转PCB。这一步AI能帮的忙有限因为PCB布局涉及太多工程判断——走线宽度、层叠结构、EMC考虑。但AI可以做一件事检查原理图的网络表是否完整确保转PCB时不会丢网络。我一般会让Claude Code生成一份网络表摘要列出所有网络及其连接的引脚。这份摘要跟原理图对照着看能快速发现遗漏。6.4 版本迭代时的回归检查当你修改描述文件重新生成原理图时一定要做回归检查。因为AI每次生成的结果可能有细微差异上次没问题的这次可能出问题。我的做法是每次重新生成后把新旧网络表做diff看哪些网络变了。如果变化在预期内比如就是改了晶振频率那就没问题如果出现了预期外的变化就要查原因。7. 这套流程真正省时间的地方在哪7.1 从画图到描述电路的思维转变用这套流程最大的收获不是省下了画图的时间而是强迫自己把电路设计意图写清楚。以前画图很多细节是脑子里有数手上画出来但没写下来。现在要写描述文件每个引脚接什么、每颗电容放哪里都得明确。这个转变一开始有点别扭但习惯了之后发现它让设计过程更严谨了。而且描述文件本身就是一份最好的设计文档后面维护、交接、复用都靠它。7.2 批量生成变体电路的实测效率我拿这个流程做过一次对比测试手动画一张STM32F103C8T6最小系统熟练的话大概90分钟用这套流程第一次搭建环境加调试花了差不多4小时但之后每生成一张变体图从改描述文件到复核完成大概20分钟。也就是说从第二张图开始效率优势就体现出来了。如果你经常需要画结构相似的电路比如不同型号MCU的最小系统、不同外设的扩展板这套流程的投入产出比很高。7.3 适合和不适合的场景适合的场景结构标准化的电路最小系统、电源模块、常见接口电路需要批量生成变体的项目教学演示和知识沉淀不适合的场景高度定制化的模拟电路AI对模拟电路的理解还很有限涉及高频、射频的电路布局布线要求太高安全相关的电路不能容忍任何不确定性7.4 我对AI辅助硬件设计的真实看法用了这段时间我的结论是AI目前是高效的执行者不是可靠的设计者。它能把你已经想清楚的方案快速实现出来能帮你检查一些低级错误但它不能替你做设计决策。所以正确的用法是人负责设计AI负责实现和检查。这个分工下效率提升是实实在在的。但如果指望AI从零帮你设计一个电路那大概率会失望。最后分享一个我踩过的坑有一次我让AI优化一下去耦电容的布局它把电容全挪到了MCU的另一侧理由是这样看起来更整齐。结果走线变长了去耦效果反而变差。从那以后我明确了——布局相关的决策AI只给建议最终由人拍板。