
画这块 STM32F103RCT6 最小系统板的时候我其实刚从“开发板跑通一切”的舒服区里走出来。开发板确实省事但一到要做产品原型、控制体积、或者项目里要用到编码器接口和多路 ADC 时核心板那一堆用不上的外设就成了累赘。STM32F103RCT6 是 Cortex-M3 内核里很能打的一颗料LQFP64 封装256KB Flash、48KB SRAM主频跑到 72MHz比人手一块的 STM32F103C8T6 容量翻了好几倍价格却只贵几块钱。做无刷电机 FOC 驱动、编码器位置读取、多路传感器采集这种工程代码空间和内存压力都小很多。这篇就把我从原理图画到 PCB、再打样焊接调试的整个过程拆开讲打算脱离开发板自己做板子的朋友可以直接照着来。1. 自己画最小系统的底气先搞清楚要什么1.1 为什么不用现成的最小系统板市面上十几块钱就能买到一块很不错的 STM32 最小系统板Type-C 供电、RGB 灯、一键复位、SWD 接口全都有。那为什么还要自己画我遇到最多的情况是产品要做的板子形状、接口位置、供电电压完全跟开发板对不上比如要集成到电机驱动器里、要做成邮票孔模块贴到主板上、要用 5V 或者 12V 直接供电而不是 USB 供电。这时候买来的最小系统板要么塞不进结构里要么叠在电路上显得极其别扭。另外自己画一遍原理图等于把电源、时钟、复位、启动配置这套“最小系统”的底细彻底摸了一遍。很多用开发板的同学连 BOOT0 为什么要接下拉、NRST 为什么要加上拉电阻、晶振旁边那两颗电容怎么取值都没有真正想过。等出了问题比如 SWD 连不上、程序跑起来时间不准、ADC 数值乱跳就完全不知道从哪下手。画板子这个过程本身就是一次最好的硬件排障训练。1.2 STM32F103RCT6 选型性价比分析F103RCT6 和 C8T6 都是 F103 大家族里的常青树引脚都是 LQFP64硬件设计上几乎可以无缝切换。差异在内部资源RCT6 的 Flash 是 256KBSRAM 是 48KB而 C8T6 只有 64KB Flash、20KB SRAM。这个差距在裸机开发时可能感觉不明显一旦上 RTOS、跑 FOC 算法、存多组标定表C8T6 就非常紧张。我见过一个做无刷电机驱动的兄弟代码编译后接近 60KBC8T6 眼看就要爆了而换成 RCT6 之后不光程序能装下就连调试用的日志缓冲都能开大好几倍这就很舒服。GPIO 数量上RCT6 有 51 个可用 IO去掉电源和晶振引脚依然比 C8T6 多出一截。对于要同时接编码器、霍尔传感器、按键、LED、通信接口的项目来说多出来的引脚意味着不用到处做 IO 复用PCB 布线压力也小一些。价格上两者相差不大所以从设计冗余的角度讲我通常更推荐直接用 RCT6。1.3 最小系统到底包含哪些模块所谓最小系统就是让单片机能够正常工作的最基础电路。具体到 F103RCT6包含这几块供电系统给 MCU 提供稳定的 3.3V 电源包括数字电源 VDD、模拟电源 VDDA以及每个电源引脚旁边的去耦电容。时钟系统外部高速晶振 HSE通常 8MHz配合内部 PLL 倍频到 72MHz如果需要 RTC还要外部低速晶振 LSE32.768kHz。复位电路NRST 引脚的上拉电阻和滤波电容提供上电复位和手动复位功能。启动配置BOOT0、BOOT1 引脚的电平选择决定芯片从 Flash 启动还是从系统存储器启动。下载调试接口SWD 四线接口用于烧录和在线调试。外围辅助比如 VBAT 备用电池供电、串口调试接口。每一块都不复杂但哪一块没处理干净整板子都可能出幺蛾子。下面按原理图设计的顺序挨个讲。2. 原理图设计从电源开始一层层搭2.1 电源架构与去耦策略F103RCT6 的供电引脚很多LQFP64 封装下通常有 3 组 VDD/VSS另外还有 VDDA/VSSA 和 VBAT。常规做法是整个系统从外部 5V 供电板上用一颗 LDO 降到 3.3V。选 LDO 时要注意压差和输出电流AMS1117-3.3 是最常见的压差约 1V最大输出电流 1A优点是便宜、好买、封装大散热好。但如果你的系统输入电压是 12VAMS1117 就不合适了压差太大电流稍微大一点芯片就烫得不能碰这时建议先用 DCDC 降到 5V再走 LDO。我在原理图上对电源部分做了这么几步处理入口处放一颗 10uF 钽电容或固态电容吸收输入电源的瞬态波动。LDO 输出端放一颗 10uF 电容和一颗 100nF 高频电容保证 3.3V 输出稳定。MCU 的每组 VDD 引脚旁边放一颗 100nF 的 MLCC且要尽可能靠近引脚放置。这组电容负责滤除芯片内部数字开关产生的高频噪声。VDDA 引脚通过一颗 10Ω 电阻或小磁珠从 3.3V 上接入再接一颗 1uF 电容到地。这样做相当于把模拟电源和数字电源隔开能显著改善 ADC 采集的稳定性。如果你要做高精度 ADC 采样VDDA 的滤波还可以再加一层 LC 或者有源滤波。不过对大多数应用10Ω 电阻加 1uF 电容已经完全够用。这里有个非常容易踩的坑只接 VDD 不接 VDDA代码烧进去芯片也能跑但 ADC 采出来的数值会惨不忍睹而且容易出现不明原因的复位。所以原理图上一定要把 VDDA 和 VSSA 画全。2.2 时钟电路8MHz 晶振与 32.768kHz 晶振的取舍F103RCT6 内部有 RC 振荡器理论上不接外部晶振也能跑起来但精度很差而且 USB、CAN、高精度定时器这些外设都依赖精确时钟。所以外部晶振几乎是必选的。常用方案是 8MHz 无源晶振接 OSC_IN/OSC_OUT 引脚再配两颗负载电容。晶振的负载电容取值要注意不是随便焊两颗 20pF 就能保证起振稳定。无源晶振的参数里会标一个负载电容值比如 20pF那么两颗电容的串联值再加上引脚寄生电容大约 3~5pF应该等于这个负载电容。也就是说如果你想用负载电容 20pF 的晶振两颗电容各取 33pF 左右比较合适。但实际画板时为了简化很多人直接配 2×22pF也能正常工作起振余量会差一些温度变化时可能出现不起振。我的建议是参考晶振数据手册选其推荐值不要盲目照抄别人原理图。32.768kHz 低速晶振只在需要 RTC 实时时钟时才需要接接在 PC14/OSC32_IN、PC15/OSC32_OUT 引脚上。如果你的项目里不需要掉电保存时间这颗可以省掉PCB 上留个空位即可以后想补再补。要注意低速晶振的负载电容通常也是 6~12.5pF比高速晶振小很多别顺手焊成 20pF否则容易不振。2.3 复位电路与启动配置两个看似简单但很关键的细节NRST 引脚内部有上拉但推荐外接一颗 10kΩ 电阻继续上拉到 3.3V然后并联一颗 100nF 电容到地。这样做的目的是上电瞬间电容充电需要时间NRST 引脚保持一段低电平芯片稳定复位之后电容充完电NRST 被拉高芯片进入正常运行。如果还要做手动复位就在 NRST 和地之间并联一个按键按下时把 NRST 拉低复位。BOOT0 和 BOOT1 的配置同样重要。STM32 的三种启动方式分别是从主 Flash 启动、从系统存储器启动用于串口 ISP 下载、从内置 SRAM 启动。正常运行时必须选择从 Flash 启动所以 BOOT0 要拉低。BOOT1 在从 Flash 启动时无所谓但稳妥起见也拉低。我习惯把 BOOT0、BOOT1 都通过 10kΩ 电阻下拉到地这样上电后稳稳地从 Flash 启动。如果你想让板子支持串口一键下载可以把 BOOT0 引出来做成跳线或按键按下后上电进入 ISP 模式。但有了 SWD 之后串口 ISP 一般用不上了。2.4 SWD 下载调试接口四根线搞定烧录SWD 是 ARM 芯片最方便的调试接口全速下载、硬件断点都支持。原理图上只需要引出四根信号SWDIO对应 PA13、SWCLK对应 PA14、GND、3.3V。如果要用 ST-Link 进行仿真建议把 NRST 也一起引出某些调试器在连接时会主动拉低复位信号让芯片停在复位状态没有 RST 线偶尔会连接失败。还有一点PA13/PA14 默认是 SWD 功能但如果你在程序里把它们配置成普通 GPIO下一次就连不上调试器了。解决办法是按住板子上的复位键在软件点击下载的瞬间松开复位键让芯片短暂地运行在一段没有禁用 SWD 的代码里。这个问题遇到一次就印象深刻。2.5 确定引脚分配把外设预留提前想清楚原理图画到最后要把 MCU 的引脚分配到具体功能上。F103RCT6 引脚资源丰富但设计时必须提前想好哪些引脚给什么用否则画 PCB 时才发现两个功能冲突就麻烦大了。有几个常被占用的特殊引脚要注意PA13/PA14 留给 SWD 调试别拿去接按键或 LED。PA9/PA10 是 USART1很多调试信息都靠它输出建议预留。PB2/BOOT1 引脚在上电瞬间是启动配置引脚程序运行后可以当普通 GPIO 用但上电时序特殊尽量别用在关键的输入检测上。OSC_IN/OSC_OUT 被外部晶振占用的同时PD0/PD1 功能就会失效这是引脚重映射导致的和 PD2 不一样PD2 可以正常当 GPIO 用。我通常会在原理图里加一页“引脚分配表”用文字标注每个引脚的功能比如“PA0-ADC1_IN0 电流采样”“PA8-TIM1_CH1 PWM 输出”“PB6-I2C1_SCL 传感器”。这样画 PCB 时不用反复翻数据手册而且给别人 review 原理图时一目了然。3. PCB 布局布线把高频噪声扼杀在摇篮里3.1 叠层选择与板框规划F103RCT6 的 72MHz 对于 PCB 来说不算高频2 层板完全能应付。所以打样时常规做法就是双面 1.6mm 板厚、1oz 铜厚成本低、工艺成熟。如果你做的项目对电磁兼容性要求比较高或者板子上还有 DCDC、电机驱动这类强干扰源可以考虑 4 层板中间两层分别做完整地平面和电源平面。不过对于初次自研板2 层板先把布局布线搞明白比盲目上 4 层板更有价值。板框尺寸我建议按实际外壳来定尽量紧凑但不要拥挤。我给自己的板子定的尺寸是 40mm×50mmLQFP64 芯片放在中心偏左的位置右侧留出一排排针孔位做 IO 引出。板框边缘要留出安装孔孔径 3.2mm 配 M3 螺丝离板边至少 3mm避免打孔时破板。3.2 LQFP64 的布局原则短、直、近MCU 是整块板子的核心几乎所有信号都从它出发。布局第一原则是晶振离 MCU 的 OSC_IN/OSC_OUT 引脚越近越好走线越短越好。8MHz 晶振通常放在芯片下方靠近对应引脚的位置两颗负载电容对称放置且要先经过电容再到 MCU 引脚。复位电路的电阻电容放在 NRST 引脚附近按键放在板边方便按压。去耦电容的位置是新手最容易忽略的。每颗 100nF 电容必须紧贴对应的 VDD/VSS 引脚放置中间不要穿过过孔最好在同一层直接连接。因为去耦电容的作用就是给引脚提供一个极低阻抗的电流回路如果引线太长回路电感增大高频噪声根本滤不掉。10uF 的储能电容可以放得稍微远一点但也要保证在芯片的供电走线上。我画 LQFP64 这类高密度芯片的实物经验是先把芯片封装放好然后把所有去耦电容拖到芯片四周逐个检查每个 VDD/VSS 引脚旁边有没有对应电容确认后再开始布线。否则画到一半再补电容位置基本都在板子边缘或隔着好几条走线效果大打折扣。3.3 电源走线与地平面处理电源走线的宽度要按电流大小来定。整板 3.3V 电流一般不超过 300mA主干线走 40mil 就够了5V 输入如果有电机或大负载主供电走线建议走到 60mil 以上甚至覆铜。注意铝基板或普通 FR-4 板的铜箔厚度是固定的1oz 铜厚条件下 1mm 走线大约能过 1A 电流但不建议卡着极限用按 50%~70% 的降额比较稳妥。地平面是 2 层板里最讲究的部分。我的习惯是底层尽量整片铺铜接地除了必要的信号走线不让铜被割得支离破碎。顶层分散的地过孔要尽量多打把顶层电路的地和底层大地平面连接起来缩短回流路径。特别注意晶振下面、MCU 底部这些位置过孔加密打能让信号回路更干净。模拟地和数字地的问题很多资料说要把 AGND 和 DGND 分开再用 0Ω 电阻或磁珠单点连接。但在 2 层板上这么做很容易把地平面割裂反而引出更多问题。我的建议是小信号电路直接共地通过合理的布局布线来保证模拟部分远离噪声源如果 ADC 采样精度要求确实高再把 VDDA 的滤波做好地不需要单独分离。3.4 信号走线规则与过孔选择F103RCT6 引脚间距是 0.5mm这决定了从引脚扇出走线的线宽极限。一般引脚之间出线用 8mil~10mil 线宽间距 8mil板厂完全能加工。时钟线、复位线这类敏感信号尽量走粗一点比如 10~12mil并保证两侧有地包围。普通 GPIO 信号线不必加粗但尽量保持 45° 出线减少直角的阻抗突变。过孔方面信号过孔用外径 0.6mm、内径 0.3mm 是通用选择成本低、可靠性好。电源过孔可以多打几个并联比如从顶层 3.3V 区域到底层地平面附近打 4~6 个过孔有效降低过孔电阻和电感。不要用过大的过孔去走细信号线过孔焊盘太大会吃掉太多布线空间。3.5 布线顺序先电源后信号PCB 布线的顺序我总结了一套比较顺手的流程先把所有元件摆放到位然后布电源网络和地网络接着布晶振周围的敏感信号最后再布普通 GPIO 信号。先布电源的原因是电源网络往往要承载较大电流走线比较粗如果最后再布空间已经被细信号线占满会很痛苦。具体到这块板子我会先布 5V 输入、3.3V 输出、VDDA 网络把这些粗线走好并补上足够的过孔到地。然后布晶振的两根线和复位线确保它们短而直旁边尽量用接地走线包一圈。最后把剩下 20 多根 GPIO 信号从芯片引脚扇出按功能分组布线。理想状态下底层整片铺铜作为地平面顶层少量信号走线芯片周围除了去耦电容和晶振再没有多余的元件。4. 打样、焊接与调试全流程实操4.1 从 PCB 到 Gerber 文件的最后检查布局布线完成后先做 DRC设计规则检查重点确认有没有短路、开路、间距不足、未连接引脚这类错误。在输出 Gerber 之前我还习惯做三件事把 PCB 的丝印整理一遍标注板名、版本号、日期和电源电压检查所有螺丝孔是否连接到地或者做成孤立焊盘确认板框层只有一个闭合的轮廓不要有多余的线段。Gerber 文件用嘉立创打样时直接在 EDA 软件里导出压缩成 zip 上传即可。下单时注意几个工艺选项板厚 1.6mm铜厚 1oz表面工艺选喷锡就行没必要沉金如果需要机器贴片可以加做钢网但手工焊接就算不加。交期一般 3~5 天几十块钱五片比自己在家里腐蚀板子不知道省心多少。4.2 LQFP64 手工焊接的实战经验LQFP64 引脚间距 0.5mm、共 64 个引脚第一次拿烙铁焊确实有点慌但掌握方法后其实很简单。我的焊法是先在焊盘上均匀上一层薄锡涂一层助焊剂把芯片对准丝印框目测引脚对齐后用烙铁固定对角的两根引脚然后从一侧开始拖焊烙铁头带少量锡顺着引脚往外拖让锡自然流入引脚和焊盘之间最后用助焊剂清洗液洗板检查有没有桥连。如果某几根引脚桥连了不要一直用烙铁去拉那样越拉越糟。正确的做法是涂一点助焊剂用烙铁头在桥连处轻轻一抹多余焊锡会被助焊剂张力和烙铁头带走。或者用吸锡带铺在引脚上烙铁加热吸掉多余锡。焊完之后用万用表蜂鸣档检查相邻引脚有没有短路重点检查电源引脚和地引脚。热风枪焊接也是一个方案但新手的失败率更高。风枪温度我一般设 350℃风速调到最低先预热整板五六秒然后对着芯片快速画圈加热。看到锡熔化、芯片有轻微下沉感时立即移开风枪这个过程要在几秒内完成不然旁边的塑料接插件就变形了。相比之下我更推荐拖焊操作直观、容易检查。4.3 上电前的测试与首个程序验证焊完板子先别急着插电脑用万用表量一下 3.3V 和 GND 之间的电阻正常情况应该有几 kΩ 以上如果几乎为零说明电源短路了。短路的常见位置是 LDO 焊反、电容极性焊错、芯片引脚桥连。确认没有短路后再上电摸一下 LDO 和 MCU 的温度温度略微升高正常烫手就得赶紧断电。上电后用万用表量 VBAT、VDD、VDDA 电压是否为 3.3VNRST 是否为高电平。都正常后接 ST-Link打开 STM32CubeProgrammer 或 Keil 尝试连接目标芯片。第一次用 CubeMX 生成一个最简单的 GPIO 翻转项目PA1 配置为输出循环拉高拉低让 LED 闪烁。如果下载成功且 LED 亮灭正常说明最小系统从电源到时钟到复位到下载链路全部打通。注意一個细节程序里如果配置了外部时钟 HSE而不是内部时钟 HSI且晶振没焊好或焊错下载后程序会卡在时钟初始化里表现为芯片“假死”没任何输出。这时候用示波器测量 OSC_OUT 引脚应该能看到正弦波。看不到就检查晶振和负载电容的焊点或者检查 HSE 的两个引脚是否接反了。5. 实战中的坑问题排查速查表5.1 SWD 连不上芯片该怎么一步步查这是所有新手遇到的第一个大坑。现象很统一Keil 提示“Cannot connect to target”CubeProgrammer 报“No STM32 target found”。排查顺序我理成这样检查项具体操作常见原因供电量 VDD 是否为 3.3VVDDA 是否有电LDO 没输出、电容短路复位量 NRST 电压是否接近 3.3V复位电容短路、按键常闭启动量 BOOT0 电压是否为低电平BOOT0 没拉低外接跳线接错接线检查 SWDIO、SWCLK 是否接对是否交叉经常有人把两根线接反引脚占用按住复位键点击下载瞬间松开PA13/PA14 被程序配置为 GPIO芯片损坏摸芯片温度量 VDD-GND 阻抗焊接温度过高或供电接反排查时不要一次性怀疑芯片坏了实际上绝大多数 SWD 连不上都是供电或启动配置问题。我遇到最多的情况是 BOOT0 没有拉低芯片一上电就进了 ISP 模式ST-Link 当然找不到调试端口。另一个是 5V 和 3.3V 接反烧了 LDO板子彻底没电这时候看什么都是废的。5.2 晶振不起振现象、原因与判断方法晶振不起振是个很经典的问题。现象包括程序下载后不运行、定时器时间不对、UART 输出的波特率错误。判断方法最简单用示波器或逻辑分析仪测量 OSC_OUT 引脚正常运行时应看到 8MHz 左右的正弦波如果完全没有波形或幅度非常微小基本就是晶振电路的问题。常见原因大概有四种负载电容配错了比如用了 20pF 电容去配 6pF 负载的晶振起振困难晶振虚焊或引脚氧化PCB 走线太长寄生电容影响了振荡条件晶振买了有源型号却按无源方式接引脚完全接错。解决方法是先确认晶振型号和电路匹配然后补焊最后才考虑换晶振。不要一上来就怀疑 MCU 坏了晶振电路问题是独立于 MCU 本身的。另外要注意OSC_IN 和 OSC_OUT 两根线不要在 PCB 上绕太远更不要并行拉长距离这会导致信号串扰和振荡不稳定。布局时我已经强调过晶振要贴着 MCU两根走线尽量短粗周围用接地铜皮围起来效果会好很多。5.3 芯片发热或不稳定别忽略 VBAT 和 VDDA有时候程序能下载、灯也能闪但芯片体温不正常或者运行几分钟之后死机。这时候我建议先量 VDDA 和 VBAT。VBAT 是 RTC 和备份寄存器的供电引脚很多设计图上 VBAT 直接接 3.3V 就可以但如果你在 PCB 上把它悬空了某些芯片内部会导致备份域上电不稳定进而影响整个芯片的复位逻辑。稳妥起见VBAT 接一个 100nF 去耦电容到地再接到 3.3V 电源。VDDA 的问题更隐蔽。如果你画原理图时没有画 VDDA或者 VDDA 和 VDD 之间没有做滤波ADC 采样会非常飘。更严重的是某些型号对 VDDA 和 VDD 之间的上电时序有要求手册里建议 VDDA 比 VDD 先上电或同时上电。如果你用 10Ω 电阻把 VDDA 接到 VDD那么 VDD 上升时会通过电阻给 VDDA 充电两者基本同步问题不大。但如果 VDDA 走线很长、滤波电容不够容易导致上电瞬间 VDDA 电压抖动进而引发芯片内部复位混乱。5.4 让 ADC 更稳的几个小手段F103RCT6 的 ADC 是 12 位理论上能满足大多数采集需求但实测精度很大程度上取决于硬件设计。除了前面说的 VDDA 滤波我在实际调试中还发现几个明显影响 ADC 稳定度的细节采样时间不要设得太短ADC 时钟不要冲到最高的 14MHz对高阻抗信号源建议在 ADC 引脚前加一个 100nF 左右的电容到地构成一个简单的低通滤波。如果板子上有 PWM 电机驱动这类强干扰源ADC 布线时要注意让模拟信号线远离 PWM 输出线和功率地回路。我见过一块板子只要电机一转ADC 采集值就飘得离谱后来把采样信号线绕开电机驱动区又给 VDDA 加了磁珠情况立刻改善。最小系统虽然简单但它是一切外设的地基地基不稳上层建筑再花哨也没用。写在最后掌握核心设计比抄板子重要画 STM32F103RCT6 最小系统这件事本质上是在培养一种“硬件全局观”。从一颗芯片的电源怎么喂、时钟怎么起到地平面怎么铺、引脚怎么分配每一个决定都会在之后的调试中反馈给你。我现在画这种板子从原理图到 PCB 大概一个下午能完成焊好板子到跑通程序也只要半小时但第一次做的时候花了整整一个周末焊坏了两块板子反复查资料才把 SWD 连上。这里我想给后来者一个建议画最小系统的时候不要只照着参考设计的网表抄把每个电阻电容为什么要放在那里为什么是那个阻值都自己推导一遍。比如复位电阻为什么是 10kΩ而不是 100Ω去耦电容为什么是 100nF 而不是 1uF晶振负载电容怎么计算。这些基础知识会在你遇到更复杂电路时派上大用场。等这块最小系统板稳定运行起来之后你就会发现自己动手做硬件这件事其实没有想象中那么难而且非常上瘾。