做嵌入式开发这么多年我一直觉得亲手画一块最小系统板是吃透一颗单片机最有效的方式。这次就完整记录一下我用STM32F103RCT6设计最小系统板的全过程从最初的需求分析、原理图绘制到PCB布局布线再到打样焊接和上电调试每一步都会讲到。STM32F103RCT6是ST的中端主力型号Cortex-M3内核主频最高72MHz256KB Flash48KB SRAM采用LQFP64封装。相比大家更熟悉的C8T6它的Flash翻了好几倍引脚也更多能做不少复杂的事情比如带编码器做电机FOC、同时跑多个串口、做简易USB设备等。如果你正在学STM32或者想给自己做一块能长期用的下载调试板自己画一块RCT6最小系统板性价比非常高。这篇文章适合刚入门、想动手画第一块板子的同学也适合已经做了几块板、却老被“下载失败”、“跑不起来”折磨的朋友。我会把原理图里每个电阻电容为什么这么接、PCB上哪些走线必须注意、调试时踩过的坑全部整理出来尽量让看完的人能一次做成功。1. 项目概述与整体设计思路1.1 为什么选STM32F103RCT6而不是C8T6或ZET6先聊选型。STM32F103系列大家都很熟但具体型号之间的差异还是要搞清楚。C8T6只有64KB Flash和20KB SRAM跑个小灯、串口、简单传感器没问题一旦要上RTOS、做电机FOC控制或者用文件系统存点数据Flash和内存就不够用了。RCT6的Flash是256KBSRAM是48KB在LQFP64封装里算是顶配。相比RBT6的128KB FlashRCT6多了一倍Flash价格却只贵几块钱。相比ZET6的LQFP100RCT6引脚虽然少了但大多数项目用不到那么多IO64脚已经足够而且布线、焊接难度都低了不少。我这次选RCT6主要是三个考虑一是有足够的Flash跑RTOS和中间件二是LQFP64封装在2层板上就能轻松布通三是这个型号的货源和价格都稳定不管以后做产品原型还是搞学习板都不用担心断货问题。如果你只是入门练手C8T6也够用但既然自己画板一步到位上RCT6更省心。1.2 最小系统板到底包含哪些部分很多新手会问最小系统板到底“最小”到什么程度严格说只要能让芯片正常跑起来、并能下载程序就是最小系统。我理解的最小系统板必须包含下面五个部分电源电路提供稳定的3.3V并在每个电源引脚附近放置去耦电容。时钟电路外部8MHz晶振和负载电容提供准确的高速时钟。内部HSI虽然能跑但精度差串口波特率容易飘。复位电路NRST引脚接上拉电阻和复位电容实现稳定的上电复位和手动复位。启动模式配置BOOT0引脚电平决定从Flash还是SRAM启动设计时把BOOT0下拉到地强制从主Flash启动。下载调试电路SWD接口只用SWDIO、SWCLK、GND和3.3V四根线就能完成烧录和在线调试。除了这些我还会加上电源指示灯、用户LED和按键把全部IO用排针引出来。这样板子做好后可以直接用来做各种实验不用再外接一堆飞线。1.3 方案取舍LDO还是DC-DC、晶振、调试接口设计开始前有几个方案需要定下来每个选择都会影响后面的调试体验。电源部分最小系统板功耗很低用LDO就足够了。我选了AMS1117-3.3便宜、到处能买到从USB的5V降到3.3V压差1.7V输出电流800mA左右对最小系统板绰绰有余。如果做电机驱动板动力部分需要单独用DC-DC但数字逻辑部分还是推荐LDO纹波小调试时能少很多莫名其妙的问题。时钟部分STM32内部有HSI8MHz和LSI约40kHz理论上不接外部晶振也能跑。但HSI精度不高温度变化时误差更大一用到串口通信波特率就对不上。所以外部HSE晶振是必须的我用最常见的8MHz无源晶振配两个20pF负载电容。调试接口部分现在主流是ST-Link、J-Link和DAP-Link都支持SWD模式。SWD只需要两根数据线PA13/SWDIO、PA14/SWCLK比JTAG省IO、省空间。我的做法是把SWD和串口都留在板子边缘调试器接SWD数据观察接串口两边不冲突。2. 原理图设计每个元器件都有存在的理由2.1 电源电路的设计与电容选型电源电路是整块板子的命脉。STM32F103RCT6有多个VDD引脚每个VDD附近都要放一颗100nF去耦电容这一点不能省。很多板子偶尔死机、ADC数据跳变往往就是因为某颗去耦电容离VDD太远。我画原理图时电源部分这样安排输入5V经过AMS1117-3.3输入端放一颗10uF钽电容和一颗100nF陶瓷电容输出端放一颗10uF钽电容和一颗100nF陶瓷电容保证电源稳定。3.3V输出分成多路分别接到芯片各个VDD引脚每个VDD就近放100nF芯片附近再放一颗4.7uF做整体储能。VBAT引脚如果需要RTC备用电池功能接3.3V或纽扣电池不需要就统一接3.3V。再说电容选型。陶瓷电容选X7R或X5R材质耐压16V或25V就够。不要用Y5V温度特性太差容量会随温度明显缩水。钽电容注意耐压5V输入的位置用10uF/10V或16V都行钽电容极性反接会烧焊接时一定看清丝印方向。还有一点要提醒AMS1117这类LDO对输出电容有要求输出端最好有10uF以上电容否则在负载突变时可能振荡。实测下来输出端放10uF钽电容后3.3V纹波非常干净芯片运行稳定性明显提升。2.2 HSE时钟电路8MHz晶振与负载电容计算时钟电路是整块板最容易被忽视、又最容易翻车的部分。STM32F103用外部HSE作为系统主时钟来源晶振不起振或频率不准程序根本不执行或者串口乱码。8MHz无源晶振需要两个负载电容典型值18pF到22pF我一般直接选20pF。负载电容的计算公式是CL (C1 × C2) / (C1 C2) CparasiticCparasitic是PCB走线和引脚寄生电容通常取2到5pF。两颗电容都用20pF算上约4pF寄生电容等效负载大约14pF正好匹配大多数8MHz晶振的标称负载电容。原理图上晶振接在OSC_INPD0和OSC_OUTPD1两个引脚上两个负载电容分别从晶振两端下拉到地。这里有个关键经验晶振正下方不要走任何信号线周围铺一圈地能明显减少噪声干扰。注意晶振两条走线不要平行拉太长负载电容要就近接地晶振正下方尽量不要布置其他信号线。如果要做RTC功能还需要32.768kHz晶振接在PC14和PC15上同样配两个负载电容通常选6pF到12.5pF具体按晶振规格来。不用RTC的话这两个引脚可以当普通IO用。我这块板子做了RTC功能因为不少项目需要时间戳。2.3 复位电路与启动模式配置复位电路看起来简单但设计不好会出现“上电时程序不稳定”的毛病。NRST引脚内部虽然已有上拉电阻外部依然要处理。我的设计是NRST引脚接10K电阻上拉到3.3V再接100nF电容下拉到地同时并联一个按键到GND。上电瞬间电容充电NRST保持一段低电平充满后变高电平芯片退出复位实现稳定上电复位。按键按下拉低NRST实现手动复位。启动模式是新手容易忽略的点。STM32的BOOT0和BOOT1决定复位后从哪启动组合方式如下BOOT0BOOT1启动区域0x主Flash正常运行10系统存储器串口ISP下载11SRAM调试用最常用的就是从主Flash启动所以BOOT0通过10K电阻下拉到地BOOT1虽然正常启动时不参与我也同样下拉到地避免悬空。很多方案说BOOT1可以不接但从严谨角度所有输入引脚都应有确定电平全部下拉更稳妥。2.4 SWD下载调试接口与其他必要外设下载调试接口是每天都要用的设计时必须放在好插拔的位置。SWD只需要四根线3.3V、SWDIOPA13、SWCLKPA14、GND。我建议做成2.54mm间距的4Pin排针排成一列顺序是3V3-SWDIO-SWCLK-GND用杜邦线或直接插ST-Link转接头都方便。需要特别提醒的是SWDIO和SWCLK复用为PA13和PA14。如果你把这两个引脚当普通IO用就没法用SWD下载了。有些项目把这两个脚接去控制别的东西结果芯片“变砖”其实只是SWD被占用。除了核心下载调试我还在板子上加了几个“标配外设”电源指示灯LED串联1K电阻接到3.3V判断供电是否正常。用户LED接PC13串联330欧姆限流电阻接地用来跑第一个点灯程序。用户按键接PA0另一端接GND内部上拉时按下为低电平用于中断实验。排针引出除电源和地外把剩余IO尽量引到两排2.54mm排针上方便后续扩展。LED限流电阻取值也有讲究。STM32的GPIO输出高电平为3.3V普通红色LED压降约1.8V到2.0V按1mA到5mA电流计算电阻取330欧姆到1K欧姆都行。我板子上两颗LED一颗用1K更省电一颗用330让灯更亮测试不同状态刚刚好。3. PCB布局布线与打样焊接3.1 布局思路让每一颗电容都待在应该待的地方原理图画完接下来是PCB布局。我用的工具是立创EDA免费元件库封装库很全画完原理图直接导入PCB剩下的就是考验耐心的布局环节。布局第一原则以MCU为中心按功能模块分区。我把STM32F103RCT6放在板子正中间四边留走线空间晶振紧挨OSC_IN和OSC_OUT引脚去耦电容单独排成一行每颗都放在对应VDD引脚旁边。电源输入和LDO放板子边缘一角让电源从板边进入后快速分布到各个VDD。具体布局几步说清楚把MCU固定到板子中心标注1脚和丝印方向。在MCU四周摆所有100nF去耦电容一个VDD对应一颗电容地端尽量靠近MCU的地引脚。晶振放OSC_IN和OSC_OUT中间两颗负载电容放晶振两端尽量短走线。LDO放板子一角输入输出电容围绕LDO摆注意输入输出顺序别反。排针围在板子四边引出IO。LED、按键放板边好按好看。我第一次画板犯过最蠢的错误就是把去耦电容放在“看起来整齐”的位置结果走线绕了很远实际效果大打折扣。后来我都是“电容贴在引脚旁地脚对准VDD”这条经验放在任何板子设计里都通用。3.2 布线要点晶振走线、地平面与电源线宽布局完成进入布线。对STM32F103RCT6最小系统板2层板完全够用但有几条布线要求必须遵守。电源线要粗。3.3V网络我习惯用20mil到30mil地线同样宽甚至更粗。AMS1117输入端的5V线也用20mil以上。电源线太细电阻大会引起压降芯片切换负载时电压跌落可能导致复位重启。地线处理上2层板我习惯顶层走信号线底层铺一整片地铜网络设为GND。这样每颗去耦电容的地端都能就近打过孔到底层地平面回流路径最短EMI好。如果空间允许顶层空余区域也铺地铜再打一排过孔连接上下地层相当于“跨层网格地”。晶振走线是重点照顾对象。晶振到MCU的OSC_IN/OSC_OUT尽量短不要走直角走45度或圆弧。晶振正下方底层不要走任何其它信号线。两颗负载电容的接地端共用一小块铜皮再打过孔到地平面减小地回路面积。SWD的SWDIO和SWCLK不需要特别处理但也不要拉太长3cm以内都可以。复位信号线同样走短。LED、按键这些低速信号没太多讲究保持合理间距就行。工艺参数上我习惯设最小线宽10mil最小过孔外径24mil、内径12mil这在立创免费打样工艺限制内完全可制造。4层板当然更好但2层板做这种小板已经足够还能省打样费用。3.3 打样、焊接与焊后检查PCB设计完成后导出Gerber上传打样平台。我用的是嘉立创免费打样5cm×5cm以内都免费RCT6最小系统板尺寸小完全在范围内。我设计的板子是5cm×4cm四角加3mm螺丝孔方便固定。打样回来就是焊接。LQFP64引脚密建议用拖焊法。先在焊盘上均匀涂助焊剂芯片对准放正用烙铁固定对角两个引脚然后沿引脚方向拖锡。锡会顺着助焊剂均匀铺在引脚上如果连锡也别慌用吸锡带把多余锡吸掉。焊接顺序上我习惯先焊电源部分再焊晶振电路接着焊MCU最后焊排针、LED和按键。这样先不装MCU就能上电测3.3V对不对如果电源有问题不会波及芯片。焊完别急着上电先用万用表检查几个关键点3.3V和GND之间是否短路阻值是否异常接近0说明有连锡或电容反接。每个VDD引脚到地电容是否正常。晶振两脚之间是否短路。SWD的3.3V和GND是否正常。每次焊完我都会用放大镜过一遍所有引脚重点看LQFP64相邻引脚之间有没有锡桥。这一步成本很低但能省下大量排查时间。4. 上电调试与常见问题排查4.1 上电前检查与最小系统验证焊接完成、静态电阻检查通过后就可以上电了。但“上电”不是直接插USB线而是逐步推进。我的做法是先用稳压电源设定5V、限流100mA接到板子VIN和GND。如果电流接近0至少说明电源输入端没有明显短路。然后看板上电源指示灯亮不亮再量3.3V输出是否在3.3V±0.1V范围内。确认正常后关电源再正常插USB供电。第一次上电后别急着下载先做最小系统验证。按一下复位键再松开用万用表量NRST正常应该能看到一个上升沿。再用示波器量OSC_OUT能看到8MHz时钟波形幅度大约1V到3.3V之间。没示波器的话直接接ST-Link尝试软件连接芯片能识别IDCODE说明芯片已经在工作状态。这是最常用的验证手段。4.2 Keil工程配置与下载调试接下来配置下载调试环境。我用Keil MDK调试器是ST-Link V2便宜稳定。第一次使用要配置以下内容Options for Target中Debug选项卡选择ST-Link Debugger。点击Settings确认能识别SWDIO和SWCLK的IDCODE器件型号正常。Utilities选项卡同样选择ST-LinkFlash Download设为Erase Full Chip加Program下载前擦除整块Flash。芯片型号选STM32F103RCT6。使用标准外设库时宏定义要设成STM32F10X_HD因为RCT6属于高密度产品。关于固件库这里多说一句。STM32F103按Flash容量分为低密度、中密度、高密度RCT6有256KB Flash属于高密度宏定义必须用STM32F10X_HD否则很多外设驱动编译不过或者运行异常。HAL库的话型号选对、时钟配置对就行。下载完成后先跑最简单的点灯程序。第一个程序通常是初始化PC13为推挽输出主循环翻转电平让LED一亮一灭。如果LED正常闪烁就说明电源、时钟、复位、Flash启动、SWD下载全部正常整块板子基本算调试通过了。调试时想看结构体变量、数组内容Keil的Debug模式可以直接看。打开View菜单里的Watch窗口把变量加进去如果没自动更新点击View Periodic Window Update开启周期性刷新就能实时看到变量变化。这个功能新手经常忽略其实非常好用。4.3 常见问题速查表与经验总结实际调试中我积累了一些高频问题的排查经验整理成速查表方便对照现象可能原因排查方法上电后电源指示灯不亮电源接反、AMS1117损坏、输入输出引脚焊错先量VIN电压再量LDO输出3.3V对地短路MCU引脚连锡、电容焊反、钽电容极性接反断电用万用表蜂鸣档量3.3V到GND阻值晶振不起振负载电容错、晶振焊歪、晶振质量差示波器看OSC_OUT或用HSI启动测串口SWD下载报No Target connectedSWDIO/SWCLK接错、目标板没供电、PA13/PA14被占用核对四根线确认3.3V按住复位键再点下载Flash Download failedKeil里Flash容量配置错、芯片型号选错确认型号是F103RCT6Flash大小256KB程序跑飞或不稳定去耦电容缺失、电源纹波大、复位电路没做好检查每个VDD的100nF电容换稳定电源串口乱码主时钟频率不对、波特率不匹配、用了HSI确认晶振是8MHz检查系统时钟配置为72MHz这些坑我基本都踩过最常见的就是SWD下载报No Target connected。我后来总结出一个几乎百试百灵的办法在Keil里点下载按钮的同时用手指按住板子复位键不放等进入下载过程再松开。原因是目标芯片可能在复位或Flash擦除期间没正常响应复位释放瞬间SWD能强制接管。提示SWD连不上时先试试按住复位键再点下载这是我屡试不爽的招。再说一个调试技巧。如果程序写坏了时钟配置芯片进不了main函数SWD很难连上。这时候把BOOT0跳线设到高电平让芯片从系统存储器启动此时SWD依然能连接芯片再重新擦除、下载正确程序就能把“砖头”救回来。串口调试方面我一直用SSCOM这类串口助手。注意串口助手的波特率要和程序配置一致另外如果程序用了HSI而不是HSE串口波特率可能有2%到5%误差表现为大部分时间正常、偶尔乱码。排查时先确认系统时钟来源。调试最后我习惯做一轮老化测试让板子连续跑LED闪烁程序24小时不断电。如果24小时内没死机、没乱码这块板子基本可以信任了。办法虽然土但确实能暴露不少偶发问题。最后再分享一点个人体会。自己画最小系统板真正的收获不在于那块板子本身而在于整个流程走完后你对芯片的认识完全不一样了。原理图上每一条线、每一颗电容你都清楚来龙去脉后面再做带电机驱动、传感器采集的复杂板子心里特别有底。如果你准备动手我的建议是第一块板子别追求一次到位先按最基本的五大部分画一个能跑起来的板子调试通过之后再考虑加USB转串口、SD卡座、CAN收发器这些功能。一步步来踩坑也是积累。我目前这块RCT6最小系统板已经用了大半年跑过裸机程序、FreeRTOS还有带编码器的电机FOC控制表现都挺稳定。下次我计划基于它做一个带CAN总线的评估板到时候再来分享新的调试心得。