ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32最小系统板设计全攻略:从原理图到硬件调试

STM32最小系统板设计全攻略:从原理图到硬件调试 三年前我拿到第一块STM32最小系统板时对着密密麻麻的排针发愁。后来自己动手画STM32F103RCT6核心板从原理图到焊接调试才发现所谓“最小系统”其实就四件事电源、时钟、复位、下载。这篇就把这四件事从头拆到尾顺便把踩过的坑写清楚。适合刚学会画板、想自己打板验证一块可用STM32核心板的朋友也适合那些外购核心板出问题不知道怎么查的人。我尽量把每个元件的选型和参数都讲出理由让大家看完不光能抄作业还能自己判断哪里可以改、哪里不能省。1. 项目概述为什么自己画最小系统板1.1 从C8T6到RCT6我为什么选F103RCT6很多人入门用的是C8T6这颗芯片在淘宝上被各种开发板用得非常夸张资料多、例程多但它的Flash只有64KBSRAM只有20KB。裸机写点LED、串口、传感器确实够用可如果你想跑一个稍复杂的协议栈、上一版简单的RTOS、或者做无刷电机的FOC驱动64KB的Flash会让你非常痛苦。我这次选RCT6同样是LQFP64封装几乎可以pin-to-pin替换C8T6Flash却到了256KBSRAM到了48KB价格差距又不大等于花一样的功夫画板换回来四倍的资源余量。从我实际用下来的感受说RCT6在资源上刚好卡在一个“从容”的位置。48KB SRAM跑FreeRTOS加几个任务绰绰有余256KB Flash也能塞下完整的DSP库或者一些带FatFS的工程。以后想做带编码器反馈的电机控制或者稍微复杂一点的PID运算也都不用再换板子。所以我一直建议第一次画STM32F103的核心板直接选RCT6别在C8T6上省那几块钱。1.2 外购核心板和自己画的差别在哪外购核心板确实方便今天下单明天到焊上排针就能用。但用久了你会发现两个问题第一很多便宜的板子原理图不公开你想改一个引脚映射、想加一个外部中断或者想复用某个定时器完全得靠猜有的甚至丝印和实际引脚对不上调试的时候非常折磨人。第二外购板排针的间距、位置、朝向是固定的放到你自己的项目壳子里往往不匹配最后只能靠飞线硬接板子一颠簸就接触不良。自己画板就不一样了整个布局你自己说了算。这次我做板子的目标很明确所有IO用标准2.54mm排针引出方便跳线验证外设板子尺寸控制在常见实验板大小方便固定在亚克力底座上调试接口用SWD四线加NRST和SWO省得每次插拔杜邦线。这些看起来都是小事但只有在自己的设计里才能完全掌控。1.3 我这次的目标和约束整个项目我给自己定了三条约束第一只用双层板嘉立创打样几十块钱速度快没必要上四层第二元件选型以手焊友好为原则IC用LQFP64引脚间距0.5mm可以风枪吹焊电阻电容用0603排针用2.54mm直插方便万能板对接第三所有不影响核心功能的电路都尽量精简比如不用micro USB插座直接用排针供5V反正调试时用ST-Link供电也行。实际执行下来从画原理图到PCB再到焊接调试两天时间足够。这个时间在新手手里可能还要翻倍但不要急因为这类板子一旦跑通后面复用率极高。我后来很多项目都是在这块板子上验证完MCU部分再画最终集成板的。2. 原理图设计把每一根引脚都安排明白2.1 最小系统到底包含哪些电路所谓最小系统不是“芯片加两个引脚就能跑”而是指让芯片稳定运行所需的最少外部电路。对STM32F103RCT6来说这个集合比你想象的还要小一组可靠的电源、一个外部晶振或者你接受用内部RC、一个复位电路、一组启动模式配置、一个能下载程序的调试接口。就这么点东西。除了这些“刚需”我在原理图里还额外加了三个东西电源指示灯、一个用户LED、USART1串口引出。它们都不属于最小系统的必要条件但调试的时候能省很多事。电源指示灯告诉你板子有没有上电用户LED让你不用接任何外设就能验证程序在跑串口引出让你可以直接看log。我的原则是核心电路一个不多、一个不少调试电路按需添加但画板时给它们留好位置。2.2 电源电路不只是接个LDO那么简单RCT6的工作电压范围是2.0到3.6V典型值是3.3V所以我从外部5V取电用一个LDO降到3.3V。很多人的第一个疑问是为什么不用DC-DC答案是没必要。DC-DC效率高但纹波大、外围复杂对于数字核心板这样电流不大又对噪声敏感的场合线性稳压器是更稳的选择。我这次用的是AMS1117-3.3虽然它算老古董了但胜在便宜、封装多、输出纹波小、资料满天飞。具体电路是5V输入先接一个10uF钽电容和0.1uF陶瓷电容到地LDO输出侧同样接10uF和0.1uF。这里有个关键点输出侧的10uF电容建议用钽电容或固态电容不要用便宜的电解电容因为电解电容高频特性差ESR偏大对数字芯片供电不利。陶瓷电容的介质也很讲究至少要X5R或者X7R别用Y5VY5V容量在电压和温度变化下会剧烈衰减我曾经因为贪便宜买了整盘Y5V电容装上后3.3V纹波大得一批换掉就好了。LDO输入输出压差也要算一下。AMS1117的Dropout压差典型值约1.1V输入5V输出3.3V压差1.7V在工作范围内。如果输入4.2V锂电池电压压差只有0.9V这时AMS1117实际上工作在临界状态输出可能掉到3.2V以下这就需要换一颗低压差的LDO比如XC6206或ME6211。所以选LDO前先看输入电压范围别只管输出电压。然后是芯片本身的电源引脚。RCT6有多个VDD和VSS还有VDDA和VSSA这些引脚必须全部正确连接不能悬空。VDDA是模拟电源最好通过一个磁珠或小电感再接3.3VVSSA直接和地相连。我的习惯是VDDA先接0.1uF电容到地再通过磁珠连接到3.3V网络这样ADC采集时的噪声会小很多。去耦电容是最容易被忽略但影响最大的部分。STM32F103RCT6的每个VDD引脚旁边都要放一个0.1uF陶瓷电容位置尽可能靠近引脚。原理是这样的芯片内部数字电路翻转时会瞬间抽取电流这个电流的频率可能达到几十MHz到上百MHz远处的10uF电容来不及响应只有紧贴芯片引脚的0.1uF电容能在高频下提供稳定电压。如果去耦电容离得太远走线电感会抵消电容的作用板子运行时会出现莫名其妙的复位或ADC跳码。这是我自己踩过大坑的地方。最后是VCAP引脚。RCT6内部有一个1.8V电压调节器VCAP引脚就是它的输出滤波点需要外接2.2uF电容到地。这个电容千万不能省容值也不能随意改芯片启动时内部稳压器会靠它稳定1.8V内核电压如果容量不够芯片可能会上电后直接白屏或者无法连接调试器。2.3 时钟电路8MHz晶振和32.768kHz晶振的选择STM32F103RCT6内部有一个RC振荡器可以跑但精度太差在温度和电压变化下频率漂移能达到几个百分点做串口通信时波特率会偏到乱码所以外部8MHz晶振基本是必加的选择。这个晶振配合内部的PLL可以倍频到72MHz的最高主频这也是F103的招牌性能点。晶振电路说来简单两个负载电容但这两个电容到底选多大很多人是直接抄参考设计。我算一下给你看。假设晶振的负载电容CL要求是18pF那么外部两个电容C1、C2的关系近似是CL (C1C2)/(C1C2) Cstray。Cstray是引脚和走线带来的杂散电容一般3到6pF。如果C1C2则每个电容就是2CL - Cstray。以CL18pF、Cstray5pF计算C1C236-531pF取标准值33pF。如果你用了12.5pF负载电容的晶振则C1C225-520pF。所以不要盲目照抄别人的原理图先看晶振的datasheet。我一般习惯在PCB上预留两个焊盘位置先焊计算值然后用示波器看波形如果起振不稳或者波形幅度不够再换电容。另外晶振两端可以并联一个1MΩ电阻帮助放大器处于线性区加快起振尤其对低功耗晶振有效。32.768kHz晶振是为RTC使用的最小系统板上我通常预留位置但不焊接因为很多项目不需要掉电保存时间。如果后续要加也只需接两个负载电容一般6pF到12.5pF选择依据同样是晶振手册。需要注意32.768kHz晶振对走线长度和杂散电容很敏感最好离MCU尽量近。2.4 复位电路、BOOT配置和SWD调试接口复位电路不复杂NRST引脚内部有上拉电阻外部再接一个10kΩ电阻到3.3V一个100nF电容到地组成RC复位延时。时间常数约1ms能满足上电稳定复位的需求。如果板上有复位按钮把按钮并在电容两端按下时把NRST拉低。启动模式配置是新手容易翻车的地方。STM32有三类启动方式从用户Flash启动、从系统存储器启动、从SRAM启动具体由BOOT0和BOOT1引脚的电平决定。我们平时程序下载到Flash上电必须从Flash启动也就是BOOT00BOOT1随便所以原理图上BOOT0和BOOT1都通过10kΩ电阻下拉到地。这样MCU一上电就会去执行Flash里的程序。如果你想让BOOT0可以切换方便用串口ISP下载固件那就把BOOT0单独引到排针通过跳线帽选择接地或接3.3V。注意BOOT0引脚不能悬空悬空时电平是不确定的芯片可能从错误的位置启动程序下进去也没反应。SWD调试接口是STM32的调试利器。它只要四根线3.3V、GND、SWDIO、SWCLK比JTAG少了整整一半以上而且SRST都不是必须的。我习惯在原理图上把NRST和SWO也引出来NRST可以在调试器连接失败时强制复位SWO可以用来输出调试信息做性能分析时很有用。SWDIO加一个10kΩ上拉SWCLK加一个10kΩ下拉这样可以提高抗干扰能力尤其连接线较长的时候。2.5 外设预留LED、串口和所有IO引出最小系统板如果严格砍到只有最小工作电路那调试的时候就没法看状态了。我一般会加上一个电源LED和一个用户LED。电源LED串联一个1kΩ电阻直接跨接在3.3V和GND之间用户LED接某个IO口比如PC13这是F103上比较常见的板载LED位置。这里提醒一句PC13并不是所有引脚的5V容忍脚只能由3.3V驱动别直接接5V电源。串口我引的是USART1对应PA9TX和PA10RX另外把GND也引出来这样接USB转串口模块时共地方便。所有IO口都用2.54mm排针引出每排10到16针这样无论调试串口、I2C、SPI还是外部中断都能用杜邦线直接跳线连接不用飞线到芯片引脚上。原理图设计到这个程度基本算完整了。接下来是PCB。3. PCB布局布线从原理图到能跑起来的板子3.1 布局思路以芯片为中心功能分区很多人画PCB时一上来就想着走线布局却稀烂最后板子画出来芯片歪在一角晶振拉得老远电源去耦电容根本没地方放。我的习惯是先把芯片放在板子中心然后围绕它布置各功能模块。这次板子尺寸做到65mm x 50mm左右。RCT6是LQFP64封装边长大约10mm放在正中心后四圈是IO排针底部是电源和晶振相关元件。晶振必须放在芯片OSC_IN和OSC_OUT引脚的旁边两者之间走线尽量短我一般控制在一两厘米内。去耦电容紧贴对应VDD引脚能多近就多近焊盘到芯片引脚的距离以不超过3mm为宜。LDO则放在板子一角因为它是板子上唯一的发热元件放角落容易散热也不会干扰其他电路。布局的顺序是先放主控再放晶振和复位再放电源元件最后放排针和LED。排针不要先定位不然芯片和外围元件会被挤压到板子边缘走线绕来绕去非常难受。3.2 布线细节电源、地、晶振和信号线双层板的策略是顶层走信号底层尽量保留完整地平面。我先铺好底层的地铜再走电源线最后走信号线。3.3V电源线尽量加粗主干线至少0.5mm能从顶层走就走顶层避免在底层被地平面切割。如果空间允许3.3V也可以做一块局部的电源铜皮而不是一条细线这样整个板子的供电压降会小很多。晶振区域的布线我格外小心。两条晶振走线要尽量短要尽量等长不能打过孔到其他地方最好相互对称旁边不要有其他高频信号穿越。可以在晶振下面铺一小块地铜把晶振和外部隔开形成一个隔离岛减少数字信号耦合到晶振上。VR区也就是晶振输出引脚附近的走线也不要去铺别的信号线。排针引出IO口的走线没什么特殊要求但要注意不要和晶振走线交叉不要靠近去耦电容的去耦回路。LED的限流电阻放在LED和芯片引脚之间电容放在电源引脚附近这样过回流焊后元件少的地方更容易排查问题。另外SWD接口的走线要尽量短而直SWDIO和SWCLK并行走线如果可以在调试接口旁放一个100nF电容到地对EMI有一定抑制作用。这个电容不是必须但花不了什么成本加上无妨。3.3 焊接与工艺选择PCB打样选择FR4板材、1.6mm板厚、双层板、喷锡工艺就完全够用。喷锡焊盘对焊接友好适合手工贴片和风枪吹焊。沉金板确实好看、抗氧化但价格高不少而且焊盘颜色偏暗反而不利于检查虚焊。元件封装选择上电阻电容用0603这是手焊和自动贴片都能兼顾的尺寸LDO用SOT-223焊接方便晶振用贴片直插2pin的5032封装手焊也好操作排针用2.54mm间距焊盘孔径我开0.9mm到1.0mm插排针时不会太紧也不会因为孔径太小导致焊锡堵塞。如果你是第一次画这种密脚芯片的板子建议把封装库里的焊盘尺寸调出来和芯片实际尺寸核对一遍。LQFP64的引脚间距是0.5mm焊盘宽度一般0.27mm到0.3mm长度1.2mm到1.5mm如果从网上下载的封装明显偏小手焊时会非常痛苦连锡连到怀疑人生。4. 焊接与硬件调试从“能烧录”到“能跑”4.1 焊接顺序和检查焊接顺序是个经验问题。我的顺序是先焊电源部分的LDO和电容然后是晶振、复位电路、BOOT电阻接着不焊芯片先给板子通电测量3.3V是否正常。如果这个阶段就发现问题排查范围小很容易定位。确认电源正常后再焊主控芯片最后焊排针和LED。焊完芯片后第一件事不是上电而是用万用表蜂鸣档测量3.3V和GND之间是否短路。这里有个细节因为芯片内部有ESD保护二极管和电源网络3.3V对GND的正常阻抗应该在几百欧姆以上蜂鸣档响不响取决于阈值有的万用表会响所以最好还是看电阻值。如果阻值小于100Ω基本可以判定有焊接短路优先检查芯片引脚之间有没有连锡特别是LQFP64这种密脚封装。我也习惯用助焊剂和松香配合焊接。密脚芯片用拖焊法非常高效先把固定引脚焊住然后让芯片引脚上吃满锡利用烙铁头和助焊剂把多余的锡拖走最后用洗板水或酒精清洁。焊完仔细检查每个引脚有没有桥接可以用放大镜或手机微距镜头观察。4.2 上电和最小系统验证上电后先量3.3V电压稳定在3.3V附近且无跌落然后量电流正常板子空载电流在几十毫安以内。如果电流特别大说明有电源短路或者元件焊反立即关电用手摸板子哪里发烫。晶振是否起振有示波器就量一下OSC_OUT引脚正常会看到8MHz的正弦波或方波。没有示波器可以用万用表交流档测量如果测量值有几百毫伏的AC电压说明可能起振了但这个方法不能判断频率准不准。更直接的办法是连接调试器只要能识别到芯片内核说明主时钟基本已经跑起来了因为SWD通信也需要时钟。4.3 程序下载、串口调试和跑通点灯调试工具我用ST-Link V2配合Keil MDK。在Keil的Options for Target-Debug里选择ST-Link然后点Settings如果正确连接能看到IDCODE比如0x1BA01477。如果显示无法连接先检查接线SWDIO、SWCLK、GND、3.3V是否一一对应杜邦线是不是松了然后检查BOOT0是否接地。如果还是不行按住板上的复位键点下载等下载提示出现再松手这个方法能救回很多看起来“锁死”的芯片。程序用STM32CubeMX生成选STM32F103RCTx配置HSE为Crystal/Ceramic ResonatorSYS里的Debug选Serial Wire这样SWD引脚不会在初始化时被重新配置成普通IO。USART1开异步模式115200波特率LED引脚配成GPIO输出。生成工程后主循环里翻转LED同时printf一条字符串电脑串口助手打开对应的COM口波特率115200能看到数据就说明基本流程全通了。串口printf在HAL库下要重定向fputc函数我一般加一个简单的实现用HAL_UART_Transmit发送单个字符。要注意这行代码必须链接进去否则printf输出进黑洞串口只有LED在闪却没有任何打印很多新手在这里卡很久。5. 常见问题与排查我把踩过的坑列成清单5.1 SWD连不上别急着换板按顺序查SWD连不上是最常见的调试开局难题。我把排查顺序写成一张表照着顺序查能省一个小时现象可能原因排查方法Keil提示No Target connectedST-Link没插好或驱动未装换USB口重装驱动观察ST-Link指示灯提示Cannot access TargetSWDIO或SWCLK接反对照原理图重新核对杜邦线最好用万用表量通断提示RDDI-DAP Error芯片进入低功耗或Bank1被锁按住复位键点下载再松手把BOOT0拉高试试连接上了但下载后不运行BOOT0悬空或拉高确认BOOT0下拉到地从Flash启动下载偶尔成功常常失败供电不稳或SWD线太长缩短杜邦线给板子单独供3.3V不要只靠ST-Link芯片被程序锁住也是一个经典情况。比如你在代码里禁用了调试接口的引脚复用下一次下载就会连不上。解决办法是用STM32CubeProgrammer的Connect under reset功能或者用ST-Link Utility擦除整个Flash。我在做这类板子时习惯在初始化代码里先别动SYS的Debug配置始终保持SWD可用等所有外设调完再统一清理引脚。5.2 晶振不起振、程序反复复位时钟和电源是重灾区晶振不起振表现为芯片能通过SWD连接也能下载程序但程序运行不稳定定时器或串口频率和预期完全对不上甚至上电后压根不执行用户程序。排查办法是先量晶振引脚电压正常应该有1V左右的偏置电压两个引脚都有。如果其中一个接近0V多半是晶振虚焊如果两个都在0V检查电容是不是短路或者焊反。如果晶振焊得很好但就是不起振很可能是负载电容和晶振不匹配回头检查你用的晶振CL是多少。我遇到过用32pF电容配12.5pF负载电容晶振的情况结果振荡波形幅度低、不稳定换回20pF就好了。所以这俩参数必须匹配不能照搬。程序反复复位或者运行中途跑飞优先查电源纹波。用示波器测3.3V波形如果上电瞬间有明显的跌落说明去耦电容不够或者LDO输出电容太小。还有VCAP电容如果这个电容虚焊或者漏焊芯片内部1.8V不稳定程序跑着跑着就复位而且复位时间还不规律。这类问题靠看代码根本找不到必须回到硬件上。5.3 串口乱码、数据不对先查时钟配置再查接线串口乱码的处理顺序很简单先确认串口助手的波特率和CubeMX里设置的波特率一致。但有时两者明明都是115200还是乱码那就是系统时钟频率和实际晶振频率不匹配。比如说你实际焊了8MHz晶振但CubeMX里选了HSE的16MHzPLL倍频出来的主频就全偏了串口自然全错。排查方法是打开CubeMX重新看时钟树选HSE为8MHz再看主频算出来是不是72MHz。如果板子上只有8MHz晶振而你在CubeMX里选了其他频率整个系统时钟就错了。另外HSE模式要选Crystal/Ceramic Resonator不是Bypass ClockBypass是给外部有源时钟用的很多人选错了导致晶振不工作。串口共地问题也常有。USB转串口模块和板子必须共地GND不接或者接触不良会出现能收到但乱码和丢字节并存的现象。尤其是在用杜邦线连接时GND线不够长就可能随手夹到别的引脚上我建议把板子的GND排针专门做一个位置醒目标注每次插串口前先量一下。5.4 PCB设计阶段就埋下的坑焊接期才爆发有些问题不在焊接和调试而在PCB设计阶段就埋下了。最常见的是晶振离芯片太远走线很长而且中途还打了个过孔这种板子晶振可以振荡但波形质量差EMI也大严重时程序跑一段时间就死机。解决方法是重新布局保证晶振和芯片在同一个面中间不要有过孔。另一个坑是地平面被切碎。很多人在双层板上为了走信号线把底层的地铜割得到处都是结果去耦电容的地回路被延长电源完整性变差。好的做法是信号线尽量走顶层底层保持完整地平面如果实在需要从底层穿过也尽量集中在一个区域不要横穿整个板子。还有排针间距的问题。我见过有同学把排针孔位画成1.0mm孔径结果插排针时焊盘里的锡被撑开冷却后排针松动一碰就接触不良。孔径至少要大于排针的引脚直径加一点余量2.54mm标准排针引脚直径约0.5mm孔径0.9到1.0mm比较合适。这块最小系统板从原理图到最终跑通我最大的体会是硬件调试没有玄学所有看似随机的问题背后都有一个具体的物理原因。你花了半小时怀疑芯片有问题不如花五分钟量一量电源、查一查接线多半真相就藏在那个被你默认“肯定没问题”的地方。最后再分享一个小技巧板子打样回来后不要急着焊芯片先把电源部分焊好、上电、量电压再焊其他。这一步几乎不需要额外时间但能帮你在后期排查时少一大圈弯路。我后来画的每一块板子都是这个流程到现在已经很少因为低级短路返工了。
返回列表