ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32F103+FreeRTOS:芯片没反应?小心买到假芯片!

2026/9/6 8:42:17 拓冰建站 浏览量
STM32F103+FreeRTOS:芯片没反应?小心买到假芯片! 现象描述程序烧进去板子却跟砖头一样安静先说个我前阵子处理的真实案例。有个朋友寄来一块自家画的STM32F103C8T6最小系统板说代码在开发板上跑得好好的换到这块板子上就完全没反应——LED不闪、串口不打印、连个高电平都摸不出来。他反复检查了焊接、电源、Boot引脚甚至把标准库的启动文件换成了汇编版还是一样。我拿到板子第一件事不是接仿真器而是先看芯片表面丝印。这一看就发现了问题丝印的字体边缘有点发虚激光刻字的深浅也不均匀和手上另一批从正规代理拿货的芯片一对比明显不是同一种工艺。再用万用表量了一下芯片的VDD和GND没有短路供电也正常。这时候我心里已经有一半把握问题不在代码而在芯片本身。插上ST-Link尝试连接SWD扫描能识别到内核但读出来的Device ID是0x410这其实是STM32F103系列的ID没错。可当我尝试用标准库的HSE外部晶振配置跑起来时程序就是不动。后来换用HSI内部RC振荡器配置程序神奇地跑起来了。到这一步几乎可以确认这颗芯片的HSE起振电路有毛病或者说这颗芯片根本就是个“翻新货”。这个情况在嵌入式圈子里太常见了。STM32F103是出货量最大、资料最全、最被新手喜欢的芯片也是假货重灾区。很多人把“芯片没反应”归咎于自己代码写得不好或者在FreeRTOS移植上反复折腾结果问题根本不在软件层。这篇文章就把我判断“假芯片”的经验完整梳理一遍结合FreeRTOS移植过程中遇到的典型异常尽量帮大家少走弯路。烧录成功却跑不起来的排查顺序先硬件后软件很多人遇到“芯片没反应”就急着翻代码、查FreeRTOS配置这个思路可以理解但效率太低。芯片没反应是一个现象可能的原因有好几层从硬件到软件排下来大概是这样电源和地、复位电路、Boot引脚、晶振、下载器连接、芯片本身、启动文件、时钟配置、外设初始化、RTOS调度器启动。每一层都是下一层的前提跨过前面的问题直接查后面的代码大概率是在浪费时间。电源与复位最容易被忽略的第一道坎STM32F103的供电要求其实不复杂2.0V到3.6V绝大多数板子用3.3V。但“电压对”不等于“电源好”。我见过太多人用稳压芯片输出3.3V结果纹波大得离谱芯片一跑起来就复位。用示波器看3.3V上叠加了几百毫伏的纹波尤其是在电机驱动或者继电器动作的瞬间电压跌落直接触发BORBrown-Out Reset掉电复位表现出来就是程序跑飞、死机、或者根本无法启动。另一个容易被忽略的点是复位电路。STM32F103的NRST引脚内部有上拉电阻外部再接一个100nF电容到地就够了。但有些板子电容值选得过大比如10uF导致复位引脚的电平上升时间太长芯片一直处于复位状态表现出来就是“完全没反应”。还有一种情况是复位引脚被外部电路拉住比如接了调试器的NRST信号调试器不连接时悬空这时候芯片也可能被异常复位。Boot引脚也是重灾区。STM32F103的BOOT0和BOOT1决定启动来源BOOT00时从Flash启动这是正常模式BOOT01、BOOT10时从系统存储器启动也就是进入BootloaderBOOT01、BOOT11时从SRAM启动。很多人画板子的时候BOOT0没有加下拉电阻悬空状态下引脚电平不确定芯片就可能从错误的位置启动。更隐蔽的情况是BOOT0接了对地电容上电瞬间电平还没拉低芯片启动模式判断错误程序自然跑不起来。HSE晶振翻新片最容易出问题的部位晶振是判断芯片真假的试金石。正品STM32F103的HSE起振电路非常可靠外部配一个8MHz晶振加两个20pF负载电容基本是百分百起振。但翻新片不一样它内部的起振电路可能已经老化也可能根本不是原厂的晶振驱动电路加上外部晶振负载后起振很慢甚至完全不起振。怎么判断HSE有没有起振可以通过RCC_GetFlagStatus(RCC_FLAG_HSERDY)来检查HSE就绪标志如果一直等不到就绪说明HSE没起来。但这里有一个坑翻新片在外部晶振不起振时系统会自动切换到HSI继续运行所以你看到的现象不是“完全不跑”而是“跑了但外设时钟不对”——串口波特率错、定时器时间不对、PWM频率偏差这些看起来像代码问题的现象根源其实在晶振上。我处理过一块板子串口打印出来的字符全是乱码我一开始以为是波特率配置问题翻来覆去改分频系数结果毫无改善。后来用逻辑分析仪抓串口波形发现位宽明显不对按115200算出来的实际波特率大概只有标称值的一小半。这才想到去查HSE果然是外部晶振没起振系统用HSI运行但代码里的RCC_PLLConfig还在按8MHz外部晶振去配置PLL频率完全错乱了。所以遇到“芯片没反应”或者“外设表现异常”第一步就该确认HSE状态。最稳妥的方式是用HSI先跑一个LED闪烁程序如果HSI下程序正常而HSE下不正常硬件问题的概率就比较大了。FreeRTOS“卡死”与假芯片的关联为什么症状都集中在启动阶段FreeRTOS本身对硬件没有特殊要求在STM32F103上跑FreeRTOS不需要额外的外设资源也不依赖外部晶振。但为什么那么多FreeRTOS移植失败案例最后查出来是假芯片因为FreeRTOS的启动过程对系统时钟、内存、中断控制器有严格依赖假芯片在这些环节恰恰最容易出问题。症状一系统烧录后完全无反应调试器可以连上但无法全速运行用ST-Link连接芯片可以读取内核寄存器点击“Run”后程序却不执行PC指针停在0xFFFFFFFE或者复位向量附近。这时候排查方向有两个一是Flash烧写后校验不一致说明Flash本身有坏块二是芯片的调试接口SWD被复用成了GPIO但程序还没跑到那一步。如果是假芯片Flash坏块是很常见的问题。翻新片的前身是从旧设备上拆下来的经过打磨、重新印字Flash已经经历过大量擦写寿命接近耗尽。STM32F103的Flash寿命标称是10,000次擦写周期但翻新片的实际剩余寿命可能只有几百次甚至更少。你烧写一次程序可能就触及了坏块区域表现为烧录成功但校验失败或者烧录时显示成功运行时却跳出到HardFault。怎么验证用ST-Link的“Verify”功能对比烧写文件多做几次全片擦除和编程。如果三次擦写之后就出现校验不一致这颗芯片十有八九是翻新的。症状二FreeRTOS在启动后第一个任务就卡死代码烧录成功也进入了main函数但创建完第一个任务后调度器一启动就卡死调试器看到PC指针停在SVC_Handler或者PendSV_Handler里。这个问题既可能来自软件也可能来自硬件。软件层面FreeRTOS要求PendSV和SVC中断优先级必须设置为最低优先级且在FreeRTOS配置中使能这两个中断。如果NVIC的优先级分组配置不对或者中断优先级数值越界调度器一启动就会死循环。假芯片的问题在于内部NVIC的实现可能和原厂不一致或者中断控制器本身损坏导致优先级设置没有生效程序进入异常处理后再也出不来。还有一个非常隐蔽的问题翻新片的RAM可能存在坏区。FreeRTOS的任务栈是动态分配的如果你创建的任务栈碰巧落在RAM坏区写入的数据会丢失或者被篡改表现出来就是任务一启动就崩溃或者运行一段时间后随机死机。这种问题用调试器看代码看不出任何毛病因为没有逻辑层面的错误纯粹是物理层面的故障。症状三系统启动正常但运行一段时间后WatchDog复位FreeRTOS项目里很多人都会开IWDG独立看门狗来防止程序跑飞。正常情况下任务循环里喂狗是足够的。但如果芯片有问题比如内部LSE时钟不稳定或者Flash读取出错触发了总线错误程序会频繁进入异常而看门狗在异常状态下得不到喂狗系统就会不断复位。这种问题非常难排查因为看门狗复位后所有状态都清零了你甚至不知道系统是不是真的复位过。我有一次用DMA从外设搬运数据到内存程序在多任务运行下时不时卡死最后查出来是DMA访问的内存区间在物理上不可用——翻新片的SRAM容量实际上比标称少了一部分超出实际容量的地址访问直接触发了总线错误。而FreeRTOS的堆栈分配是连续的任务栈跨过了可用内存边界数据写到了不存在的地址上自然就崩了。遇到这种情况我建议先跑几分钟的纯裸机压力测试大量的Flash读写、SRAM读写、外设DMA搬移如果裸机下都会随机出问题那软件层面的优化和调试已经没有意义了。如何验证芯片真伪五种手段交叉确认买了假芯片不可怕可怕的是你已经把代码调了个遍才发现芯片有问题。我有几个手段可以比较快速地判断芯片是不是翻新货建议到手的新批次芯片都先做一遍。手段一读取芯片的电子签名看ID和容量是否匹配STM32F103全系列都有唯一的96位Device ID存放在0x1FFFF7E8开始的地址。通过读取这个区域可以看到芯片的Device ID、Die版本等信息。更重要的参数是Flash容量存放在0x1FFFF7E0地址C8T6的容量值应该是128即128KB。如果读出来显示64KB或者256KB说明芯片型号被重新标记过。我在市场上见过一种“C8T6”读出来的Flash容量是320KB——也就是说它其实是STM32F103ZET6的大容量芯片被磨掉重新刻上C8T6的丝印。这种芯片容量反而更大但不代表能用引脚定义、片上外设资源、电源引脚位置都不一样焊到C8T6的板子上很多引脚是悬空的外设跑起来自然不正常。手段二检查丝印字体、方向和位置正品STM32的丝印是激光刻字字体清晰锐利笔画均匀位置居中。翻新片重新打标时丝印往往是普通的喷墨打印字体边缘有毛刺笔画粗细不一或者位置偏移。有条件的话用放大镜或者手机微距镜头看一下一眼就能分辨。另外注意丝印的方向。STM32芯片的丝印方向表明确认了第一引脚的位置正品丝印方向和引脚1的位置有固定关系。翻新片的丝印是重新打的经常出现角度偏差或者和定位圆点不对应。我自己踩过坑一块板子上四颗“STM32F103C8T6”三颗丝印方向正常一颗和其他三颗呈180度反向——这种明显就是没有按照原厂标准打标的翻新货。手段三测量IDD电流对比参考值正常STM32F103在上电后、程序运行前的IDD电流大概在几毫安到十几毫安之间视具体型号和外设状态而定。翻新片因为内部电路老化或者存在漏电静态电流往往会明显偏高有的甚至能达到几十毫安。如果你的板子出奇地烫手或者电池掉电速度异常快芯片可能就是翻新的。比较靠谱的方式是找一颗已知的正品芯片在相同的电路、相同的程序下做电流对比。电流差异超过50%就该对芯片打上问号。我这里说的是同一片板子、同一个程序、更换芯片后的电流对比不是拿不同板子、不同外设配置去比那样没有参考价值。手段四做高温——低温循环测试观察稳定性正品芯片的工作温度范围是-40°C到85°C工业级在这范围内的稳定性是经过厂家验证的。翻新片经过拆焊、清洗、重新封装内部可能存在微裂纹或者焊点松动温度变化时会表现出随机故障。我自己的测试方法很土把板子放进冰箱冷冻室半小时拿出来马上通电跑压力测试看会不会出现死机、复位、读写出错。再用电吹风加热到六七十度同样跑一遍测试。如果低温或者高温下出现不稳定芯片的可靠性就值得怀疑。这种方法虽然不精确但作为筛选手段非常有效尤其是批量采购时抽出几片做温度测试基本能看出批次质量。手段五跑一个内存自检程序关于SRAM自检我补充一个细节翻新片的SRAM问题不一定出现在整个地址空间的最高位也可能出现在某个中间地址段导致你正常分配任务栈时看起来一切正常但某个特定任务一旦申请到这块内存就崩溃。所以我推荐的自检方式是把可用区域按1KB分块逐块写入、校验、擦除记录具体是哪一块出错这样能判断是颗粒缺陷还是地址线问题。如果出错区域集中在同一高位地址段往往是地址线焊接或者内部译码电路的问题如果随机分布在不同地址段更可能是存储单元本身的老化损坏。// 伪代码用于检测SRAM坏块 uint32_t *p; uint32_t pattern 0xA5A55A5A; uint16_t fail_count 0; for (addr SRAM_BEGIN; addr SRAM_END; addr 4) { p (uint32_t *)addr; *p pattern; if (*p ! pattern) fail_count; } if (fail_count 0) { // 这片芯片的SRAM存在问题不能用于正式产品 }这段程序扫描全部SRAM区域写入固定值再读回如果读回值和写入不一致说明该地址的存储单元有问题。STM32F103C8T6的SRAM是20KB起始地址0x20000000结束地址0x20004FFF。把这个测试放到FreeRTOS启动之前运行比在系统运行中出问题再定位要高效得多。识别翻新片的关键指标工艺特征与电气特性翻新片的来源无非几种旧芯片拆机、次品打磨重新打标、以低端型号冒充高端型号、国产替代码冒充意法半导体原装。不同来源的翻新片有不同的识别特征。引脚痕迹拆机片最明显的破绽拆机片是从旧板子上拆下来的引脚上一定有焊锡残留。哪怕经过清洗引脚表面也会留下发暗的氧化层或者不平整的焊点痕迹。正品芯片的引脚是出厂时镀锡的表面光亮、平整、颜色均匀。用镊子轻轻刮一下引脚表面正品不容易刮出痕迹拆机片的引脚容易掉色或者露出底层金属。这一条几乎可以筛选掉80%的翻新片因为拆机片的引脚痕迹很难完全处理干净。某些翻新工艺比较好的会重新镀锡但重新镀锡后的引脚通常比原厂的更厚看起来发白和原来的浅灰色有明显区别。有经验的人拿芯片在灯光下翻个角度就能看出来。封装的塑封体观察边缘和纹理正品芯片的塑封体是统一模具成型的边缘整齐四个角的R角圆角处理一致表面有细微的、均匀的纹理。翻新片如果经过打磨表面的纹理会被破坏看起来更光滑或者更粗糙和另一片正品放一起对比时差异明显。还有一个细节正品芯片顶面的丝印区域有一层特殊涂层用指甲轻轻划会有一定的涩感翻新片重新打标后往往没有这层处理表面的触感像直接印在塑封体上。电气特性GPIO输出能力、内部上拉电阻等翻新片因为内部晶体管老化驱动能力会下降。STM32F103的GPIO在推挽输出模式下灌电流和拉电流能力都是25mA左右注意这是极限值正常使用不建议超过10mA。翻新片可能在10mA负载下输出电压就已经降到2.5V以下了。简单测试GPIO设为推挽输出高电平接一个330欧姆电阻到地正常情况下输出电压应该接近VDD即3.3V左右。翻新片可能只能输出2.8V、2.5V甚至更低。用万用表就能测出来不需要示波器。当然这个测试要小心不要让GPIO持续工作在超过规格的电流下否则可能损坏引脚。内部上拉电阻也值得测。STM32F103的GPIO内部上拉电阻范围是20k到50k即使引脚悬空也能读到稳定的高电平前提是引脚没有外部下拉。翻新片因为内部MOS管老化上拉电阻可能漂移到100k以上引脚悬空时读数不高不低悬在中间。工作频率极限超频测试暴露真相STM32F103标称最高工作频率72MHz。因为工艺余量正品芯片在72MHz甚至80MHz下都能稳定运行。翻新片因为是老芯片工艺老化导致内部路径延迟增加在72MHz下就可能出现时序违规表现为随机崩溃、外设数据错误、Flash读取出错。超频测试不是官方手段但作为筛选工具很实用。把系统时钟配置到72MHz跑一段复杂的运算和DMA操作再把时钟降回8MHz跑相同的代码。如果72MHz下不稳定而8MHz下正常说明芯片的时序余量已经不满足标称频率的要求了。这种方法会加速老化不适合对需要长期使用的芯片做只适合抽检。采购建议与批量筛选经验谈说了这么多识别方法其实最有效的还是从源头控制找靠谱的采购渠道。我自己总结了一套比较实用的采购和验收流程从源头上筛掉大半的问题芯片。别贪便宜便宜没好货STM32F103C8T6的正常市场行情在不缺货的时候大概在几块钱到十几块钱一颗具体看渠道和数量。如果遇到市场价只有正常价格一半的货不用怀疑一定有问题。不是拆机片就是次品或者是国产替代芯片冒名顶替。芯片行业是典型的“一分价钱一分货”不要指望用摩托车的价格买到宝马。要求供应商提供原厂证明与批次信息正规的芯片代理商都会提供原厂的出货证明、批次号和溯源信息。如果供应商支支吾吾给不出来或者给的批次信息在ST官网上查不到这条渠道基本可以拉黑了。到货先抽检不要直接投产批量采购的芯片到手后我建议先抽10%做识别测试。优先做几件事第一肉眼观察引脚和丝印第二用编程器读取Flash容量和Device ID第三跑一段包含Flash擦写、SRAM读写、GPIO翻转的压力测试程序连续运行几个小时。抽检通过后再投产避免整批产品都出现问题后再来返工。我在实际工作中吃过一次亏一批200颗芯片抽检了20颗全部通过结果产线上用了50颗之后发现有几颗在特定温度下会出现随机复位。后来把所有芯片全部重新测试一遍发现存在个别不良品概率大概2%左右。从那以后我的验收标准多了一条全量测试。留好样品和记录出了问题才能对比每一批芯片到货后留5到10颗作为留样记录丝印批次号和采购信息。如果后续生产中出现问题可以用留样和问题芯片做对比快速判断是个案还是批次质量问题。这个习惯看起来很机械但真的能救急。有一次客户反馈产品在户外高温环境下经常死机我们排查很久没结果最后对比了留样芯片才发现那批芯片的电源引脚焊盘存在虚焊问题问题根本不在芯片本身。在FreeRTOS项目中做好“假芯片”预案即便做了充分的采购筛选和到货检测在实际项目开发中仍然可能遇到芯片问题。在FreeRTOS项目里有几个点可以做防御性设计把问题的影响降到最低。使用断言和错误处理宏程序主动发现问题FreeRTOS提供configASSERT宏可以用来捕获系统内部的异常情况比如中断优先级配置错误、信号量操作超时等。在开发阶段我建议把configASSERT打开一旦系统发生异常程序立即停止在出错位置方便调试。除了FreeRTOS自身的断言还可以在项目层自己加一些运行时检查比如定期检查任务栈剩余空间、检查内存堆剩余大小、检查关键外设配置是否生效。这些检查和业务逻辑无关但能在芯片瑕疵触发问题时第一时间暴露症状。合理设计看门狗策略避免假死变成永久故障看门狗是一把双刃剑。在芯片可靠的前提下正确的看门狗设计能防止程序跑飞在芯片有问题的情况下看门狗会掩盖问题的存在。比如前面提到的随机复位问题如果没有看门狗系统会卡死调试人员就会去查芯片问题有了看门狗系统自动复位看起来好像“每隔一段时间就自动恢复了”反而让人误判为业务逻辑上偶尔的死锁。我的建议是开发调试阶段关闭看门狗把芯片问题暴露出来成熟稳定后再开启看门狗作为产品的最后一道防线。如果产品已经量产了看门狗喂狗失败之后的处理动作不要仅仅是复位最好记录一下复位原因比如通过RCC_GetFlagStatus检查复位标志判断是看门狗复位、上电复位、还是引脚复位。这些信息对排查故障非常有用。模块化设计方便替换问题芯片如果项目还在开发阶段PCB设计上建议把MCU做成独立的子板通过排针和主板连接。这样一旦芯片出了问题直接替换子板即可不需要重新焊接主板。这个方案看似简单实际中能省非常多的时间。便携示波器这个项目最先出的三块验证板后来发现有一颗芯片有问题换一颗芯片只花了两分钟因为MCU是做在独立的核心板上的。关键的FreeRTOS堆栈配置建议回到FreeRTOS本身针对翻新片可能存在的RAM问题我建议在开发初期不要急着把FreeRTOS的内存管理配置到极限先用保守配置。具体而言不要把所有可用RAM都分配给堆留一些余量任务栈分配不要贴着上限比如C8T6的20KB SRAM堆设为12KB剩下8KB留给全局变量和中断栈。如果芯片存在部分坏区保守配置可以提高系统的抗风险能力。我在FreeRTOS项目里维护过一个“内存健康水位”日志记录系统运行时的最大堆使用率和每个任务的最大栈使用率。当这些值超过70%时系统自动在串口打一条警告日志。这样既能及时发现软件层面的内存膨胀也能在芯片RAM存在隐性损坏时提供横向对比的数据。总结芯片问题与软件问题要统筹排查说回文章标题——“STM32F103 FreeRTOS芯片没反应你可能买到假芯片了”。这句话不是在制造焦虑而是基于我实际排查过的多个项目的真实情况。很多开发者遇到芯片没反应第一反应就是翻代码、查外设、找内存泄漏唯独没有怀疑芯片本身。这不是说代码排查不重要而是说要有一个正确的排查顺序。我的习惯是新到一批芯片先花半天做硬件层面验证硬件验证通过后再开始软件调试。开发过程中遇到诡异问题先假设是硬件问题用最小系统去验证硬件验证没问题了再回头查软件。FreeRTOS本身是一个成熟的实时操作系统在正品STM32F103上跑是完全没有问题的。如果你在移植过程中反复出现卡死、复位、内存异常而且代码层面找不到任何逻辑错误真的建议先检查一下芯片——用前面说的手段读取Device ID和Flash容量看一眼丝印量一下GPIO驱动能力。这几步操作加起来不超过十分钟却可能帮你省下几个星期的无谓排查时间。购买STM32芯片的时候也不要只看价格和参数还要考虑渠道的可信度和批次的可追溯性。这是一个需要长期积累的经验走过一次弯路吃过一次亏后面就会长记性了。希望这篇文章能帮你少走一次弯路。