画这块 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 是 256KB,SRAM 是 48KB,而 C8T6 只有 64KB Flash、20KB SRAM。这个差距在裸机开发时可能感觉不明显,一旦上 RTOS、跑 FOC 算法、存多组标定表,C8T6 就非常紧张。我见过一个做无刷电机驱动的兄弟,代码编译后接近 60KB,C8T6 眼看就要爆了,而换成 RCT6 之后不光程序能装下,就连调试用的日志缓冲都能开大好几倍,这就很舒服。
GPIO 数量上,RCT6 有 51 个可用 IO,去掉电源和晶振引脚,依然比 C8T6 多出一截。对于要同时接编码器、霍尔传感器、按键、LED、通信接口的项目来说,多出来的引脚意味着不用到处做 IO 复用,PCB 布线压力也小一些。价格上两者相差不大,所以从设计冗余的角度讲,我通常更推荐直接用 RCT6。
1.3 最小系统到底包含哪些模块
所谓最小系统,就是让单片机能够正常工作的最基础电路。具体到 F103RCT6,包含这几块:
- 供电系统:给 MCU 提供稳定的 3.3V 电源,包括数字电源 VDD、模拟电源 VDDA,以及每个电源引脚旁边的去耦电容。
- 时钟系统:外部高速晶振 HSE(通常 8MHz)配合内部 PLL 倍频到 72MHz;如果需要 RTC,还要外部低速晶振 LSE(32.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,优点是便宜、好买、封装大散热好。但如果你的系统输入电压是 12V,AMS1117 就不合适了,压差太大,电流稍微大一点芯片就烫得不能碰,这时建议先用 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×50mm,LQFP64 芯片放在中心偏左的位置,右侧留出一排排针孔位做 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.3V,NRST 是否为高电平。都正常后接 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.3V,VDDA 是否有电 | 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,晶振负载电容怎么计算。这些基础知识会在你遇到更复杂电路时派上大用场。等这块最小系统板稳定运行起来之后,你就会发现,自己动手做硬件这件事,其实没有想象中那么难,而且非常上瘾。