第1篇:《面试题:画一个STM32最小系统电路,每个元件的作用》
大家好我是老张。参加工作一二十年了面试过几十个嵌入式工程师校招社招都有。有一道题我几乎每次都问但能完整答上来的人不超过两成。这道题就是“请在白板上画一个STM32最小系统电路并说明每个外围元件的作用。”很多候选人一听就放松了觉得这是送分题。拿起笔画了个芯片画了个晶振画了几个电容然后就开始卡壳——复位电路怎么接来着BOOT0到底要上拉还是下拉VDDA和VDD能接一起吗更致命的是当我追问“如果去掉这个元件会怎样”的时候大部分人就答不上来了。而这道题的考点恰恰就在这些追问里。今天这篇文章我就按面试官的思维把这道题拆解清楚。看完你不仅能画出一个标准的最小系统还能应对面试官的所有追问。目录一、面试官为什么爱问这道题二、最小系统的五大部分三、供电电路3.1 怎么画3.2 为什么这样接3.3 追问“如果去掉某个去耦电容会怎样”四、时钟电路4.1 怎么画4.2 为什么这样接4.3 追问“如果晶振电容焊错了会怎样”五、复位电路5.1 怎么画5.2 为什么这样接5.3 追问“如果NRST悬空会怎样”六、启动配置6.1 怎么画6.2 为什么这样接6.3 追问“如果你设计的产品不让用户按按键进ISPBOOT0还需要下拉吗”七、下载调试口7.1 怎么画7.2 为什么这样接7.3 追问“如果你的产品IO口不够用能把SWD的两个脚复用为GPIO吗”八、面试满分回答模板九、总结一、面试官为什么爱问这道题因为这道题能一次性考察三个层次的能力第一层你有没有实际画过板子如果只是看过原理图但没动手画过你大概知道要接晶振和复位但具体电容选多大、电阻选多大、为什么要这样选你就模糊了。第二层你理不理解每个元件“为什么存在”晶振旁边为什么有两个电容NRST为什么需要上拉电阻BOOT0为什么不能悬空这些问题考的不是记忆力是你对芯片内部电路的理解。第三层你有没有踩过坑如果你自己画过板子、调过板子、修过板子你一定经历过“去掉某个元件会怎样”的现场。面试官追问这些就是在判断你的实战深度。二、最小系统的五大部分一个STM32F103C8T6的最小系统总共就五部分。我在白板上也是按这个顺序画供电电路时钟电路复位电路启动配置下载调试口下面逐一拆解每个元件都讲清楚“是什么”、“为什么”、“去掉会怎样”。三、供电电路3.1 怎么画芯片周围先画出以下电源引脚VDD × 3数字核心和IO供电全部接3.3VVDDA × 1模拟部分供电接3.3VVSS × 3数字地全部接GNDVSSA × 1模拟地接GNDVBAT × 1备份域供电接3.3V每个VDD和VDDA引脚旁边紧贴引脚放一颗0.1μF的陶瓷去耦电容到地。VDDA脚额外再并一颗10μF钽电容或陶瓷电容做低频滤波。模拟地和数字地在芯片下方用一个0Ω电阻或磁珠单点连接理论要隔离简单的电路可以直接接一块。3.2 为什么这样接去耦电容为什么是0.1μF芯片内部晶体管高速开关时会对电源产生瞬时电流需求。电源走线有寄生电感来不及响应。这颗0.1μF的小电容紧贴引脚放置相当于给芯片配了一个贴身蓄水池瞬态电流直接从这里取不需要走远路。0.1μF是陶瓷电容的常用值对几十MHz的高频噪声滤波效果好。再配合一颗10μF的大电容处理低频波动大小互补。VDDA和VDD为什么要接同一个电压数据手册规定VDDA和VDD的压差不能超过0.3V。内部模拟电路和数字电路是协同工作的如果VDDA电压偏离VDD太多内部逻辑电平会混乱。而且VDDA同时给内部PLL和复位电路供电VDDA不正常芯片连启动都启动不了。VBAT为什么不能悬空VBAT不仅给RTC供电还给备份域寄存器供电。即使你不用RTCVBAT悬空可能导致上电时备份域状态不确定芯片无法正常复位。不用后备电池的话直接接VDD。模拟地和数字地为什么要单点连接数字区开关噪声会在地平面上产生压差。如果模拟地和数字地到处连通数字噪声会串进模拟区ADC读数就不干净。单点连接相当于只开一个门数字噪声被限制在数字区域模拟地保持安静。3.3 追问“如果去掉某个去耦电容会怎样”去掉某个VDD的去耦电容芯片在低频轻载时可能看不出问题。但一旦高频运行或者负载突变电源轨上会出现电压跌落和振铃。表现就是程序偶尔跑飞、MCU无故复位、ADC读数偏移。问题在于这种故障是偶发的极难复现定位。追问到这一层你就得说明白“去耦电容解决的是瞬时电流响应问题”而不是笼统地说“滤波”。四、时钟电路4.1 怎么画一个8MHz无源晶振跨接在OSC_IN和OSC_OUT引脚之间。晶振两端各对地接一颗负载电容容值通常20~22pF。如果项目需要RTC日历功能再加一个32.768kHz晶振接在OSC32_IN和OSC32_OUT之间匹配电容通常6pF~15pFMCU内部的时钟精度不够商用的电路板都是外置的时钟芯片。Layout时晶振和电容必须紧靠MCU引脚晶振下方不走任何信号线。4.2 为什么这样接为什么是8MHzSTM32内部有PLL8MHz晶振经PLL倍频后可以产生72MHz系统时钟。8MHz是无源晶振最常见的标准频率之一性价比最高。两个电容是干什么的无源晶振本身是一个压电谐振器它需要外部电容配合才能振荡在标称频率上。这两个电容和晶振的负载电容CL有关公式是C ≈ 2×(CL - Cs)Cs是PCB走线和引脚的寄生电容一般估算3~5pF。所以如果晶振CL20pFC≈2×(20-5)30pF选标称值27pF或33pF都行。容值偏大会导致频率偏低甚至不起振容值偏小会导致频率偏高。为什么不能省掉晶振用内部RCSTM32内部RC振荡器精度只有1%左右温漂也大。做串口通信需要误差小于2%~3%内部RC勉强能用但风险高做USB和CAN需要误差小于0.25%内部RC绝对不行。所以只要产品用到了通信接口就老老实实上外部晶振。晶振下方为什么不能走信号线晶振是高频振荡源其引脚和走线会向外辐射电磁场。如果下面走信号线振荡信号会耦合过去造成串扰。反过来外部信号也会干扰晶振导致频率抖动。4.3 追问“如果晶振电容焊错了会怎样”最常见的是焊成了22pF但晶振要求的CL是12.5pF。实际需要的电容应该是2×(12.5-5)15pF焊成22pF后频率会偏慢。表现就是串口通信偶尔乱码通信对象不同步示波器看时钟波形幅度偏低。如果你在面试时能说出“起振边界”和“频率牵引”这两个概念面试官会另眼相看。还可以补充用示波器探头测晶振引脚时探头本身的10pF~20pF输入电容并联上去可能会让本来勉强起振的晶振停振或者让本来停振的晶振突然起振这会误导排查方向。有经验的工程师会先在OSC_OUT端看一眼波形如果峰峰值正常就说明起振了。五、复位电路5.1 怎么画NRST引脚接一个10kΩ上拉电阻到3.3V再并一个按键到地。NRST对地并一颗0.1μF电容滤除毛刺。5.2 为什么这样接为什么需要外部上拉芯片内部不是有上拉吗STM32的NRST引脚内部有一个约40kΩ的弱上拉。但在电源上电缓慢或有电磁干扰的环境中这个弱上拉可能扛不住NRST长时间处于不确定电平导致MCU无法正常启动。外部10kΩ上拉是一个强确定确保正常工作状态下NRST稳定为高。为什么要并一颗电容到地电源上电瞬间可能有毛刺如果毛刺打到NRST上拉低超过一定时间芯片就会误复位。0.1μF电容和10kΩ上拉构成一个低通滤波器把窄脉冲滤掉。同时这颗电容和上拉电阻也形成一个RC延时让复位信号缓慢上升避免快速边沿耦合噪声。为什么选择10kΩ小了费电3.3V/1kΩ3.3mA大了抗干扰能力弱和PCB寄生电容形成更大的RC常数。10kΩ是嵌入式系统上下拉电阻的经验值兼顾功耗和抗干扰。5.3 追问“如果NRST悬空会怎样”大多数时候芯片能工作但会出现“随机复位”——设备运行得好好的突然重启毫无规律。排查这种问题能让人崩溃因为软件日志看不出任何异常。用示波器抓NRST引脚才能看到偶尔被干扰拉低的毛刺。所以面试时说出“上拉电阻不能省”只是及格说出“内部弱上拉扛不住电磁干扰”才是加分。六、启动配置6.1 怎么画BOOT0通过一个10kΩ下拉电阻接地。BOOT1内部默认下拉一般不需要额外处理常规项目也用10KΩ下拉电阻接地即可。如果需要进串口ISP烧录可以用一个跳线帽或拨码开关把BOOT0切换到高电平。6.2 为什么这样接BOOT0为什么必须下拉STM32上电时会采样BOOT0和BOOT1的电平决定从哪个存储器启动。BOOT00时从用户Flash启动正常运行模式BOOT01时从系统存储器启动出厂Bootloader用于串口烧录。如果BOOT0悬空电平不确定可能被干扰拉高进入ISP模式芯片不跑你的固件板子就像“变砖”了一样。BOOT1为什么可以不处理STM32F103里BOOT1和PB2复用上电时内部默认下拉。在从Flash启动模式下BOOT00BOOT1的状态不影响结果。所以一般不需要额外加上下拉直接当PB2用即可。下拉电阻为什么选10kΩ同理太小费电太大不可靠。6.3 追问“如果你设计的产品不让用户按按键进ISPBOOT0还需要下拉吗”需要。即使你的产品不进ISP上电瞬间BOOT0的电平依然会被采样。如果悬空强电磁干扰环境可能让它读到高电平导致偶发性不启动。外部下拉电阻确保每次上电都从Flash启动这是一个确定性的设计不能靠“芯片内部有下拉”这种说法糊弄过去。实际上ST官方手册明确要求BOOT引脚由外部电路提供确定电平。七、下载调试口7.1 怎么画引出SWD接口四根针SWDIO、SWCLK、GND、3.3V、NRST可选。这里面就有个小技巧了为什么3.3V和GND是挨着而不是放在SWDIO、SWCLK两边答案就是这是简单的插接件防呆。7.2 为什么这样接为什么用SWD而不是JTAGSWD只需要2根信号线SWDIO和SWCLKJTAG需要5根。省下的IO口可以当GPIO用。SWD调试功能并不比JTAG差除非你要用边界扫描这类高级功能否则SWD完全够用。SWDIO、SWCLK为什么需要上拉电阻在没有调试器连接时SWDIO和SWCLK引脚处于高阻状态。如果悬空电磁干扰可能触发芯片内部的调试逻辑导致芯片进入调试模式卡死。上拉电阻确保空闲时电平确定。NRST为什么要引到调试口可选调试器可以通过硬件复位目标芯片这在芯片进入低功耗模式或Flash被锁定时尤其重要。虽然用软件复位也行但硬件复位更可靠尤其是芯片跑飞了软件复位不管用的时候。7.3 追问“如果你的产品IO口不够用能把SWD的两个脚复用为GPIO吗”可以但要分情况说清楚。STM32的PA13SWDIO和PA14SWCLK在上电后默认是调试功能。如果你在代码里把它们改成了GPIO那以后调试器就连不上了。所以做开发阶段绝对不能占。量产阶段如果确实需要这两个IO可以这样做在main函数开头加一个1~2秒的延时再执行引脚复用。这样调试器在上电瞬间还有时间连接和烧录。但要注意一旦复用后芯片进入休眠或死锁调试器就彻底连不上了只能通过串口ISP擦除Flash恢复。八、面试满分回答模板如果面试官让你画最小系统按下面的逻辑一口气讲完基本就是满分第一步总体概述一个MCU最小系统包含五部分供电、时钟、复位、启动配置、下载口。第二步供电所有VDD和VDDA接3.3V每脚并0.1μF去耦电容。VDDA额外加10μF。VBAT接3.3V。模拟地和数字地单点连接。去耦电容紧贴引脚解决芯片瞬态电流需求。第三步时钟8MHz晶振加两个负载电容接OSC_IN/OUT容值按晶振负载电容计算。如果产品用到串口/CAN/USB必须外部晶振内部RC精度不够。晶振紧靠芯片下方不走线。第四步复位NRST上拉10kΩ到3.3V对地并0.1μF加按键可选。外部上拉不能省内部弱上拉扛不住干扰。第五步启动配置BOOT0下拉10kΩ到地确保从Flash启动。如果产品需要串口ISP留跳线帽。悬空是大忌。第六步调试口引出SWD四针SWDIO和SWCLK各上拉10kΩ。量产前不要占用这两个IO。第七步收尾实际设计中还会关注Layout尤其是晶振和去耦电容的摆放位置但原理图上这五部分齐全了。如果面试官追问“如果XXX会怎样”你就把我上面每个小节的追问分析讲出来。能说到这个深度的候选人硬件底子一定是扎实的。九、总结一道最小系统题能考出三个层次知道要接什么背过原理图的水平知道为什么这样接理解芯片内部电路的水平知道去掉会怎样自己画过板子踩过坑的水平大多数候选人停在第一层能到第二层的已经不多能到第三层的寥寥无几。面试官问这道题就是想找出那些真正动手做过硬件的人。下一篇预告《面试题LDO和DC-DC的区别我被追问“AMS1117用陶瓷电容会怎样”》我会把这个电源选型题的三个追问层次全部拆开告诉你面试官到底想听什么。有用的话收藏一下下次面试前翻出来对着白板练一遍。老张在评论区等你有面试题想问的直接留言。