ARTICLE DETAIL

资讯详情

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

STM32F103C8T6最小系统电路图解:从电源、时钟到复位与PCB设计

STM32F103C8T6最小系统电路图解:从电源、时钟到复位与PCB设计 很多初学者拿到STM32F103C8T6最小系统板第一反应都是对着原理图发懵一个芯片、几个电容、一个晶振、两个电阻总共没多少元件但就是搞不清楚每一颗料到底是干什么的更别提自己从头画一块能用的板子了。网上搜出来的最小系统原理图五花八门有的带这个电容有的不带有的接法还不一样越看越乱。这篇文章我想换个讲法不让你死记硬背“这里放一个104电容、那里放一个8M晶振”这种结论而是带着你从头推导一遍STM32F103C8T6要跑起来硬件上必须满足哪些条件每个元器件被放进电路图里是出于什么逻辑。原理理清楚了图自然就记住了。文章后半部分我会用一张典型的最小系统原理图按模块拆开和实物开发板逐点对照顺便把我这些年调试中踩过的坑一并交代清楚。无论你是在校学生、刚转行嵌入式的工程师还是想自己画板做产品的自由开发者这篇文章都适用。读完之后你会具备两个能力第一拿到任意一块STM32F103C8T6最小系统板能快速看懂它的设计意图第二自己动手画原理图、做PCB时知道每一个元件该不该放、放多少、值取多少。1. 最小系统到底在“最小”什么先想清楚芯片要跑起来需要什么1.1 芯片运行的四项基本需求先别急着看电路图。我们把STM32F103C8T6想象成一台微型电脑它要正常工作需要满足四个条件有电、有“心跳”、能复位、能把程序装进去。有电是最基本的芯片的VDD引脚必须得到稳定的3.3V供电而且不能有太大的电压波动有“心跳”指的是时钟信号芯片内部所有逻辑电路都需要时钟节拍来驱动就像人的脉搏一样能复位意味着芯片有一个确定的起点上电之后它知道自己从哪里开始执行程序能把程序装进去则对应下载电路Flash里没有程序的话芯片上电后只能跑内部固化的Bootloader或者干脆空转。这四个条件对应到电路图上就是电源电路、时钟电路、复位电路和下载/启动电路。所谓“最小系统”本质就是把满足这四个条件所必需的外围元件压缩到极致。除此之外的东西比如LED指示灯、按键、外部存储、通信接口都属于功能扩展不属于“最小系统”的范畴。1.2 最小系统板与最小系统电路的分寸把握这里要区分两个概念最小系统电路和最小系统板。最小系统电路强调的是“芯片能运行”的下限元件数量越少越好理论上一颗芯片加一个3.3V电源和一颗8MHz晶振就能跑最小系统板则是为了方便开发使用通常在最小系统电路的基础上增加了USB转串口芯片、稳压芯片、LED指示灯、按键、排针引出等功能让用户拿到手就能直接烧录程序、调试运行。明白了这个区别之后看原理图的时候心态就不一样了。看到板子上的AMS1117稳压芯片你知道那是为了把USB的5V降成3.3V看到两个LED你知道那是电源指示和用户自定义指示灯。这些不在“最小”的语义范围内但大部分市售最小系统板都会集成。真正需要你重点关注的是芯片周围那一圈看起来不起眼的小电容小电阻。1.3 官方资料里最该看哪几份说到自己画最小系统离不开官方参考设计。很多人一上来就百度任意找一份原理图抄结果抄出来的板子各种诡异问题。我的习惯是优先看意法半导体官方资料主要两份STM32F103C8T6数据手册Datasheet和STM32F103xx参考手册Reference Manual另外还需要AN2586应用笔记硬件开发入门指南。数据手册里有引脚定义、电气特性和绝对最大额定值参考手册里有完整的系统架构和外设寄存器说明AN2586则直接给出了硬件设计建议包括电源去耦电容怎么放、晶振怎么接、复位电路怎么做。画原理图的时候我桌面永远开着这三份PDF遇到不确定的参数随时查。自己画板子最忌讳的就是凭感觉抄图你不清楚每个引脚为什么接这个值出了问题就无从下手。2. 电源电路不是接个3.3V那么简单去耦电容的位置和取值都有讲究2.1 典型供电拓扑从USB 5V到芯片VDD看市面上绝大多数STM32F103C8T6最小系统板供电拓扑都是这样一个链路USB接口或者排针输入5V经过一颗AMS1117-3.3把电压降到3.3V输出接到芯片的VDD引脚。AMS1117是低压差线性稳压器LDO输入输出压差在1V左右就能正常工作所以5V降3.3V很合适而且外围电路极简——输入输出各一个10uF钽电容再加一个104陶瓷电容就够稳定。为什么输入和输出都要并联大电容和小电容的组合大电容10uF负责储能和低频滤波应对电流的瞬态变化小电容104即100nF负责滤除高频噪声。稳压芯片内部有一定带宽对高频干扰的抑制能力有限陶瓷电容的低ESR特性恰好能补上这个短板。2.2 芯片周边的去耦电容为什么每对电源引脚都要放104这是初学者最容易忽略的地方。STM32F103C8T6有多个VDD和VSS引脚比如LQFP48封装就有VDD_1、VDD_2、VDD_3和对应的VSS_1、VSS_2、VSS_3。官方建议是每一对VDD和VSS引脚之间都要就近放置一个100nF的去耦电容并且电容位置要尽量靠近引脚连线要短最好直接放在PCB背面对应焊盘下方。去耦电容的工作原理可以这样理解芯片内部逻辑翻转瞬间会抽取很大的瞬态电流如果电流完全靠电源芯片供给导线的寄生电感会导致电压瞬间跌落这个跌落幅度可能超过芯片允许的纹波范围。去耦电容的作用就是充当芯片旁边的“小水库”逻辑翻转瞬间先从这里取电等电流平稳后再由电源芯片补充。100nF这个值也不是随便定的它自身的谐振频率点正好覆盖STM32内部逻辑翻转产生的主要高频噪声频段。如果板子上空间实在紧张至少要保证每个VDD引脚旁边有100nF。我在检查板子的时候一个重要的步骤就是拿万用表通断档核实每个104电容的走线是不是真的接到了对应的VDD/VSS引脚而不是仅仅“画在了原理图上”。2.3 模拟电源与参考电压的额外处理STM32F103C8T6的48脚封装集成了VDDA、VSSA和VREF引脚VREF-在芯片内部已经和VSSA相连外部无需额外处理。VDDA是模拟电源给芯片内部的ADC、温度传感器、复位电路这些模拟模块供电。官方推荐的做法是VDDA通过一个磁珠或者10欧姆电阻与数字VDD隔离再对VSSA放置一个1uF和一个10nF电容。这样做有个实际原因数字电路的高频开关噪声通过共用电源轨会耦合到模拟电路中直接影响ADC测量的精度。磁珠在这里相当于一个低通滤波器把高频噪声挡在模拟电源之外。如果你只是做简单的数字控制、不依赖ADC精度直接连在一起也能跑但既然做硬件设计还是按规范来更稳妥。另外作为参考电压的VREF一般就直接接VDDA如果产品对ADC精度要求很高可以考虑外部基准芯片单独供电单片机的VREF和VDDA从基准源接入或者用运放缓冲后再接入。2.4 电源指示灯限流电阻的计算方法最小系统板上的电源LED看着简单但限流电阻的取值正好能检验你电路基本功扎不扎实。LED的正向压降通常按2V估算红色LED大约1.8-2.2V蓝色和白色更高电源是3.3V限流电阻需要承担约1.3V的电压。如果希望LED工作电流5mA电阻值就是1.3V/5mA260欧姆取常用标称值330欧姆电流约4mA亮度足够如果希望更亮一些到10mA就取130欧姆左右标称值150欧姆。计算限流电阻时功率很容易忽略。大部分板子用的是0603封装电阻额定功率0.1W。以330欧姆为例实际功耗PUI1.3V*0.004A0.0052W远小于0.1W完全没问题。但如果错误地把LED直接接到5V还选了100欧姆电阻功耗就到0.09W了接近极限长时间运行会发烫甚至烧毁。3. 时钟电路8MHz晶振和20pF电容的搭配是怎么推出来的3.1 芯片的主时钟不是8MHz一说STM32F103C8T6的时钟电路大家都说“外部接8MHz晶振”。但很多人会忽略一个重要事实芯片主频最高72MHz这个72MHz是芯片内部PLL锁相环把8MHz倍频9倍得到的。也就是说外部晶振并不直接作为系统时钟它只是给PLL提供一个精确的参考频率源。这样一来选择8MHz就有讲究了。F103系列的PLL倍频系数是可配置的8MHz乘以9得到72MHz正好在芯片规格允许的范围内而且整数倍频配置极其方便。之所以不用更常见的12MHz或者16MHz是因为倍频到72MHz不整除会产生无法精确锁定的小数倍频配置问题。所以你在最小系统板上看到的几乎所有晶振都是8MHz。3.2 两个负载电容的真正作用晶振旁边的两个负载电容通常是两个20pF也有取15pF、22pF的从晶振的两个引脚分别连接到GND构成一个π型网络。它们的作用是配合晶振工作保证晶振起振并且振荡频率稳定在标称值附近。晶振有一个很重要的参数叫负载电容CL设计电路时外部电容和晶振本身的寄生电容共同决定实际振荡频率能否准确落在标称频率上。计算公式大体是CL (C1 * C2) / (C1 C2) 寄生电容约3-5pF。如果C1和C2都取20pF并联后等效电容是10pF再加上大约4pF的寄生电容总负载电容约14pF。很多8MHz晶振的额定负载电容就是12-18pF区间取20pF电容是比较通用的折中方案。有些朋友会遇到晶振能跑但串口通信波特率有偏差隔一段时间就有乱码排查到最后往往是晶振负载电容不匹配导致的频偏。如果遇到这种情况电容值微调的方向可以参考实测频率偏高就增大电容偏低就减小电容。用示波器或者频率计观察是最直接的办法盲调的话每次换一个标称值比如15pF换22pF对比观察。3.3 振荡电路起振条件与不起振排查晶振要稳定起振必须满足巴克豪森条件环路增益大于1相移满足360度在振荡频率点上相移180度加上放大器本身的180度。MCU内部集成了一个高增益反相放大器外部晶振和电容构成了反馈网络只要增益足够电路就能起振。实际中“晶振不起振”是最常见的故障现象之一我总结了几种高频原因负载电容取值偏离晶振规格太多导致振荡条件不满足晶振引脚走线过长、寄生电容过大晶振靠近大电流走线或者强干扰源比如电感、变压器晶振本身质量差或者虚焊。检查的时候用示波器探头10倍衰减档触碰OSC_IN引脚正常能看到一个正弦波幅度通常在几百毫伏到1V左右。如果示波器显示一条直线优先排查焊接和电容值然后再考虑更换晶振验证。3.4 别一上来就配32.768kHz有些朋友看了网上的帖子以为最小系统要配一个32.768kHz的低速晶振——那是RTC实时时钟用的。STM32F103C8T6的RTC可以选择内部低速时钟LSI或者外部32.768kHz晶振LSE。如果产品需要走时功能且对时间精度有要求才需要增加这颗晶振。如果只是做常规的控制逻辑不涉及精确时钟完全可以不焊用内部LSI跑RTC省一颗料。在画原理图时可以把LSE晶振电路预留位晶振位置、两个负载电容位置、匹配电阻位置留在PCB上生产时按需贴或不贴。这种设计习惯能提高板子的灵活性和复用性后期加功能不用重新改板。4. 复位与启动电路决定芯片从哪里“醒来”和如何“进入下载模式”4.1 复位电路NRST引脚上的10k电阻和104电容STM32F103C8T6的NRST引脚是低电平有效的复位输入内部已经集成了一个约40kΩ的上拉电阻所以理论上这个引脚悬空芯片也能正常工作。但官方硬件设计指南和绝大多数量产设计都会在外部额外加一个10kΩ上拉电阻到3.3V并接一个104电容100nF到GND。这个容阻组合同时承担两个角色上电瞬间产生一个延迟的低电平脉冲给芯片复位上电复位以及外部按键复位时消除按键抖动。复位时间常数τRC10kΩ100nF1ms。也就是说上电后NRST引脚电压从0V慢慢充到63%的阈值大约1ms再稳定到高电平还需要几毫秒。这个延时对芯片上电初始化足够充裕了。如果选更大的电容比如1uF时间常数到10ms也没有问题只是按键复位的感觉会有轻微延时如果选100nF以下的电容比如10nF时间常数只有0.1ms在某些电源上升时间很慢的场景下可能导致复位不彻底。所以104电容是最通用稳妥的选择。4.2 BOOT0和BOOT1决定启动命运的引脚STM32F103C8T6的启动方式由BOOT0和BOOT1两个引脚的电平状态共同决定不过真正在实际开发中用到的只有三种组合。为了方便记忆核心逻辑可以这样理解BOOT0为低电平时从Flash启动正常跑用户程序BOOT0为高且BOOT1为低时从系统存储器启动运行Bootloader便于通过串口ISP下载固件BOOT0为高且BOOT1为高时从SRAM启动这种模式主要用于调试和测试一般用不到。最小系统板上处理BOOT引脚的做法通常是BOOT0引脚接一个10kΩ下拉电阻到GND保证默认从Flash启动再串联一个10kΩ电阻引出到一个排针或拨码开关需要进入ISP模式时给BOOT0一个高电平BOOT1引脚则直接接10kΩ下拉电阻到GND即可因为它只有在ISP模式下才有意义。这个10k下拉不是随手画的它能在芯片复位瞬间确保引脚电平稳定防止因引脚悬空而出现随机启动行为。如果BOOT0悬空你可能会遇到芯片偶尔进了Bootloader却跑不了用户程序的诡异故障——这个坑我亲眼见过不少人踩过。4.3 上电自动复位电路和下载接口的配合如果板子用了串口ISP下载还需要一个“上电自动复位”电路。原理很简单USB转串口芯片的DTR和RTS引脚通过三极管或三极管加电容组合在下载软件打开串口的时候自动给NRST引脚一个低电平脉冲同时把BOOT0拉高让芯片复位后直接进入Bootloader。这样用户就不需要手动拨开关、按复位键了。如果板子只用ST-Link的SWD下载不需要自动复位电路也能正常工作但BOOT0的处理还是要保留否则一旦固件里把SWD引脚复用掉了就只能靠BOOT0拉高进入ISP擦除重置这是最后的救命手段。4.4 SWD下载接口四根线的接法用ST-Link下载调试最常用的就是SWD接口最少只需要四根线SWDIO、SWCLK、GND、3.3V如果你用的是带供电的ST-Link。STM32F103C8T6的SWDIO对应PA13SWCLK对应PA14。板子上通常把这几个信号引到排针注意按照ST-Link的接口定义一一对应接反了轻则连不上重则烧坏调试器。实际调试时我遇到过连不上芯片的情况排查链路是这样的确认ST-Link驱动安装正常——确认接线顺序正确——确认目标板供电正常——确认SWDIO和SWCLK没有被程序复用一般新片不会有这个问题——最后怀疑芯片锁死。每种情况对应不同的处理方式后面第6章会详细说。5. 电路图与实物逐点对照从原理图到开发板一次看明白5.1 一张典型最小系统原理图的模块化拆解这里我以一个典型的STM32F103C8T6最小系统板为例把整套原理图划分成若干功能模块。你对比手头的板子就能发现几乎所有板卡都是这个框架的变体。模块主要元件核心作用电源输入USB接口/排针、自恢复保险丝引入5V外部电源稳压AMS1117-3.3、输入输出滤波电容产生3.3V稳定电压电源指示LED限流电阻指示供电状态芯片STM32F103C8T6本体主控核心去耦VDD/VSS间104电容滤除高频噪声时钟8MHz晶振2×20pF提供PLL参考时钟复位10k上拉104电容可选按键上电复位、手动复位启动BOOT0/BOOT1的下拉电阻配置启动模式下载SWD四线排针/或USB转串口电路烧录与调试用户功能LED按键排针引出最小系统之外的扩展拿这张表去对照你的板子逐个元器件找位置很快就能从“看着一堆元件无从下手”转变为“一眼识别每个模块”。5.2 实物板上的元件识别与位置确认看实物板的时候很多新手会对着密密麻麻的排针和贴片元器件发懵不知道该先看哪里。我的经验是从电源LED开始确定方向然后顺着电源路径找到AMS1117再找到芯片最后在芯片周围找到晶振和复位按钮。贴片元件的标识是识别要点104电容表面印着“104”10uF电容一般印着“106”或者品牌代码加容量标识钽电容则是色带加丝印电阻用三位或四位数字标称值比如“103”就是10kΩ“104”是100kΩ“330”是33Ω注意不是330Ω是33×10^033Ω要用万用表实测的话更准确。看不清丝印的话万用表电容档和电阻档是最直接的验证工具。5.3 上电检查顺序先别急着烧程序新板子上电我个人有一套固定流程能避免很多低级故障烧坏芯片。第一步先用万用表电阻档测量3.3V和GND之间的阻值正常应该在几百欧姆以上如果接近0说明短路了千万别上电第二步接电源用万用表量AMS1117输出是不是3.35V左右允许有正负5%的偏差偏差过大说明稳压芯片有问题或负载异常第三步看晶振是否起振有示波器量OSC_IN没示波器就赶紧烧一个最简单的LED闪烁程序来验证第四步用ST-Link连接打开ST-Link Utility或者STM32CubeProgrammer看能不能识别到芯片ID。这套流程做完板子能不能用基本心里有数了。我自己第一次画板子就是因为急着烧程序没测短路结果一个焊点桥接直接把稳压芯片烧了。6. 实测中的坑芯片锁死、晶振失效、电源不稳逐一拆解6.1 芯片锁死与BOOT0短接恢复法最让初学者崩溃的故障之一是某次下载程序后ST-Link突然连不上芯片提示“Cannot connect to target”或者“No target connected”。遇到这种情况第一反应不是怀疑芯片坏了而是检查是不是程序把SWD引脚PA13/PA14给复用成普通GPIO了。比如某段初始化代码将PA13配置成了推挽输出SWD接口就没法工作了。恢复方法很粗暴有效把BOOT0引脚拉高接到3.3V然后重新上电让芯片从系统存储器启动跳过用户程序这时候SWD接口就又能连上了。连接之后用STM32CubeProgrammer把Flash全片擦除然后把BOOT0恢复到低电平重新上电芯片就“复活”了。如果手头没有可操作的BOOT0接线也可以通过USB转串口配合ISP方式擦除但操作要麻烦不少。所以之前强调BOOT0下拉保留引出不是多此一举。6.2 晶振不起振和“能跑但不太稳”的处理有次我帮朋友调一块板子现象很奇特程序偶尔能正常运行偶尔上电完全没反应重新上电十次能成功三四次。用示波器量晶振引脚有时候有波形有时候没有波形幅度还忽大忽小。最后排查发现是晶振两个引脚旁边的负载电容焊错了位置两个电容都只接了单边到地另一边悬空等效负载电容严重偏离晶振要求。正确处理方式很简单补焊电容让两个20pF分别从晶振两脚落地。焊好之后再上电十次全部正常启动。所以说晶振电路看着不起眼但它真是最小系统里最容易出幺蛾子的地方画板时走线尽量短而对称布局时远离电源电感和USB信号线。另外“能跑但串口乱码”也跟晶振有直接关系。比如本来应该配8MHz结果某个角落焊错成12MHz晶振系统实际工作频率就会偏差50%串口波特率完全对不上。遇到这种情况先用示波器量晶振频率确认标称值对不对再检查CubeMX里配置的时钟树是不是和实际晶振匹配。6.3 电源噪声导致的上电随机复位有一类故障不好复现又很头疼板子偶尔上电就正常偶尔上电卡死在启动阶段运行过程中偶尔自动复位。用示波器长测NRST引脚和3.3V电源轨会发现VDD上有明显的毛刺这些毛刺经过复位电路耦合到了NRST引脚上触发了芯片复位。这个问题的根源通常是电源输入端没有做好滤波或者去耦电容位置离芯片引脚太远。解决办法有两步。第一步在电源输入端加强滤波必要时加一个几百uF到上千uF的电解电容储能同时并联一个104电容滤高频第二步把去耦电容挪到紧贴芯片VDD引脚的位置走线从电源引脚直接打过孔到电容再到电源层尽量减小环路面积。验证是否解决可以把示波器探头放在VDD引脚和NRST引脚上反复开关电源观察毛刺是否消失。6.4 国产替代芯片和特殊封装的注意事项去年来STM32缺货涨价很多项目不得不转换到国产替代方案。STM32F103C8T6的国产替代型号不少比如GD32F103C8T6、MM32F103C8T6等引脚定义大部分兼容但有几个关键差异需要注意。首先是内部Flash和SRAM容量的差异GD32的Flash擦写次数和速度标称值有区别使用底层Flash操作时要注意擦写时间参数其次是供电电压范围、IO驱动能力、上下拉电阻的内部阻值因为工艺不同会有差异极限参数要重新核对数据手册不要盲目照搬ST的规格参数。还有一点部分国产芯片的启动时间和复位脉宽要求可能和ST不同如果你的板子用了很短的复位电容比如1nF换国产芯片后偶尔出现上电不正常可以先加大复位电容到100nF甚至220nF试试。替换芯片后我习惯做一个全功能回归测试上电、下载、复位、看门狗、每个外设逐一验证一遍不要只看能点灯就认为完全兼容。项目是长期运行的很多兼容性问题在短时间内根本暴露不出来。7. 自己画最小系统板的实操建议与个人收尾心得如果你准备从零画一块属于自己的STM32F103C8T6最小系统板有几条实操建议值得提前记下来。画原理图的时候我建议把每个模块用灰色矩形框分隔开标注清楚模块名POWER、CLOCK、RESET、BOOT、DEBUG等这样不仅自己审查方便以后开源分享给别人的时候也容易理解。PCB布局上优先把晶振、去耦电容、复位电路放在芯片附近电源走线加粗至少0.5mm以上模拟地和数字地单点连接或者用0欧电阻隔开。打样回来之后焊接顺序也很关键。先焊电源部分上电验证3.3V正常再焊芯片和晶振、复位上电检查是否能够通过ST-Link连接最后焊排针、LED、按键等功能电路。这样每一层都经过验证出现故障时排查范围小得多。如果你还是第一次做推荐用LQFP48封装手工焊接难度适中配合拖焊法基本都能搞定。这些年带过不少新人也帮网友远程排查过不少板子问题发现一个共性现象大多数“疑难杂症”最后都被证明是最基础的问题——某个电容没焊、某个电源引脚虚焊、BOOT引脚悬空、地线没接牢。所谓经验丰富其实就是把这些基础项变成了肌肉记忆拿到板子先检查一遍省去后面大量无头苍蝇式的排查。通篇下来最小系统的知识点并不复杂它考验的不是记忆力而是你对“为什么”的理解深度。希望你看完这篇文章后能用自己的话把最小系统讲给别人听而不是指着原理图说“这里要放个电容因为大家都这么放”。那才算真正搞懂了。
返回列表