
1. 先想明白一块STM32最小系统板到底要最小到哪一步画STM32最小系统板这件事说难不难说简单也不简单。我自己的第一版是拿洞洞板飞线凑出来的8MHz晶振的两根线拉出去快3厘米结果下载十次有三次失败后来老老实实画PCB才明白最小系统这四个字背后其实有一整套默认的必须项少一个都活不过来。所谓最小系统板就是把一颗STM32芯片从裸片变成能上电、能起振、能复位、能烧程序、能跑起来的最低配置电路它不做任何具体功能但任何功能都必须挂在它上面跑。网上能买到的那些STM32F103C8T6最小系统板本质上是这个最小系统外加USB转串口、加按键、加LED、加排针的增强版。我为什么建议你自己画一遍三个很实际的理由。第一现成板子的尺寸、接口位置、外形都不由你决定等你真要把板子塞进鱼缸控制器、智能台灯、数字温湿度计或者工业控制盒里的那一刻尺寸对不上就是最头疼的事。第二抄来的板子你永远不知道原理图里每个电容为什么在那儿出了问题只能换一块学不到东西。第三成本。F103C8T6一颗七八块钱加上LDO、晶振、电容、排针整板BOM控制在二十块以内完全没问题打样五片也就几十块。这篇东西我按真实做板的顺序走一遍先讲原理图里每个模块该怎么画、参数怎么算再讲PCB布局布线的取舍然后是打样回来怎么焊、怎么上电、怎么调通最后把踩过的坑整理成一张速查表。适合两类人看学过单片机但一直只用现成开发板的以及想从买模块拼装过渡到自己设计板子的。你不需要有很深的模电基础但得能看懂基本的欧姆定律和原理图符号。1.1 五个模块缺一不可把最小系统拆开看只有五件事必须做全供电把5V或电池电压稳到3.3V、时钟外部高速晶振给系统一个准的时基、复位上电可靠复位、手动复位可选、启动配置BOOT0/BOOT1决定从Flash还是系统存储器启动、下载调试接口SWD两根线。这五块画完板子就能跑。剩下的LED、按键、串口、USB、屏幕接口都属于体验层第一版可以先不加。有一点很多人一开始会搞混STM32内部其实自带8MHz的RC振荡器HSI也能跑程序那为什么还要外挂晶振因为HSI的精度只有正负1%左右而且随温度漂移做串口通信在115200这种波特率下勉强能用一旦要做USB、CAN、以太网、精确定时器捕获测频率这类对时钟敏感的东西就必须上外部晶振HSE。所以最小系统标配一颗8MHz无源晶振你要是做RTC还想加一颗32.768kHz的LSE晶振。1.2 自画板和买现成板怎么选并不是所有人都需要自己画。如果你只是学外设、做毕设、跑跑例程买一块F103C8T6最小系统板最省事二十来块钱插上就能用。什么时候该自己画我总结了几种典型情况板子要装进特定外壳、需要通过特定连接器对外接线、要用更高级的芯片比如STM32F407VET6或STM32G474CBT6而市面上没有合适的最小系统板、或者你要做的是一个完整产品原型而开发板的体积和成本都不可接受。还有一个隐含动机值得说自己画一遍你才算真正理解为什么开发板上要放那些电容。我见过太多人遇到延时函数卡死、ADC采样抖动、串口莫名丢包就只会怀疑代码实际上大半是电源纹波和地回路的问题。把这个板子从原理图到实物走一遍你对硬件的感觉会完全不一样。2. 原理图阶段每个电容都是有理由的画原理图最忌讳的是照着别人的图抄一遍问哪个元件干嘛用的答不上来。我建议你在AD或者立创EDA里建工程的时候先按模块把页面分块电源区、MCU区、时钟区、复位启动区、调试接口区。这样画完自己检查也方便。下面按模块说参数我给的都是实测能用的值。2.1 电源模块3.3V从哪儿来、怎么稳最小系统的电源输入一般有三种来源5V的USB口、7到12V的DC座、或者单节锂电池。无论哪种最后都要变成干净的3.3V。最常用的方案是AMS1117-3.3便宜、好买、SOT-223封装好焊。输入侧如果从USB的5V进来建议加一个SS34或1N5819肖特基二极管做防反接再并一颗10uF钽电容加一颗100nF陶瓷电容做输入滤波。输出侧AMS1117官方要求接一颗22uF钽电容ESR落在0.1到10欧姆这个区间才稳定。这里正好回答一个很常见的问题——把AMS1117输出端的钽电容换成陶瓷电容会不会有影响。会。陶瓷电容的ESR只有几毫欧远低于AMS1117环路稳定所需的ESR下限实际表现是输出可能出现几十毫伏的高频振荡严重的时候STM32会随机复位或者下载失败。如果你手头只有陶瓷电容两个办法一是选10uF陶瓷电容再串一个1欧姆的0805电阻凑ESR二是干脆换一颗对陶瓷电容友好的LDO比如RT9013-33500mA输出、静态电流小、输入范围2.2到5.5V唯一要注意的是它最大输入只有5.5V别直接接12V。电流预算得算一下。F103C8T6跑72MHz满速大约30到50mA加上LED、外接模块撑死200mA。AMS1117的压差按1.7V算5V进3.3V出200mA时功耗是0.34WSOT-223封装热阻大约60℃每瓦温升20℃左右室温下摸起来温热没问题。但如果你用12V输入压差变成8.7V同样200mA功耗就是1.74W芯片会烫到保护这种情况下必须用DC-DC降压而不是LDO。还有两个容易被漏掉的电源脚VDDA和VBAT。VDDA是模拟电源必须接从VDD通过一个磁珠或者0欧电阻引过来旁边配1uF加10nF的电容。有人图省事直接把VDDA并到VDD上普通场景能用但做ADC采样的时候噪声会明显变大。VBAT如果不打算接纽扣电池做RTC掉电保持直接接到3.3V就行千万别悬空悬空可能导致上电异常。位置推荐值作用LDO输入10uF钽 100nF滤低频和输入高频噪声LDO输出22uF钽或10uF陶瓷1Ω环路稳定、储能每个VDD引脚100nF 0402/0603高频去耦VDDA1uF 10nF模拟电源去耦VBAT接3.3V或纽扣电池备份域供电2.2 复位与启动配置两个电阻决定能不能烧程序复位电路很简单NRST引脚接一个10k电阻上拉到3.3V再并一个100nF电容到地可选再接一个轻触按键到地做手动复位。STM32内部有约40k的上拉理论上不接外部电阻也能工作但外部加一个更抗干扰成本几分钱没有不接的道理。真正容易被忽略的是BOOT0。F103C8T6的BOOT0是第44脚复位时采样电平BOOT0为低、BOOT1PB2任意从主Flash启动这是正常运行模式BOOT0为高、BOOT1为低从系统存储器启动也就是出厂内置的Bootloader能用串口下载程序。所以BOOT0必须有一个10k电阻下拉到地否则引脚浮空复位时电平不确定表现就是有时能下载有时不能。我通常的做法是BOOT0用10k下拉同时并一个2.54mm的跳线排针或者0欧电阻位需要串口下载时短接上拉到3.3V。BOOT1在F103C8T6上就是PB2一般当普通IO用加个10k下拉即可。注意BOOT0的走线尽量短远离晶振和电源开关节点这个脚采样的瞬间如果被干扰芯片会跑到错误的启动模式。2.3 时钟电路负载电容怎么算外部高速晶振接在PD0OSC_IN和PD1OSC_OUT上配两颗负载电容到地。这两颗电容不是随便选的得按晶振规格算CL (C1 × C2) / (C1 C2) Cstray其中CL是晶振手册标称的负载电容Cstray是PCB走线和引脚带来的寄生电容一般估3到5pF。两颗电容取相同的值C1C2C公式简化成C 2 × (CL − Cstray)。举个具体例子。市面上常见的8MHz贴片晶振标称CL20pF的居多Cstray取5pF那么C 2 × (20 − 5) 30pF实际取27pF或30pF都能用。如果买到的是CL10pF的晶振C 2 × (10 − 5) 10pF取10pF或12pF。你要是直接不管规格都放22pFCL10pF的晶振实际负载就偏大了起振会变慢甚至不起振。32.768kHz的LSE晶振情况类似它的CL一般是6pF或12.5pF对应负载电容在10pF到15pF之间具体看手册。LSE的驱动能力很弱选晶振时注意看等效串联电阻ESR超过70k欧姆的不要用。晶振电路还有两条硬性要求一是走线尽可能短我一般控制在10mm以内二是晶振下方和周围要有一圈完整的地最好再围一圈地孔把噪声挡住。串联的1M欧姆反馈电阻在STM32上可以省掉内部已经有但有些老晶振起振困难时加一颗确实能救回来。2.4 SWD调试口两根线解决所有问题下载调试只用SWD两根信号线PA13是SWDIOPA14是SWCLK外加3.3V和GND再留一个NRST就是标准五针。板子上放一个2.54mm的五针排针顺序按3.3V、SWDIO、SWCLK、GND、NRST排这样正插反插都不容易烧。有个细节值得提醒F103C8T6的PB3、PB4、PA15默认是JTAG的JTDO、NJTRST、JTDI如果程序里没有把JTAG禁用这三个脚当普通IO用会没有反应。解决办法是在初始化时打开AFIO时钟然后执行引脚复用重映射把JTAG关掉只保留SWD。用SWD调试就不受影响这也是我极力推荐用SWD而不是JTAG的原因省引脚、省空间。USB接口和UART接口属于可选。如果你想让板子直接插电脑就能下载可以加一个CH340C或者CH340N加Type-C座再加自动下载电路实现一键下载。如果想省事第一版只留SWD搭配一个几十块的仿真器就够了。3. PCB布局布线决定板子能不能一次成功的关键原理图画完只是纸上谈兵PCB才是真正考验。我的经验是STM32最小系统这种板子用两层板完全够不用上四层但布局顺序和几个关键区域的走线必须讲究。3.1 封装别选错BOM提前核F103C8T6是LQFP48封装0.5mm引脚间距焊盘宽度一般取0.28到0.3mm长度1.5mm左右内缩外扩要合适。这个尺寸人工焊接完全可行但前提是封装画对。我踩过一次坑封装焊盘内缩太多芯片放上去引脚够不着焊盘整板报废。建议直接用立创商城或者官方库里的现成封装别自己画。元件规格备注主控STM32F103C8T6 LQFP48也可换F407VET6/G474CBT6LDOAMS1117-3.3 SOT-223或RT9013-33 SOT-23-5高速晶振8MHz 3225贴片负载电容按手册选低速晶振32.768kHz 3215可选做RTC才需要电阻电容0603为主去耦用0402手工焊建议0603起调试接口2.54mm 5P排针或1.27mm贴片座去耦电容的数量按VDD引脚数来F103C8T6有三个VDD、三个VSS、一个VDDA、一个VSSA所以准备五颗100nF加一颗1uF加一颗10nF。电容焊盘用0402其实不太好焊初学者换0603容值不变只是自谐振频率稍低对100MHz以下的应用完全够用。3.2 布局顺序先定接口再定芯片布局我遵循一个顺序先把对外的接口固定下来——SWD排针放板边方便插拔电源输入座放另一侧晶振紧贴芯片去耦电容紧贴对应电源脚。芯片放中间旋转到走线最顺的角度。去耦电容的摆放有个讲究100nF必须放在VDD引脚和最近的过孔之间走线顺序是过孔 → 电容 → 引脚中间不要让走线分叉。这样高频噪声先在电容上被旁路掉不会顺着走线传到芯片里。很多新手把电容放在芯片下面几毫米远的地方再拉一根长线过去等于白放。3.3 布线这几处走线的宽度和长度有讲究线宽方面普通信号线8到10mil0.2到0.25mm就够电源线走20到25mil0.5到0.6mm地线尽量走宽或者直接铺铜。1oz铜厚、20mil线宽、走1A电流时温升大约10℃我们这点电流余量巨大。晶振走线必须短、直、等长两根线尽量并排走下面铺完整的地。不要在晶振区域下方走任何其他信号线尤其是SWD和电源开关节点。晶振和LDO要远离彼此。LDO输出虽然稳但输入侧如果有DC-DC开关节点是强干扰源得离晶振和模拟区远一点。如果板上确实有DC-DC把它放在板子一角电感和开关走线围出最小的环路面积。地平面能铺就铺。两层板的话顶层走信号底层尽量保持完整的地打断的地方用跳线或者绕行补回来。实在要跨分割就在跨的地方加一颗100nF缝合电容别让返回电流绕大圈。SWD的两根线不用做阻抗控制普通走线即可但如果排针离芯片超过5厘米串一个22到33欧姆的电阻能改善信号质量。3.4 打板前除了DRC还要自己看一遍系统自带的DRC检查只能发现线距、间距这类规则问题还有一堆规则检查不到的东西必须人眼过电源和地的网络是否正确连到所有VDD/VSS引脚尤其是VDDA别漏BOOT0是否确实下拉SWD排针的丝印顺序和实际网络是否对应晶振的封装方向、1脚标记有没有搞反丝印上有没有把3.3V和5V标反这个错误很致命板边留没留够打样厂的工艺边要求一般单边留0.5到1mm我自己会做一份假装配图把生成的光绘文件导出来对着原理图一个网络一个网络地走。听起来很笨但确实能拦住八成以上的低级错误。打样选最便宜的常规工艺就行1.6mm厚度、1oz铜、绿油白字不用上沉金除非你要做很细的间距。4. 焊接与上电板子回来之后怎么干打样回来那天别急着把芯片焊上去。我建议分两步走先焊电源部分测通了再焊MCU。这样如果3.3V有问题是LDO的问题不会连累到芯片。4.1 焊接顺序和温度先用刀头烙铁或者风枪焊LQFP48。我常用的是风枪280℃、风量调到最小档先在焊盘上薄薄涂一层助焊膏把芯片对准放好然后沿四个边来回吹看到焊锡融化、芯片自己贴下去就停。冷却后用放大镜或者手机微距检查有没有连锡有的话涂助焊膏用刀头拖一遍。0603的阻容用风枪或者烙铁都行先固定一端再焊另一端。晶振和LDO的焊接温度别超过260℃太久尤其晶振过热会导致频偏甚至失效。注意LQFP48的引脚非常脆弱风枪不要对着一个点长时间吹也不要用力按压芯片引脚弯了基本救不回来。4.2 上电前必做的三步板子焊完先别通电。按下面三步检查第一步用万用表蜂鸣档测3.3V和GND之间是否短路。LQFP48芯片焊完之后短路概率不低测到短路先找连锡别硬通电。第二步目视检查二极管、钽电容的极性有没有反。钽电容反接会炸这个不是玩笑。第三步把电源调到5V、限流设到100mA再上电。如果电流直接顶到限流值立刻断电说明有短路或者芯片焊反了。上电后先测几个关键点电压LDO输出应该是3.3V上下5%NRST应该是3.3VBOOT0应该是0V。三个都对再往下走。4.3 SWD连不上别急着重焊第一次连接失败太正常了我自己的第一版折腾了两天。排查有一个固定顺序按这个走基本能定位先看BOOT0。如果BOOT0是高电平芯片会从系统存储器启动SWD可能连不上把BOOT0短接到地再试。再看供电和复位。用示波器或者万用表确认3.3V稳定NRST确实是高电平。有些板子的复位按键焊歪了把NRST拉到地芯片一直处在复位状态自然连不上。然后看晶振有没有起振。用示波器探头10倍衰减档别用1倍档探头电容会影响起振碰一下OSC_IN脚看到8MHz正弦波就说明起振正常。如果不起振先把负载电容取小一点试试比如从22pF换成15pF。如果程序里把PA13、PA14配成了普通GPIO或者进了低功耗模式SWD也会失联。这时候在Keil或者仿真器软件里选Connect under Reset也就是复位状态下连接能救回来。最后一种情况是芯片本身坏了通常是焊接温度过高或者静电打坏。换个芯片试试如果换了就好说明之前那颗没救了。5. 常见问题速查表与避坑经验做到第三第四版之后我把遇到的问题整理成了下面这张表基本上新手会碰到的都在里面。现象最可能的原因处理办法3.3V输出只有1点几伏LDO输出电容ESR不合适振荡换钽电容或加1Ω串联电阻上电电流超限焊接连锡、钽电容反接断电检查重点看LQFP引脚SWD时连时断BOOT0浮空、晶振走线长下拉BOOT0缩短晶振走线下载后程序不运行晶振没起振配置用了HSE检查负载电容、改用HSI测试串口通信乱码时钟不准确认HSE频率与代码里一致ADC采样跳动大VDDA去耦不足加1uF10nFVDDA单独走线复位后偶尔死机复位电容太大或者没接用100nF别用1uF除了表里这些还有几条我认为比技术参数更重要的经验。第一条第一版别追求功能全。我见过很多人第一次画就想把USB、串口、屏幕、SD卡、按键、LED全塞进去结果一版失败排查的时候变量太多根本不知道问题出在哪儿。最小系统就先做最小系统跑通了再迭代。第二条每个关键节点留测试点。3.3V、GND、NRST、BOOT0、SWDIO、SWCLK这几个位置各放一个1mm的测试焊盘。板子出问题时有测试点和没有测试点排查效率差出十倍。第三条丝印是你的救命稻草。把引脚功能、电压、接口定义都标在丝印上板子放一年之后你还能看懂。尤其是SWD排针的顺序一定要标清楚。第四条手头常备一块能用的参考板。当你的板子连不上时用同样的仿真器和线去连一块确定能用的开发板能连上就说明是板子的问题连不上就是工具或驱动的问题这一步能省掉大量时间。第五条仿真器固件和驱动也要更新。有些老版仿真器的固件对新型号芯片支持不好问题表现得像板子坏了。我之前就遇到过一块F103C8T6怎么都连不上换了个新仿真器一次成功浪费了大半天。6. 板子跑起来之后这块板还能怎么用最小系统调通的那一刻你会发现它其实是个万能底座。我手头这块F103C8T6的板子先后被我拿去做了几个东西接DHT11加OLED做了个数字温湿度计加报警器接了四路MOS管做鱼缸的灯光和加热控制接了HR4988驱动步进电机做过小型的运动平台还拿来读过伺服驱动器的485报文。你会发现这些应用里最小系统板的部分是完全不动的变的只是外设和代码。如果你打算在这颗板子上继续往上做有几个方向可以提前规划。一是把调试接口从排针换成1.27mm的贴片座省空间二是预留一个USB Type-C座和CH340做成插上就能下载的版本三是如果要做高精度模拟采集把VDDA的供电做复杂一点加LC滤波或者单独一颗LDO。四是如果以后要换成STM32F407VET6或者STM32G474CBT6这种引脚更多的型号原理图的模块划分不用改只是改芯片封装和引脚映射布局重新排一下就行。开发环境这边Keil5装好STM32的芯片包之后新建工程选好器件型号把启动文件和标准库或者HAL库加进去就能跑。我个人的习惯是先用标准库把GPIO、时钟、串口这几个基础外设跑通确认硬件没问题再决定后面用库还是上RTOS。至于那些网上的教程和视频看看可以但一定要自己在板子上验证一遍硬件这东西不动手永远学不会。最后说一个我自己做板子几年下来最深的体会图纸上的每一个电容、每一根线的宽度背后都有它的理由你抄的时候抄不出这个理由只有自己想一遍才明白。第一次失败很正常把失败的原因记录下来第二版就会顺很多。元件清单和原理图不用一次做完美先做能跑起来的版本再谈优化。