首页 / 资讯中心 / 文章详情

STM32F407ZGT6最小系统设计指南:电源、时钟与调试

STM32F407ZGT6最小系统设计指南:电源、时钟与调试 ★ FEATURED ARTICLE
简介STM32F407ZGT6最小系统完整设计资料包面向嵌入式初学者、电子竞赛队伍和需要快速搭建STM32F4平台的开发者。板卡已经过实际测试原理图与PCB设计均可直接参考。最小系统核心模块齐全包括电源管理、复位电路、晶振与时钟、SWD调试口、GPIO引出以及必要的保护电路适合用来学习Cortex-M4最小系统构成或作为项目改版底稿。压缩包采用ZIP格式共58个文件整体大小约4.3MB。内部除SchDoc原理图和PcbDoc PCB文件外还包含大量lib与intlib元件库、pcblib与schlib库文件方便在Altium Designer等工具中编辑维护另配9个PDF说明文档和一份物料清单Excel文件能辅助核对元件、理解布局思路并支持后续打板生产。目前已有2503人学习/下载。若想少走弯路直接获得一块经过验证的最小系统板这套包含原理图、PCB、库文件与BOM的打包资料可以帮你省去从零画板的踩坑时间并加深对STM32F407ZGT6外围电路的理解。1. STM32F407ZGT6最小系统在解决什么问题一块能跑协议栈的“地基”长什么样STM32F407ZGT6最小系统说白了就是把这颗144引脚、1MB Flash、192KB RAM的Cortex-M4芯片用最少的电路让它“活过来”上电、复位、时钟、下载调试四件事齐了剩下的管脚全留给开发者自由发挥。很多人买了芯片自己画板结果要么上电发烫要么调试器连不上问题往往不在软件而在最小系统这层地基没打牢。这篇文章不聊开发板聊的是一张空白PCB上从零搭出一套能稳定跑168MHz主频、能被调试器反复烧录的最小系统——适合想自己画核心板、做产品原型、或者第一次接触F407的同学照着抄作业。2. 电源与去耦设计先把3.3V喂稳才能谈正常上电2.1 最小系统的电源引脚到底要喂几路VDD、VDDA、VBAT与VREFF407ZGT6不像普通单片机那样只有一个电源输入。包装上写着3.3V供电实际上板子上要处理的电源引脚至少有四类数字主供电VDD、模拟供电VDDA、备份供电VBAT、以及参考电压VREF。很多人第一次画板只接了VDD就上电结果芯片不跑或者ADC读数漂得离谱回头看就是VDDA和VREF没接对。VDD是芯片的主供电F407ZGT6一共有多组VDD引脚PCB上必须全部连通到3.3V一组都不能悬空。每组VDD旁边都要配至少一颗0.1uF的陶瓷去耦电容电容要放在引脚附近走线越短越好这是整个最小系统里最容易被忽视但最要命的一步。VDDA是模拟电路供电不能直接跟VDD共用一根细线常见做法是在VDD和VDDA之间串一颗10R电阻或磁珠再在VDDA引脚就近放一颗4.7uF和一颗0.1uF电容到地。VREF接VDDAVREF-接地。ADC的满量程就是VREF的电压如果VREF悬浮ADC结果就是废的。VBAT是备份域供电如果不用RTC和备份寄存器直接接3.3V即可如果打算用纽扣电池做低功耗备份VBAT接电池正极同时注意VDD掉电后芯片仍能维持RTC走时。最小系统的电源设计说复杂不复杂但每一路都有存在理由省任何一路都会在后面的调试里加倍还回来。2.2 器件选型与去耦电容摆放从一颗LDO到一个完整电源树最小系统的供电入口常见方案是用USB的5V经过一颗LDO降到3.3V典型器件就是AMS1117-3.3这类三端稳压器。选型理由很简单外围元件少只要输入输出各加电容就能工作电流余量足够F407满载运行价格也便宜。缺点是不适合电池供电场景静态功耗偏高但对“先把系统跑起来”这个目标来说它是最不容易翻车的选择。器件型号/规格数量作用LDOAMS1117-3.3或同类型3.3V固定输出15V转3.3V最大输出1A输入电容10uF电解 0.1uF陶瓷各1LDO输入滤波输出电容10uF电解 0.1uF陶瓷各1LDO输出稳压与瞬态响应去耦电容0.1uF陶瓷0402/0603每组VDD至少1颗抑制高频噪声模拟滤波10R电阻或磁珠 4.7uF 0.1uF1套VDDA隔离与滤波我常用的做法是用万用板先验证电源网络再画PCB。上电之前先用万用表量VDD和GND之间的电阻正常应该在几十欧姆以上如果直接量出个位数欧姆先别上电大概率哪里的电容焊反或短路了。上电后量LDO输出3.3V纹波控制在几十毫伏内这个电源才能喂给芯片。摆放的时候注意去耦电容的“就近原则”电容和引脚之间的走线超过5mm高频去耦效果就打折扣这属于物理规律不是玄学。VCAP引脚要单独提一句F407上有两个VCAP引脚需要各接一颗2.2uF陶瓷电容到地电容要靠近引脚放置这是内部稳压器的输出接错或漏接会导致芯片上电后无法启动或工作不稳定。2.3 上电时序与电流检查上电之前先量电阻上电之后先看电流最小系统上电不是把电插上就完事。我经手过的板子里最常见的上电事故是芯片某个引脚对地短路一上电LDO进入过流保护输出电压被拉低到2V左右芯片根本起不来。所以养成的习惯是上电前用万用表二极管档量3.3V对地压降正常应该在0.3V以上如果量出来几乎为零先排查焊接短路尤其是LQFP144这种密脚封装相邻引脚连锡是家常便饭。上电后的第一检查项不是看代码跑没跑而是看电流。用万用表串在5V输入端一个空载最小系统只跑了GPIO翻转这类简单代码的电流大概在几十毫安量级如果上电瞬间电流飙到几百毫安甚至更大基本可以断定有引脚短路、芯片焊接方向错了或者VCAP电容漏接。发现异常第一时间断电不要反复上电尝试很多芯片就是这么试烧的。# 用万用表测电流的操作顺序经验步骤 1. 万用表打到200mA档表笔串联在5V电源正极与板子5V输入之间 2. 板子保持断电状态然后接通电源看电流读数 3. 读数稳定后观察3秒正常几十mA异常大于200mA立即断电 4. 排查顺序VCAP电容 - 所有VDD去耦电容 - 芯片方向 - 相邻引脚连锡这一步没人会写进芯片手册里但实测比任何调试器都先发现问题。电源网络是整个最小系统的地基先把这一层搞扎实后面的时钟配置和调试连接才有意义。3. 时钟系统配置外部晶振、PLL参数与初始化代码3.1 为什么最小系统多数选外部晶振而不是内部RCF407内部有16MHz的HSI振荡器理论上不接外部晶振也能跑芯片上电后的默认启动时钟就是HSI。但在实际工程里几乎所有最小系统都会加一颗外部晶振做HSE原因有几个。第一是精度内部RC的精度在全温度范围内大概在1%到2%量级对USART通信、定时器精确定时来说不够用波特率算出来会有明显偏差时间一长就乱码第二是USB外设需要精确的48MHz时钟内部RC无法满足USB规范要求的精度第三是PLL的参考源用HSE抖动特性比HSI好跑168MHz主频时更稳定。HSE晶振的频率选择有讲究最常见的是8MHz和25MHz两种。8MHz是很多入门教程默认值因为HSE的值正好可以整除PLL的乘法因子配置简单25MHz在以太网和某些音频应用里更方便因为25MHz可以直接作为以太网PHY的参考时钟。无论选哪个PCB上晶振的两根走线要尽量短两个负载电容典型值10pF到22pF具体看晶振规格书分别接地晶振下方不要走其他信号线能铺地铜就用地铜隔离。选30pF负载电容还是20pF不能拍脑袋。晶振规格书里会标CL值匹配的负载电容大约是CL值的两倍还要扣除引脚寄生电容比如CL12pF的晶振配20pF左右的电容比较合适。有些人直接在别人的原理图上抄了个“22pF”用结果系统跑起来USART乱码最后示波器一量晶振波形幅度不足换掉电容就好了。3.2 用STM32CubeMX布置时钟树并生成初始化代码手动写RCC寄存器配置不是不行但容易漏掉Flash等待周期和总线分频导致系统时钟配完了但跑起来不稳定。常见做法是用STM32CubeMX先生成时钟树再在生成的代码基础上改业务逻辑。CubeMX里只要选好芯片型号输入HSE晶振频率把SYSCLK拖到168MHz它会自动算好PLL的M、N、P、Q参数并生成SystemClock_Config函数。// 由STM32CubeMX生成的SystemClock_Config8MHz HSE输入主频168MHz void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 1. 配置HSE外部晶振和PLL参数 RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue RCC_HSE_PREDIV_DIV1; // HSE不分频 RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; // PLL输入选HSE RCC_OscInitStruct.PLL.PLLM 8; // 8MHz / 8 1MHz RCC_OscInitStruct.PLL.PLLN 336; // 1MHz * 336 336MHz(VCO) RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2; // 336MHz / 2 168MHz RCC_OscInitStruct.PLL.PLLQ 7; // 336MHz / 7 48MHz(USB用) if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK) { Error_Handler(); } // 2. 配置系统时钟源和总线分频 RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟选PLL输出 RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; // HCLK 168MHz RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV4; // APB1 42MHz RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV2; // APB2 84MHz if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_5) ! HAL_OK) { Error_Handler(); } }这段代码的逻辑和执行顺序很重要先配置PLL再切换系统时钟源最后设置Flash等待周期。PLL里的四个参数是联动关系——PLLM把HSE分频到1MHz到2MHz之间的PLL输入PLLN把PLL输入倍频到VCO频率PLLP把VCO分频得到系统时钟PLLQ分频得到USB时钟。如果换用25MHz晶振PLLM就改成25PLLN和PLLP不变照样得到168MHz。Flash等待周期为什么必须配成5因为168MHz已经是极限值F407在168MHz下需要5个等待周期才能保证Flash读取不出错。如果这个值配小了程序会偶发性地跑飞而且不好复现属于那种“看起来一整晚没问题第二天跑着跑着就死机”的慢性病。3.3 把168MHz主频跑起来后先检查这几个时钟寄存器时钟配置写完后不要急着写业务代码先确认系统时钟真的切到了168MHz。判断方法有两个一个是用调试器读RCC_CFGR寄存器的SW位和HPRE位确认系统时钟源是PLL、AHB分频是1另一个更直观的方法是把MCO引脚复用成时钟输出把系统时钟分频后输出到引脚上用示波器或频率计直接量。// 用MCO1输出HSE验证外部晶振是否起振接PA8示波器看频率 void MCO1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_MCO1_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_8; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); // MCO1输出HSE不分频 HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); }如果MCO1引脚量不出频率说明HSE没起振这通常是晶振负载电容不匹配、晶振引脚虚焊或者晶振两个脚之间走线过长引入寄生电容导致的。如果量出的频率不是晶振标称值比如8MHz晶振量出了8.1MHz说明负载电容偏大微调后能接近标称值。这一步做好了后面所有串口、定时器、USB的精度问题就不会再回头找上门。4. 复位、BOOT引脚与SWD调试让最小系统第一次烧录就成功的落地配置4.1 复位电路与NRST上电复位加手动复位F407的复位电路在最小系统里非常简洁NRST引脚接一颗10k电阻上拉到3.3V再接一颗0.1uF电容到地形成经典的RC复位电路。上电瞬间电容充电NRST维持一段时间的低电平等电容充满后NRST被上拉到高电平芯片开始执行启动流程。这个复位时间由RC时间常数决定10k乘以0.1uF是1毫秒量级对F407来说足够完成可靠的电源复位。有人问要不要加复位按键我的建议是最小系统板上留一个两针的复位排针或者直接加一颗轻触按键。调试过程中“按住复位再点下载”“复位后观察启动波形”都是高频操作没有物理复位入口每次都要拔电重来效率很低。如果系统对复位可靠性有更严要求比如需要监控电压跌落可以用外部看门狗芯片比如常见的电压监控器件在最小系统阶段没必要10k加104电容就够了。一个容易踩的小细节NRST引脚本身在芯片内部有上拉外部这个10k不是必须的但加上它能让复位释放沿更干净抗干扰能力更好。电容值不要乱加大有些人觉得复位不稳定就加大电容到1uF结果复位释放时间拖到几十毫秒反而导致上电过程中芯片状态不确定。4.2 BOOT0与BOOT1三种启动模式的选择与应用场景F407的BOOT配置是理解最小系统启动流程的关键。BOOT0是个独立引脚BOOT1并不是独立引脚它复用为PB2在启动时被采样为BOOT1的电平。所以最小系统上要处理的其实是BOOT0的电平状态以及PB2引脚在启动瞬间不要被外部强拉成不确定电平。BOOT0BOOT1PB2启动区域典型用途0任意主Flash正常运行用户程序10系统存储器启动内置Bootloader串口/USB下载11内置SRAM调试RAM中的代码一般不用最小系统板上我通常把BOOT0接一个10k下拉电阻默认从主Flash启动这是最常用的状态。再在BOOT0上留一个跳线或焊盘可以通过跳线帽强制拉高。为什么要留因为当用户程序把SWD引脚复用成普通GPIO导致调试器连不上时把BOOT0拉高进系统存储器启动内置Bootloader就能用串口把Flash擦掉救回一块看起来已经变砖的芯片。这道“后悔药”只值一个跳线但值得每个最小系统都留。PB2在启动时被采样为BOOT1但正常运行时它是个普通GPIO。设计上要注意PB2不要接大电容等会拖慢电平变化的器件否则启动时采样到的BOOT1可能是一个不确定的中间电平虽然BOOT00时BOOT1是“任意”但不稳定的电平终究是隐患。4.3 SWD四线接法与最小下载命令下载调试接口F407支持JTAG和SWD最小系统只需要留SWDSWDIO、SWCLK、GND三根线是必需的我习惯再加一根3.3V给调试器做电平参考共四根。SWDIO和SWCLK各接一颗10k电阻SWDIO上拉到3.3V、SWCLK下拉到地这个上下拉不是芯片要求但能明显改善下载稳定性和抗干扰能力尤其当连接线比较长的时候。# 用OpenOCD 常见SWD调试器烧录最小系统适用于STM32F4全系列 # 配置接口文件interface/stlink.cfg 对应常见调试器target/stm32f4x.cfg 对应F4目标 openocd -f interface/stlink.cfg -f target/stm32f4x.cfg \ -c init \ -c reset init \ -c flash write_image erase firmware.elf \ -c reset run \ -c exit # 或者用更轻量的st-flash工具直接烧bin文件到0x08000000 st-flash --reset write firmware.bin 0x08000000这里有个值得注意的参数0x08000000是F407主Flash的起始地址也就是BOOT00时启动代码的位置。烧录前芯片内部已有内容或者烧录地址不对程序不可能跑起来。OpenOCD的flash write_image erase会先全片擦除再写入适合第一次烧录st-flash工具则不依赖图形界面脚本化集成到CI里也很方便。SWD连接失败时不要急着加长线或换调试器先确认目标板上SWDIO、SWCLK和GND之间的对地电阻特别是SWCLK如果悬空调试器可能反复连接失败表现为“Could not connect”或者“Cannot access target”。把SWCLK下拉电阻加上重新上电再试八成能解决。4.4 最小固件点亮一颗LED并确认系统时钟最小系统的第一个固件我建议就只做一件事初始化一个GPIO点亮LED再加一个延时让LED闪烁。这样做的意义在于它能一次性验证电源、时钟、复位、下载链路这四个最小系统的核心环节是否全部OK任何一个环节有问题LED都不会按预期闪烁。// main.c 最小系统点灯程序骨架基于HAL库GPIO引脚接LED到GND #include main.h void SystemClock_Config(void); // 第3章已给出实现 static void MX_GPIO_Init(void); int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 配置系统时钟168MHz MX_GPIO_Init(); // 配置LED引脚为输出 while (1) { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); // 低电平点亮 HAL_Delay(200); // 延时200msHAL_Delay基于Systick HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); // 高电平熄灭 HAL_Delay(200); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOG_CLK_ENABLE(); // 使能G端口时钟 GPIO_InitStruct.Pin GPIO_PIN_13; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, GPIO_InitStruct); }HAL_Init()这一行虽然表面只调了一个函数实际上做了三件很重要的事设置Flash预取缓冲、配置SysTick为1ms中断、初始化向量表和异常处理。所以HAL_Delay(200)才能工作它是靠SysTick中断累计计数的。如果HAL_Init被漏掉程序要么卡死要么延时完全失效。点灯通过之后这个最小系统就算基本跑通了。但“能跑”和“稳定”之间还隔着好几个常见的坑下面这章把这些坑一个一个摊开讲。5. 最小系统避坑指南5个从“能跑”到“稳定”的实操排查记录5.1 现象上电后芯片明显发烫3.3V被拉低到2V出头芯片发烫是最小系统里最惊悚的事。第一次上电手摸芯片感到烫手马上断电。原因几乎都是短路相邻引脚连锡、VDD和GND接反、芯片方向焊反、或者某个引脚对地直接短路。F407ZGT6是LQFP144封装引脚间距只有0.5mm手工焊接时连锡概率很大而且视觉上不容易发现。解决的办法是分两步先用高倍放大镜顺着每排引脚检查有没有锡桥特别是电源引脚密集区域再用万用表二极管档量3.3V对地压降正常值在0.3V到0.5V之间如果量出来接近0说明还有短路点。用助焊剂加拖焊重新处理一次引脚洗干净后复测通常就能找到问题。切忌在短路状态下反复上电芯片内部会积累损伤即使后来短路排除了也可能留下不稳定隐患。5.2 现象第一次能烧录第二次调试器就连接不上这个问题的典型特征是第一块板子烧录成功代码也跑起来了然后你在代码里初始化了GPIO重新编译下载调试器就再也连不上目标芯片了。原因大概率是你复用的GPIO恰好是SWD的两个引脚也就是PA13SWDIO和PA14SWCLK程序一运行就把它们配成了普通输出调试口立刻被占用调试器自然无法通信。解决的办法有三个按优先级排列。最简单的是按住复位键不放在复位期间程序暂停执行、调试口恢复这时点下载在连接成功后瞬间释放复位键成功率很高。第二个办法是把BOOT0拉高让芯片从系统存储器启动启动代码不会碰SWD引脚再用调试器或串口擦除Flash。第三个是治本在固件里不要初始化PA13和PA14或者初始化后立即重新配置成复用SWD功能。我一般会在调试阶段专门留一个宏开关正式版里再关闭SWD引脚功能。5.3 现象USART上电后输出乱码最小系统第一次跑串口打印出来全是乱码这个现象很常见而且大概率不是串口配置的锅而是时钟配置的问题。比如你用的晶振是8MHz但代码里的PLLM配置是按25MHz算的实际系统时钟就不是168MHz而是另一个完全不同的值。串口波特率的计算基于系统时钟时钟偏了波特率就偏了表现出来就是乱码。排查顺序是先确认HSE实际起振频率用示波器量晶振引脚或MCO输出再确认RCC_CFGR里的SW位是不是已经在PLL上最后用调试器在串口初始化处打断点读USART的BRR寄存器算一下波特率跟预期值对比。三个环节里任何一个偏了都会乱码。很多时候换了一颗晶振就能解决的问题别在代码里折腾一整天。5.4 现象按下复位键能运行松手后反复重启这个现象很值得警惕程序按复位能跑、松手就重启或者偶尔能跑几秒又复位。原因多半是复位释放瞬间电源还没有完全稳定。LDO输出端的电容配置不合理上电时VDD爬坡太慢复位信号已经释放但芯片内部POR电压还没到阈值就会反复触发复位。解决的方法是查两处一处是LDO输出电容10uF加0.1uF的搭配是否合理如果输出电容过大导致3.3V建立时间过长会放大这个问题另一处是NRST的RC参数10k加0.1uF的时间常数是1ms如果觉得复位时序不可靠可以在复位电路里加一颗二极管让电容放电回路走二极管、充电回路走电阻释放沿更干脆。还有一个小概率原因是VCAP电容的问题VCAP外接的2.2uF电容如果位置离引脚太远或容值偏差太大内部稳压器输出不稳也会造成启动反复。5.5 现象ADC采样波动大读数随负载变化明显最小系统跑ADC发现采样值跳来跳去接上电机或继电器后读数变化更明显。这个问题基本是模拟供电和参考电压没处理好。VDDA直接和VDD用一根细线连过去、VREF没单独滤波、或者PCB上模拟地和数字地混在一起都会让ADC结果掺入大量噪声。处理方法是把模拟供电和数字供电在电路上分开VDD经过一颗10R电阻或磁珠后进VDDAVDDA引脚处放4.7uF和0.1uF电容到模拟地VREF从VDDA取电并再加0.1uF电容。模拟地和数字地在PCB上单点连接通常选在电源入口处。如果是两层板至少保证模拟区域的地平面不被信号走线切断。这一套做完ADC的跳动幅度通常会有明显改善。6. 别止步于“能跑”最小系统的两个进阶验证习惯6.1 上电后补做三项测试静态电流、复位波形、VCAP电压LED一闪一闪不代表最小系统合格。我自己的习惯是在点灯通过后再花半小时做三项测试每项都不复杂但能提前暴露很多“之后再坏”的问题。第一项是串万用表测静态电流空载跑一个while(1)空循环记录电流值之后再跑点灯或串口收发电流应该有规律变化如果某个外设打开后电流异常暴增这个外设的接线或初始化很可能有问题。第二项是示波器量NRST的上电波形观察复位释放沿是不是单调快速上升如果释放沿有毛刺或平台期复位电路需要加固。第三项是量VCAP引脚电压正常应该在1.2V左右量不到或明显偏低检查2.2uF电容的位置和焊接。6.2 从最小系统到可交付板卡给“下一版”留好余地如果你确定要用这个最小系统做产品原型第一版PCB上我会建议多留三样东西BOOT0跳线、SWD四针座、以及一组备用去耦电容焊盘。前两者之前都说过是救砖和调试的生命线备用去耦电容焊盘是为了在实测发现某路电源高频噪声偏大时能直接补一颗电容而不用改版。另一个被很多人忽视的点是在PCB上给晶振区域的地平面留出完整空间不要为了布线方便在晶振正下方穿信号线这对时钟稳定性和EMC都有帮助。我最早自己焊最小系统时曾因为漏接VCAP电容连续三块板子都出现“能下载但跑不起来”的问题最后是拿示波器对比了正常板子和异常板子的VCAP电压才发现问题。从那以后每块板子上电必量VCAP成了改不掉的习惯。最小系统这个东西电路结构永远比代码简单但越简单的东西越考验细节——去耦电容的位置、上下拉电阻的值、复位电路的时序每一处都是手册里不会专门警告、但实测会给你颜色看的地方。把这几个习惯沉淀成自己的固定流程以后画F407的最小系统就是一次成功不用靠运气。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站