当时决定自己画一块板子,就是因为买来的成品最小系统板接线接到崩溃。传感器要5V、舵机要独立供电、屏幕要I2C,十几个杜邦线在面包板上绕成一团,还经常接触不良,排查一下午发现是某根线没插紧。后来想通了:与其跟飞线较劲,不如自己用嘉立创EDA设计一块真正符合项目需求的STM32最小系统扩展板。把最小系统核心和扩展排针画在同一块板子上,所有外设接口按自己的需求排布,焊接调试一次搞定,这个思路帮我把项目进入调试阶段的时间缩短了一半以上。这篇文章就把整个流程从头到尾拆开讲,零基础也完全可以跟着做出来。
1. 先搞懂再动手:最小系统扩展板的设计思路
1.1 最小系统到底"最小"到什么程度
很多人对"最小系统"有误解,以为是越简单越好,恨不得芯片旁边什么都不放。STM32要正常工作,电源、时钟、复位、启动配置、下载电路这五样缺一不可,但也不需要更多。
可以这样理解:芯片是一台发动机,最小系统就是让它能在台架上平稳点火并稳定运转的最少管路和设备。你不需要给发动机装轮子,但至少要有燃油供给、火花塞点火、电瓶启动和一根排气管。
对应到STM32F103C8T6上,典型的最小系统包含这些电路:
- 电源:ST官方数据手册写得很清楚,VDD引脚需要3.3V供电,每个电源引脚旁边放一个0.1μF去耦电容,通常还要在板级入口放一个10μF到22μF的储能电容。这个不是可选项,是芯片稳定运行的前提。
- 时钟:F103系列内部虽然有一个8MHz的RC振荡器,但精度约1%,跑串口通信会出现波特率误差,做定时器长时间累加也会飘。所以设计时通常外接8MHz无源晶振,配合两个20pF负载电容。
- 复位:STM32的NRST引脚是低电平复位,内部虽然有上拉,但为了可靠和方便手动复位,一般外接10kΩ上拉电阻和一个100nF电容到地,再串一个按键。
- 启动配置:F103有BOOT0和BOOT1两个引脚,决定芯片从Flash、系统存储器还是SRAM启动。常规运行模式是两个都被拉低。BOOT1在F103C8T6上复用PB2,一定要处理好。
- 下载调试:SWD只需要SWDIO、SWCLK两根线加电源地就能烧录,比JTAG省引脚,是小型板子的标准选择。
1.2 为什么建议第一块板子就画扩展板
市面上买得到的STM32最小系统板,典型如Blue Pill,已经把上面五样电路做好了,双排针也把大部分IO引出了。但它的问题在于:排针间距固定、排列固定,你用起来只能靠杜邦线转接。而扩展板的设计思路是,在最小系统基础上,把引脚以你自己项目需要的形态引出。
我建议新手第一块板子就画扩展板,原因有三个。第一,纯最小系统的参考电路满地都是,画完没有成就感;扩展板需要你考虑排针分组、电源扇出,像一个真实的小产品。第二,扩展板天然有实用价值——画完可以直接用在自己的项目里,而不是画完一次就吃灰。第三,它让你提前接触"如何把设计意图落实到物理布局",这是PCB设计里最核心的能力,嘉立创EDA的熟练度也会在这一过程中飞速提升。
设计目标很明确:板载完整的STM32F103C8T6最小系统,把几乎所有GPIO引出到2.54mm排针,同时引出3.3V和5V电源引脚。尺寸控制在一个合理的DIY范围,比如50mm乘40mm以内,方便后续放进任意外壳。
2. 从注册到新建工程:先把工具摸熟
2.1 标准版还是专业版,我劝你别纠结
嘉立创EDA现在有标准版和专业版两个编辑器,新手最常问的问题就是选哪个。我的答案是:直接用标准版。
标准版是纯网页端操作,打开浏览器就能画,没有安装门槛,元件库搜索、放置、连线、铺铜、导出Gerber这些核心操作都很流畅。专业版功能更强,支持多人协同、更复杂的规则设置,后期还可以导入Altium的工程文件,但对零基础用户来说,界面更复杂,快捷键逻辑也不太一样,学习成本明显更高。我见过很多新手一上来就开专业版,被各种面板和规则配置劝退的。
核心技能是通用的。器件选型思维、原理图连线习惯、PCB布局布线的物理观念,这些在标准版里学会之后,将来要迁移到专业版,最多一个小时就能适应。先跑通流程,再考虑效率,这是一个好顺序。
2.2 新建工程和界面布局,第一印象很重要
注册登录后,进入工作台,点"新建工程",工程名建议直接写STM32F103C8T6_MinSys_Board这种格式,后面下单打样、发给同事协作,别人一眼就能看懂。我见过有人命名成test1、111,过两周自己都分不清文件里是哪个项目,非常耽误事。
工程创建后会生成原理图和PCB两个文件。标准版界面主要分三块:左侧是元件库和工程树,中间是画布,右侧是属性面板。元件库支持中文搜索,这是嘉立创EDA对国内用户最大的友好点之一。别急着放元件,先花五分钟熟悉鼠标操作:滚轮缩放、右键拖动画布、左键选中元件、按Delete删除。顺手按一下键盘的Shift可以调出对齐工具栏,Ctrl+W是连线快捷键,这几个操作在后面的环节会反复用到。
还有一个实用习惯:设计前先在原理图里放好文本框,把板子规格写清楚。比如供电输入范围、预期层数、主要接口定义。这不算流程冗余,画到一半忘掉原始需求是常见事故。板子做到最后发现"我一开始想改成什么功能来着",然后推翻重画,真的浪费一个下午。
3. 原理图绘制:最小系统的每个元件都有存在理由
3.1 电源电路:3.3V不是接个稳压芯片就完事
在元件库搜索STM32F103C8T6,结果里有多种封装,一定要选LQFP48的贴片封装,也就是ST官方标注的UFQFPN48/LQFP48,字母后缀不同不要紧,封装选择不能错。放置到画布后,芯片周围的引脚就等着我们逐个接入。
然后是电源芯片。我习惯用AMS1117-3.3,SOT-223封装,最大输出电流1A,对于F103这样峰值电流不到100mA的MCU来说绰绰有余。输入接5V,输出3.3V。输入端放一个10μF钽电容或陶瓷电容,输出端放一个10μF加一个0.1μF的组合。大电容负责储能稳压,小电容负责滤除高频噪声。不要为了省一个电容而删掉0.1μF,高频响应正是这类LDO的弱项。
AMS1117的引脚顺序容易焊错,SOT-223封装从正面看,左到右是GND、GND、VOUT,中间是VIN。原理图库里的引脚顺序跟实物不完全一致,画PCB看封装时一定要检查。
电源指示灯也别省。一个LED串一个1kΩ电阻接在3.3V和GND之间,板子一上电就能看到是否正常工作。排查问题时这个灯能救你很多次。
最后,每个VDD引脚旁边放一个0.1μF电容,位置尽可能靠近引脚。F103C8T6有好几个VDD引脚,不要只放一个,否则工作不稳定时你根本不会怀疑到这种基础问题上。
3.2 时钟电路和复位电路:稳定的心跳
8MHz晶振用无源晶振,两个引脚分别接STM32的OSC_IN和OSC_OUT,即PD0和PD1。每个引脚各接一个20pF电容到地。负载电容的值不是随手写的,它与晶振的CL负载电容参数相关。8MHz晶振常见CL负载是20pF,那匹配电容通常取15pF到22pF,我用20pF做了很多块板子,串口波特率没有出过问题。
复位电路连接NRST引脚,一颗10kΩ电阻上拉到3.3V,一颗100nF电容下拉到地,按键并接在NRST和GND之间。这样平时NRST被上拉电阻拉高,芯片正常运行;按下按键,NRST被拉到地,复位。100nF电容的作用是滤除高频干扰,防止误复位。如果实际使用中复位不稳定,可以把100nF换成1μF,让复位脉冲更宽更可靠。
3.3 启动配置和下载电路:决定芯片从哪开始跑
BOOT0引脚必须拉低,用一个10kΩ下拉电阻。BOOT1在F103C8T6上复用PB2,也用一个10kΩ下拉电阻。如果你希望支持串口ISP下载,可以预留一个2pin跳线,把BOOT0引脚引出来,想ISP时跳线短接到3.3V,平时不装跳线帽即可。我在板上预留了这种方式,实际下载还是以SWD为主,跳线只是保险。
SWD接口用2.54mm间距的4pin排针或5pin排针,定义是3V3、SWDIO、SWCLK、GND,可选加一个NRST。SWDIO对应PA13,SWCLK对应PA14。很多成品板会在SWDIO和SWCLK串接22Ω电阻,抑制振铃。零基础新手画板时可以省略,但如果你用比较长的杜邦线连接ST-Link,加上这两个电阻会更稳定,实测能避免不少"连接不上"的玄学问题。
有一点值得专门提醒:不要把SWD引脚同时接到多个负载。比如PA13和PA14如果又被你用作了普通GPIO接LED,下载时可能会因为负载太重导致握手失败。扩展板上建议把SWD的排针和GPIO排针分开,调试口独立,杜绝这类冲突。
3.4 扩展排针:把每个GPIO都变成可用的资源
扩展板跟普通最小系统板的区别在这里体现。F103C8T6是LQFP48封装,除去电源、复位、晶振、BOOT这些专用引脚,大约有37个GPIO可用。按照功能把引脚分成几组引出——PA口一组、PB口一组、PC13到PC15一组,电源单独一组,这样做成项目时找引脚非常方便,不用每次都去看数据手册。
排针用2.54mm间距的直排针,每排20pin或10pin。放置排针时,网络标签要跟芯片引脚同名,比如PA0、PA1,这样连完线在PCB阶段转网络表时才不会乱。命名习惯上,我强烈建议用芯片官方引脚名直接作为网络名,不要起a0、b1这种缩写。后面调试写代码时,STM32固件库里的引脚宏定义也是PA0这种写法,原理图和代码一一对应,能少掉很多头发。
电源排针至少要引出3V3和GND,建议同时引出5V。如果后续项目要接舵机、继电器这类大功率负载,5V和GND排针就派上用场了。再预留几个独立的小电容位给外接模块做旁路滤波,不过这是后话,第一版不用加。
3.5 ERC检查:让低级错误在画板前现形
原理图全部画完后,点击菜单中的"设计"→"电气规则检查",嘉立创EDA会检查有没有未连接的引脚、短路、悬空网络等问题。零基础经常遇到两类报警:一类是引脚悬空,你确实没接,这类要确认是否故意悬空,STM32很多引脚如果不使用,悬空是可以接受的,但最好在原理图上标注NC或NC/悬空;另一类是单端网络,一般是连线遗漏或网络标签拼写不一致。常见拼写错误比如把3V3写成3V,报错之后排查非常痛苦,所以网络标签一定要统一命名规范,比如全板固定用3V3,不要混用。
ERC做完了,原理图就算画完。保存,然后进入最考验耐心的PCB阶段。
4. PCB布局与布线:这块小板子的成败全在这里
4.1 板框与层叠:动手前先定边界
原理图转PCB后,第一件事是画板框。板子尺寸不要随便拍脑袋。先把排针数量和排列想清楚:两排20pin的排针加上SWD接口和电源输入口,宽度大约是53mm,长度做到32mm左右比较宽裕。网上常见的Blue Pill成品板大约是53mm×22mm,那是两面密集排针的方案,新手自己画建议留点余地,我第一版就画了53mm×30mm,焊起来舒服很多。
板框用"板框层"的矩形工具画,尺寸可以在属性面板里精确填入。建议画完板框后在PCB空白区域放一个板名丝印和版本号,比如v1.0。拿到实物板子后,这一行小字会让你感谢自己。
层叠设置上,双层板足够。顶层铺信号和电源,底层基本铺GND铜皮。覆铜参数在右侧面板里设置,网格覆铜和实心覆铜都可以,信号完整性要求不高的场景用哪个都不影响。默认规则的线宽是6mil最小线宽、6mil最小间距,这对嘉立创的制程来说非常安全。电源和GND网络可以单独设置加宽规则:GND走线宽20mil到30mil,3V3宽15mil到20mil,普通信号8mil到10mil。
4.2 布局顺序:先核心,后外围,再连接件
布局直接决定布线难度。我的顺序是:芯片定中心,电源靠入口,晶振靠近OSC引脚,去耦电容贴着VDD,排针分布在边缘。
把STM32F103C8T6放在板子中心偏一侧,1脚方向确定好。LQFP48封装的1脚在左上角,用白色丝印三角形标记,处理封装时确认一下有没有这个丝印,没有就自己加,反面验证就不怕装反。晶振要尽可能靠近OSC_IN和OSC_OUT,也就是PD0和PD1,走线短是硬性要求,晶振下面不要走其他信号线,我见过很多新手在晶振底下走了电源线,结果波形抖动,串口随机乱码。复位电路的电阻电容按键可以放芯片左下角。AMS1117放在5V电源输入排针旁边,这样输入电流路径最短,发热也最容易散出去。
去耦电容的摆放是区分新手和老手的标准之一。0.1μF电容必须放在对应VDD引脚旁边,走线从VDD引脚出来,先到电容再到过孔打到底层GND覆铜。这种"先电容后过孔"的连接方式,能有效保证高频噪声就近回流到地平面。如果电容摆远了,引脚到电容之间那截走线就成了天线,去耦效果大打折扣。
排针最终布在外侧。PA口一排、PB口一排,电源和SWD口单独放。两排排针间距40mil到60mil都可以,具体看板框。
4.3 布线实操:星型接地在什么情况下才是正解
布线是新手最头痛的环节,但其实大多数走线都可以逻辑化处理。先把GND网络隐藏,布完信号和电源线后,最后铺铜连接GND。这样思路最清晰。信号线尽量走短路径,不要在板子上绕圈。相邻层走线尽量垂直,顶层横着走,底层竖着走,减少寄生耦合。这在双层板里天然成立,因为顶层和底层本来就隔着绝缘层,只要不叠着走长距离就没事。
电源线用规则强制加宽。嘉立创EDA的"设计规则"里可以对特定网络设置线宽,比如GND设20mil,3V3设15mil,排针对应的信号线保持8mil。批量布线时可以按住Ctrl同时选中多条线一起调整线宽,非常方便。
关于热搜里反复出现的"星型接地",我多说几句。星型接地的核心思想是:不同功能的电路地线分别走线,在系统的单一公共点汇合,避免大电流地回流引起的噪声串扰到小信号地回路。但这张板子是纯数字系统,功耗很小,没有高频模拟采集部分,用完整地平面覆铜就是最优解。
真正需要星型接地或者至少认真分隔接地的情况,是在板上增加模拟功能时。比如你在扩展板上接了ADC采样电路、运放、传感器信号调理,这时候模拟地和数字地就要分开规划,最后单点连接。连接点放在电源输入的地线汇合处,也就是AMS1117附近的GND过孔位置,用一个小电阻或者零欧电阻连接。简单说:没有模拟部分,大面积覆铜接地即可;有模拟部分,再考虑分隔和单点连接。不要一听"星型接地"就每个器件都拉一根地线回到原点,那是给高频功放设计的思路,套在数字小板上反而会搞出更多的地回路问题。
4.4 布线完成后的收尾:覆铜、丝印和DRC
信号线和电源线都布完,进入覆铜阶段。快捷键Shift+P是覆铜,点击PCB边界内部,设定网络为GND。注意在覆铜属性里勾选"去除死铜",避免产生孤岛铜皮。孤岛铜皮就像没接任何电气网络的悬浮铁块,会和板子形成寄生电容,干扰敏感信号。覆铜完成后,可以用"检查"功能中的"布线检查"先跑一遍,提示未连接网络时,回到对应位置补线。
丝印整理也很重要。位号默认摆放乱七八糟,选中所有丝印字符,一键"自动布局"后,再手动把重叠的、压到焊盘的移开。嘉立创EDA有丝印位号整理工具,可以让字符分布整齐,方向统一。丝印标注的要点是,电源接口附近印上电压值,SWD接口附近印上引脚名称,这块板子将来用的时候就不用每次拿原理图对着看了。
最后点"设计"→"DRC"跑一次设计规则检查,红色条目一般是未连接的线或间距过近的走线,黄色是警告。新手看到黄字不要慌,逐条看,确认不是实际错误即可。比如丝印重叠是警告,对功能无影响,但最好也清理掉。
5. 打样回来以后:焊接、点亮与排查
5.1 下单参数怎么选,尺寸和数量最实际
PCB画完,在嘉立创EDA里点"制造"→"PCB下单",文件会自动上传到工厂,进入下单页面后主要设置几项:板子数量、颜色、厚度、表面工艺、阻抗要求。
对这块扩展板,数量建议直接下5片,打样方案价格很便宜。颜色选蓝色或绿色都可以,纯看个人审美。板厚1.6mm,表面工艺选无铅喷锡或ENIG沉金,无铅喷锡性价比高,沉金适合需要经常插拔、对平整度有要求的板子。这两个工艺对性能差别不大,不必为"发烧"多花钱。不需要做阻抗控制,不需要加BGA焊盘,嘉立创的默认制程完全满足。
还要说一句:很多新手不知道下单时板子尺寸按实际生成,如果尺寸在10cm×10cm以内,属于小额打样标准价,超过了会按面积加价。我做的这个53mm×30mm扩展板就落在优惠区间内。
5.2 焊接顺序与BOM清单
板子到手后,按下面的BOM提前备好料,总成本非常有限:
| 位号 | 元件参数 | 封装 | 数量 |
|---|---|---|---|
| U1 | STM32F103C8T6 | LQFP48 | 1 |
| U2 | AMS1117-3.3 | SOT-223 | 1 |
| Y1 | 8MHz无源晶振 | 3215 | 1 |
| C1,C2 | 10μF陶瓷电容 | 0603 | 2 |
| C3,C4 | 20pF陶瓷电容 | 0603 | 2 |
| C5起 | 0.1μF陶瓷电容 | 0603 | 每个VDD旁一个 |
| R1,R2 | 10kΩ电阻 | 0603 | 2 |
| R3 | 1kΩ电阻 | 0603 | 1 |
| D1 | LED | 0603 | 1 |
| J1,J2 | 2.54mm排针 | 直插 | 若干 |
| SW1 | 轻触按键 | 6×6mm | 1 |
焊接顺序按"从矮到高、从核心到外围"的原则。先焊STM32的LQFP48芯片,因为它的引脚最多、最容易被其他元件挡住。对准方向后,先在四周引脚上薄薄拖一层锡,利用助焊剂和吸锡带拖平整。然后焊AMS1117和周围电阻电容,这些0603小型元件用镊子夹稳,一端先上锡固定,另一端轻松焊好。晶振焊在PD0/PD1附近。最后焊排针和按键。不建议一上来就焊排针,否则翻转板子时排针会挡住烙铁操作空间。
5.3 上电不工作的常见问题,按顺序排查
焊完板子,先不要插ST-Link。用万用表测3V3和GND之间的电阻,正常应该在数百欧以上,接近零说明有短路。常见短路点是AMS1117的中间VIN引脚和旁边GND焊盘桥连,或者LQFP48引脚之间的锡桥没清理干净。用放大镜检查一遍,不放心就用松香和吸锡带再拖一次。
接着上电,电源指示灯亮起来后,再测3V3是否稳定。如果灯不亮,优先查输入5V是否到位、AMS1117是否装反。如果芯片轻微发烫,立刻断电,多半是电源接反或者哪个引脚碰在一起,继续通电可能烧芯片。
用ST-Link连接SWD口,打开STM32CubeProgrammer或Keil,尝试连接芯片。最常见的失败提示是"No target connected"或者"Internal command error",排查顺序是:先看BOOT0是不是被拉低,再看SWD四根线是不是接反,最后确认ST-Link驱动是否正常。这里有个经验,SWD的3V3不要从板子的3V3排针取,直接从ST-Link引出3V3接到板子上SWD排针的3V3脚,两端共地后用杜邦线连接,成功率最高。因为有些ST-Link的供电能力有限,带不动整个板子,反而导致握手失败。
晶振不起振的问题不太常见,但遇到了一脸懵。用示波器探头点OSC_OUT引脚,正常能看到1V左右的峰峰值的正弦波,频率8MHz。如果没波形,检查电容值是否装错、晶振是否焊接虚焊。还有一种特殊情况,示波器探头本身的电容会让晶振停振,这是正常现象,把探头换成低电容探头或者在探头上串一个小电阻再看。
程序烧录成功、LED闪烁的那一刻,整块扩展板就算完全跑通了。
我个人的体会是,画一块板子的收获远不止"会操作软件"这么简单。它逼着你去查数据手册,理解每个引脚的功能。它让你在电脑前空想两个小时的布局,然后看着实物上电时那种满足感,是买成品板完全体会不到的。这块板子现在还躺在我的抽屉里,后来做温湿度监测、空气质量采集这些项目时,我都是基于它改出来的,每次都能省下重新画最小系统的时间,把精力放在更有价值的功能实现上。