第4章:MCU最小系统设计——从一颗光杆芯片到它能跑起来

张开发
2026/6/9 11:13:43 15 分钟阅读

分享文章

第4章:MCU最小系统设计——从一颗光杆芯片到它能跑起来
大家好前三章老张带着大家把电阻电容、模电调理、数字电平这些基本功夯了一遍。从这一章开始咱们要动真格的了——设计一块能跑起来的STM32核心板。很多兄弟用惯了现成的开发板觉得画核心板没啥难度照着官方原理图抄就是了。可真到自己动手的时候才发现晶振要不要加电容选多大的复位电路真的需要吗BOOT引脚怎么接才不翻车选型表和实际用起来完全两码事。这一章我就带你从零开始画出一块以STM32F103C8T6为核心的最小系统电路。我不光告诉你每个引脚怎么接更重要的是告诉你为什么这样接以及接错了会怎样。理解透这一章以后你换任何一款MCU都能自己设计出最小系统来。一、什么是最小系统三个字说清楚所谓“最小系统”就是能让MCU跑起来的最基本外围电路。给MCU供上电接好三样东西——电源、时钟、复位——然后引出下载口芯片就能烧程序并且工作了。缺一样都不行。拿STM32F103C8T6举例你要画的核心电路就五件事供电把外部电源变成稳定的3.3V给VDD、VDDA等引脚供上。时钟外接一个8MHz晶振给主时钟用再加一个32.768kHz晶振给RTC用可选。复位一个按键加上拉电阻按一下能让芯片重启。启动配置BOOT0和BOOT1引脚接对决定芯片从哪启动。下载调试口引出SWD接口用ST-Link烧程序。这五样搞定了单片机就活了。剩下的GPIO、外设那都是锦上添花。二、供电电路——MCU的“心脏起搏器”2.1 电源引脚分布和供电分组STM32F103C8T6有多个电源引脚不是随意标的它们分组供电给芯片内部不同区域VDD3个引脚给数字核心、IO口、大部分外设供电。接3.3V。VDDA1个引脚给内部ADC、PLL、复位模块等模拟部分供电。也必须接3.3V而且电压要与VDD保持同步压差不能超过0.3V。VSS3个引脚数字地跟VDD对应。VSSA1个引脚模拟地跟VDDA对应。VBAT1个引脚备份域供电。接3.3V或备用电池芯片断电时维持RTC和备份寄存器。每个VDD和VDDA引脚旁边都必须有一颗0.1μF的去耦电容到地而且电容离引脚越近越好。原因老张在第1章讲得很清楚芯片内部晶体管高速开关需要瞬时大电流这颗电容就是贴在芯片脸前的蓄水池。另外VDDA脚附近我习惯加一颗10μF的钽电容或陶瓷电容提供低频储能VDD总入口处再来一颗100μF的电解电容做大水池实际很少用到。三层滤波把从电源模块过来的纹波吃得干干净净。2.2 模拟地与数字地怎么处理这个问题争论了很多年。老张直接说我的做法模拟地和数字地在整板只用一个0Ω电阻或磁珠单点连接位置放在VDDA和VSSA引脚附近。为什么要单点接地数字区域的开关噪声会在地平面上产生压差波动如果模拟地和数字地到处乱连数字噪声会串进模拟区域ADC读数就不干净了。单点接地相当于只开一个门把数字噪声限制在数字区不让它去污染模拟信号。磁珠的话选100MHz阻抗在几百Ω到1kΩ之间的滤除高频数字噪声如果用0Ω电阻那就纯单点连接无滤波效果。对ADC精度要求不高的场合0Ω电阻完全够用。2.3 VBAT引脚处理如果你不打算用后备电池VBAT直接接3.3V即可省事。如果需要掉电保持RTC时钟VBAT接一颗CR1220纽扣电池通过一个二极管做双路切换主电掉电自动切到电池供电。二极管用肖特基如BAT54C压降小减少电池消耗。有个教训有次我没接VBAT又恰好主电波动了一下RTC时间清零了。后来查手册才发现VBAT不但供电RTC还供着备份域寄存器。哪怕你不用RTCVBAT也最好接上VDD防止意外掉电导致某些状态丢失。三、时钟电路——MCU的“心跳脉搏”3.1 主时钟晶振8MHz晶振 两个负载电容STM32内部虽然有RC振荡器但精度只有1%左右温度漂移也大。做串口通信、USB、CAN这些需要精确时序的应用必须上外部晶振。F103的标准接法8MHz无源晶振跨接在OSC_IN和OSC_OUT引脚之间晶振两端各对地接一颗负载电容。两颗电容的容值怎么选公式是 C 2×(CL – Cs)CL是晶振规格书里标的负载电容常见12.5pF或20pFCs是PCB走线和引脚本身的寄生电容一般估3~5pF。比如晶振CL20pFCs估5pF则C2×(20-5)30pF选标称值27pF或33pF都行。要求不高的场合直接上22pF通用值也能起振。晶振布局铁律晶振和两颗电容必须紧靠MCU引脚放置走线尽可能短晶振下方不走任何信号线。我见过有兄弟把晶振放在板子边上引线拉了2cm长结果起振困难单片机时而起振时而罢工。原因就是长走线增加了寄生电容和电磁干扰破坏起振条件。3.2 RTC时钟晶振32.768kHz可选如果你需要RTC日历功能加一个32.768kHz的晶振接在OSC32_IN和OSC32_OUT之间匹配电容一般选6pF~15pF参照晶振手册。这个晶振更娇气对走线要求更高。走线长一点、旁边有开关电源、温度变化大都可能导致频偏过大甚至停振。老张的习惯是不用RTC就直接省掉这颗晶振和两个电容省BOM省事。需要高精度RTC的场合干脆用外部RTC芯片如DS1302比MCU内置的准得多。四、复位电路——最不起眼但不能没有STM32的复位引脚是NRST低电平有效。正常工作时要保持高电平拉低就复位。最简单的复位电路一个10kΩ上拉电阻接到3.3V确保正常工作时NRST为高。再并一个按键到地按下按键时NRST被拉到低电平芯片复位实际项目用100nF电容代替按键即可。那个上拉电阻能不能省掉不行。STM32的NRST引脚内部有一个弱上拉约40kΩ按理说可以不上拉。但这个内部上拉比较弱在电源上电缓慢或者有电磁干扰的场合NRST可能长时间处于不确定状态导致MCU上电后不能正常启动。外部加一个10kΩ上拉电阻电流不大稳定性提高一大截。另外在NRST引脚对地并一颗0.1μF的小电容能滤掉电源上电瞬间的毛刺防止误复位。这颗电容与上拉电阻构成RC延时复位信号会有一个缓慢上升的过程不用担心边沿触发问题。如果要在NRST和SWD调试器之间串一个电阻比如100Ω来保护调试器输出那这个RC延时就有用了否则可以不加这颗电容。地弹场景补充当很多输出同时从高翻低时地线瞬间大电流可能让芯片内部地电位轻微抬高相当于NRST对地电压被拉低如果这个压差吃掉噪声容限可能引发误复位。所以电源和地去耦做扎实也是在保护复位信号的稳定。五、启动配置——BOOT0和BOOT1接错了烧不进去程序F103有BOOT0和BOOT1两个引脚决定芯片上电后从哪启动BOOT1BOOT0启动模式X0从用户Flash启动正常运行模式01从系统存储器启动出厂Bootloader用于串口烧录11从SRAM启动调试用极少用常规用法BOOT0通过一个10kΩ下拉电阻接地BOOT1任意默认下拉跑用户程序。这是最正常的模式上电就从你烧进去的固件启动。进串口ISP烧录把BOOT0拉高跳线帽或按键然后复位芯片就从系统Bootloader启动可以用串口烧程序。烧完把BOOT0恢复接地再复位一次就跑新程序。有个让很多新手抓狂的问题画板时BOOT0浮空结果芯片有时能跑有时不能跑烧录器也时灵时不灵。原因就是BOOT0悬空后电平不确定可能被干扰拉高进入ISP模式。所以BOOT0和BOOT1永远不要悬空一定要有确定的电平哪怕内部有弱下拉也要外部加固。上电瞬间IO状态未稳定时靠外部电阻确保电平确定下拉电阻接地或通过跳线选择接高接低保证它的电平是确定的0或者1。补充说明PB2/BOOT1引脚上电后默认被内部下拉如果你用不到它来配置启动模式正常接外设就行不需要额外处理当然除非不得已特殊引脚一定要慎用。六、下载调试口——SWD三根线就够了F103支持JTAG和SWD两种调试接口。JTAG要5根信号线SWD只要2根SWDIO、SWCLK加1根地线和1根可选的复位线省引脚省空间我全部项目都用SWD。标准SWD接口引出4个脚SWDIO数据线双向。SWCLK时钟线调试器输出。GND地线必须接不然信号没有参考。NRST可选接目标芯片复位脚调试器可以硬件复位芯片。SWDIO和SWCLK各自接一个10kΩ上拉电阻到3.3V保证在没有调试器连接时电平确定不会因为悬空而误触发内部调试逻辑。走线要求SWD两根信号线不要太长最好不超过15cm周围不要紧挨着大电流走线或开关电源。遇到过一个故障SWD线旁边就是DC-DC电感调试时经常莫名断开示波器一看SWCLK上叠加了高频噪声把电感移远就恢复了。一个小技巧SWD的这两根引脚可以复用为普通GPIOF103里是PA13和PA14。但一旦复用为GPIO你就没法用SWD调试了。所以设计时尽量用其他GPIO把这两个脚留给调试。实在管脚不够用了可以在代码启动后把这两个脚设成GPIO但要做好心理准备以后调试这板子就只能用串口ISP烧录了。另外注意如果代码一启动就把SWD引脚改掉那调试器会立刻断开调试失败。所以一般会在main函数开头加个几百毫秒的延时再切换引脚。七、完整原理图速览把上面五个部分拼起来就是你第一块STM32核心板的完整最小系统原理图了。老张给你用文字画个信号连接总表checklist你画原理图时可以按这个检查模块关键连接注意点电源VDD×3接3.3VVDDA接3.3VVBAT接3.3V每脚一颗0.1μFVDDA与VDD压差0.3V地VSS×3接GNDVSSA接GNDAGND与DGND单点连用0Ω或磁珠隔离时钟OSC_IN/OUT接8MHz晶振两22pF电容到地晶振靠芯片下方不走线复位NRST上拉10kΩ到3.3V按键到地并0.1μF上拉不能省启动BOOT0下拉10kΩ到地BOOT1默认下拉不浮空调试SWDIO/SWCLK各上拉10kΩ引出4针接口走线远离功率器件这就是一块能独立工作的MCU核心板最小电路了加上LDO稳压电源从外部供电比如USB 5V经过AMS1117-3.3变成3.3V板子就能跑。但LDO选型和外围电容配置这里先不展开我会在电源电路章节详细说。八、常见翻车点总结我把自己和身边朋友在设计最小系统时踩过的坑归纳成一张表建议你每次画完原理图对着自查一遍翻车点现象原因预防VDD去耦电容离芯片太远高频运行不稳定死机瞬时电流供不上电容紧贴引脚VDDA没接或接错电压ADC读数完全不准漂移大模拟部分供电异常VDDAVDD3.3V晶振电容选错或不匹配起振困难串口乱码负载电容与晶振不匹配按公式算留余量BOOT0悬空芯片随机进ISP模式不跑程序悬空电平不确定必须下拉或跳线NRST没上拉上电不启动或随机复位内部弱上拉扛不住干扰外部加10kΩ上拉SWD引脚被占用能烧程序但无法调试代码启动后把SWD复用了非必须别占用PA13/PA14或加启动延时VBAT没接RTC不工作备份域丢失备份域没供电VBATVDD模拟地数字地没分ADC噪声大跳得厉害数字噪声串入模拟区单点接地晶振下方走信号线时钟抖动通信出错晶振信号耦合到其他走线晶振下方禁走线晶振离MCU太远不起振或频率漂移寄生电容过大紧靠芯片放置九、本章总结这一章咱们把MCU最小系统的五脏六腑都拆解了一遍供电、时钟、复位、启动配置、下载口每根线为什么这么接不这么接会有什么后果都讲清楚了。这五样东西是所有嵌入式板卡的共同骨架以后再画任何一款MCU的板子万变不离其宗。

更多文章