ARTICLE DETAIL

资讯详情

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

STM32F103国产替代实战:5个隐藏坑与移植避坑指南

STM32F103国产替代实战:5个隐藏坑与移植避坑指南 这两年做MCU开发的同行应该都有体会STM32在市场上的价格和供货周期就像早高峰的地铁挤不上还经常晚点。我最近把一个量产产品的控制板从STM32F103C8T6平移到国产MCU上PCB文件基本没动贴片回来直接刷程序原以为一个下午就能搞定的事实际折腾了两周。Pin-to-Pin兼容听起来很简单但真正上手之后才发现所谓兼容指的是“引脚对得上”不等于“功能完全一致”更不等于能把ST的工程直接编译烧录完事。这篇文章把这套折腾过程里踩过的坑做一次系统复盘重点放在5个文档里不会主动标注、但实际开发中一定会遇到的隐藏问题。内容包括原理分析、复现步骤和排查方法面向正在做国产MCU选型、ST程序移植或者准备把现有项目切换平台的嵌入式工程师。如果你以为换个芯片只是改改型号再编译一下那这篇文章能帮你省下至少两周加班时间。1. 为什么Pin-to-Pin替代没有想象中简单先说一下我为什么选这条路。手头这个产品用的是STM32F103C8T6Flash 64KBRAM 20KBLQFP48封装。因为采购周期和成本的双重压力我挑了几款市场上比较成熟的国产M3内核芯片做备选包括GD32F103C8T6、APM32F103C8T6。这几颗料都是LQFP48引脚排列和STM32F103C8T6基本一致理论上可以把PCB上丝印换成新料号去贴片板子不用重新画。这个方案在工程上叫“替代兼容”听起来很简单实际操作要分三个层次去理解。第一层是物理兼容引脚位置、间距、封装尺寸完全一致能直接过回流焊。第二层是电气兼容工作电压、引脚耐压、上下拉内部结构、复位逻辑基本一致不会因为直接替换烧板子。第三层是软件兼容寄存器、外设模块、中断向量、启动文件都能在ST工程的基础上平滑迁移。很多所谓的“Pin-to-Pin兼容”芯片只承诺了前两层第三层要自己踩坑踩出来。我这次遇到的大部分麻烦都集中在第三层。表面上GPIOA、GPIOB这些命名一致USART1、TIM2这些外设名称也一样但深入到底层寄存器、复用功能映射和时钟树之后差异一个接一个浮出来。不要被“Pin-to-Pin兼容”这个营销词迷惑它的实际含义是“给你一个看起来一样的舞台但剧本要重写”。所以整个迁移过程我把它拆成硬件摸底、软件适配、外设验证、可靠性测试四个阶段每一步都值得好好讲。2. 第1个隐藏坑电源、复位和Boot电路未必完全一样2.1 电源引脚和去耦要求不能只看位置第一块板子贴回来之后我没急着刷程序先拿了块样片做最小系统验证。结果一测就发现问题某国产芯片正常工作时的VDD电流比ST同型号略大原来板上按照ST手册设计的去耦电容布局虽然没有导致重启但纹波明显变差。后来翻数据手册才发现这芯片内部LDO架构和ST并不一样数据手册里要求每个VDD引脚旁边的去耦电容尽量靠近引脚而且对ESR有更严格的推荐值。这种问题在功能测试阶段容易被忽略但在批量产品里可能表现为偶发复位或者ADC采样不稳。我的建议是做替代选型时不要只看芯片本身要把整块板子的电源网络参数一起看。VDD电压范围、VDDA滤波要求、VREF的参考电压精度、甚至VCAP相关引脚如果存在的去耦要求都要拿两个手册逐项比对。有些国产型号的电源引脚位置虽然和ST一致但内部供电架构已经改了原来的电容参数不一定还合适。2.2 NRST复位引脚和外部复位芯片的配合原设计里我用了一颗外部复位芯片输出接到MCU的NRST脚。ST的NRST内部有一个弱上拉外部复位芯片是开漏输出两者可以正常配合。换到国产芯片后发现这颗国产MCU的NRST内部上拉电阻更弱外部复位芯片释放复位后NRST引脚电压爬升很慢偶尔出现上电后MCU没有正常启动的情况。排查方法很简单用示波器看NRST引脚的上电波形发现电压爬到了阈值附近来回抖动MCU一直处于复位与运行的临界状态。解决方式是在NRST引脚到地之间加一个100nF电容和外部复位芯片一起配合把复位释放过程变得干净利落。如果板上没有外部复位芯片直接靠内部上拉复位的设计同样要测量复位释放时间是否满足国产芯片数据手册要求不能沿用ST的旧参数。2.3 Boot引脚和系统存储器地址的差异STM32F103的BOOT0和BOOT1引脚大家都熟悉BOOT0拉高、BOOT1拉低可以从系统存储器启动进入出厂自带的串口Bootloader。有些国产芯片在LQFP48封装里同样引出了BOOT0和BOOT1但有的型号只保留BOOT0BOOT1在内部被固定需要通过Option Byte配置启动方式。这意味着如果你原来靠BOOT1引脚电平选择启动模式硬件上就得改。还有一个容易踩的坑是系统存储器的地址。STM32F103系统存储器在0x1FFFF000但某些国产兼容芯片的ROM地址不同。如果产品里有IAP功能Bootloader升级时跳到系统存储器去执行出厂Bootloader沿用原地址会直接跳飞。我就吃过这个亏用串口下载工具怎么都连不上后来才发现地址压根不在同一个位置。建议拿到芯片后先把启动模式、Option Byte、系统存储器地址这三项单独验证一遍再开始写业务代码。3. 第2个隐藏坑引脚坐标一致AF复用表差很远3.1 同名外设不一定映射到同一个引脚GPIO坐标一致是我最初决定替换的主要原因但真正写代码时才意识到Pin-to-Pin兼容只保证了物理引脚编号能对上每个引脚能复用成什么功能是由芯片内部的AF矩阵决定的。不同厂商的AF映射表完全是自己定义的和封装引脚长得像不像没有关系。我遇到的具体问题是原来的产品用了TIM2_CH3的重映射功能在STM32F103上通过重映射把TIM2_CH3引到了PB10。换了国产芯片后TIM2确实存在但PB10这个引脚的AF表里只定义了USART3_TX根本没有TIM2_CH3这个复用选项。结果就是程序怎么初始化都没波形输出。这种问题没法靠代码解决只能回到硬件方案重新分配引脚或者换用其他定时器通道。教训是做替代前必须把原工程里用到的每个外设引脚都拿国产芯片的datasheet核对一次特别是那些用了重映射、部分映射的引脚。3.2 调试接口引脚与GPIO复用冲突的处理差异STM32F103刚上电时PA13、PA14、PA15、PB3、PB4默认是SWD/JTAG调试引脚如果要把它们当普通GPIO用标准库里的做法是先调用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)把JTAG关闭保留SWD。国产MCU虽然也照搬了这套寄存器结构但不同厂家的实现细节不一样有的甚至把JTAG释放还分成“完全释放”和“保留SWD”两种模式。我在测试过程中遇到一次最惨的情况把国产芯片的PB3配置成普通GPIO输出程序烧进去后SWD接口也连不上了。原因是这颗料的SWD引脚占用和ST不完全一样释放JTAG的配置把SWD也一起关了。最后只能把BOOT0拉高进入Bootloader后用全片擦除恢复。从那以后我凡是遇到要复用调试引脚的工程都会在固件里保留一个“恢复默认引脚”的隐藏命令免得后续升级时锁死下载口。3.3 定时器输入捕获和PWM通道要重新核对我的产品里用到了定时器输入捕获去测外部脉冲频率原工程用的是TIM4_CH1在STM32F103上对应PB6。换到国产芯片后TIM4_CH1在PB6上仍然存在这点和ST一致。真正出问题的是另一个通道TIM2_CH2的捕获输入在ST上不用重映射就能用PA1但国产芯片把PA1默认复用给了其他功能需要额外配置AFIO或者开启某个重映射位才能让TIM2_CH2的信号进来。后来我专门整理了一张表格把原工程用到的每个外设通道、引脚坐标、是否重映射以及国产芯片对应的AF配置全部列出来。表格比看手册高效得多能直接暴露那些表面同名但实际不通用的通道。如果你是SPI、I2C、UART这类常规外设大概率问题不大真正要小心的是定时器互补输出、刹车输入、DMA请求映射这些“次要功能”厂商文档经常藏在不太起眼的脚注里。4. 第3个隐藏坑启动文件、时钟树和Flash等待周期4.1 启动文件和中断向量表的兼容性很多人在替代时的第一反应是把ST的启动文件startup_stm32f103xe.s原封不动加进国产MCU工程里。这种做法运气好时可以跑起来但定时器中断、串口中断这些一旦触发程序就可能跳进HardFault因为中断向量表的顺序不一定和芯片实际中断序号一致。虽然大部分国产M3芯片的中断源顺序照搬了ST但总有个别型号会插入额外中断或者调换顺序。最稳妥的方式是使用芯片厂商提供的启动文件不要自己从ST工程拷。厂商模板里的startup文件不仅向量表是对的堆栈大小、初始SP值也根据芯片实际RAM做了调整。如果不想用厂商的模板也要保证启动文件里每个中断服务函数的名字和你的C代码函数名能对上。HAL库工程更加敏感因为HAL_UART_IRQHandler这类函数名如果和启动文件不匹配编译器不会报错但中断永远不会进来。4.2 SystemInit时钟配置和主频上限的区别STM32F103标准库工程里的SystemInit会把系统时钟配置到72MHz外部晶振8MHzPLL 9倍频。这颗国产芯片最高能跑108MHz但默认的PLL配置寄存器布局和ST很接近直接烧ST的代码大部分情况下能正常工作因为72MHz对国产芯片来说是安全范围内的频率。但问题出在换了一颗最高频率更高、PLL VCO范围不一样的芯片时沿用ST的配置可能导致时钟频率严重偏差。我调试串口时就遇到过一次非常典型的故障程序能编译、能下载、LED闪烁正常串口输出却全是乱码用示波器量TX引脚发现波特率完全不对。查到最后是RCC配置里的PLL倍频系数在国产芯片里被解释成了另一个倍数系统时钟跑到了96MHz而不是72MHz。这类问题不能靠猜必须仔细阅读芯片手册里的时钟树章节确认PLL输入范围、倍频系数范围、USB预分频和ADC预分频的限制。4.3 Flash等待周期和Flash加速器CPU跑得比Flash快所以读指令时要插入等待周期这个大家都能理解。不同的芯片Flash读取速度和内核频率的关系不一样等待周期设置错了表现出来就是程序随机死机、HardFault、跑一段时间才崩溃特别难排查。我最初在国产芯片上调高主频测试性能没有同步修改Flash等待周期结果跑一个复杂的浮点运算就死机一度怀疑是芯片坏了。后来定位到是FLASH_ACR寄存器里的等待周期数没有跟着系统时钟提高。除此之外很多国产MCU还加入了Flash加速器或预取缓存有的默认开启有的默认关闭开启后程序执行速度会有区别。这些寄存器定义在标准库头文件里和ST不太一样直接沿用ST代码很容易漏配。我的建议是时钟树和Flash配置这些“底层基础”不要复用旧代码直接改用厂商例程里的初始化函数再基于这个基础做业务开发。4.4 Bootloader跳转地址和中断向量偏移如果产品里有Bootloader和App分区跳转逻辑也容易踩坑。STM32上常见的做法是通过设置VTOR寄存器把中断向量表搬到App起始地址或者对不支持VTOR的芯片使用NVIC_SetVectorTable。国产芯片是否支持VTOR、支持多大的偏移粒度需要单独确认。我遇到的情况是国产芯片在RAM里运行程序时的中断向量重映射方式不同Boot跳App后App能跑但任何中断一触发就死机。这个问题在调试器里看常常表现为PC指针跳到了0x00000000附近明显是向量表没有正确重定位。解决方式是把Boot里跳转前的向量表设置代码改成国产芯片的寄存器操作方式同时确认App工程的链接地址和Boot的跳转地址一致。总之Bootloader相关的代码反而是最需要从零阅读厂商手册的部分不能想当然。5. 第4个隐藏坑HAL库与标准库的兼容只是“看起来很美”5.1 不同层级的代码有不同的迁移成本做替代之前先判断你的工程用了哪种开发方式。如果直接用寄存器操作那迁移成本最低只要把寄存器地址、位定义这些宏换成国产芯片头文件的版本大部分代码能保留。如果用的是标准外设库成本和寄存器差不多但需要把stm32f10x.h换成厂商自己的头文件GPIO初始化结构体、RCC外设时钟使能宏这些都要跟着改一遍。最麻烦的是用STM32CubeMX生成的HAL库工程。HAL库的函数名、结构体名虽然看起来和ST一模一样的风格但内部寄存器位定义、外设句柄的成员、错误处理机制都可能不同。比如STM32的HAL_UART_Receive_IT在某个国产厂家的库函数里叫UART_Receive_IT参数还多了一个。这类差异没法靠编译器报错全部找出来有些函数只是因为参数类型不同而报错有些则是名字相同但行为不同编译器完全不管直接给你埋雷。5.2 UART空闲中断DMA接收的行为差异我产品里最核心的通信是Modbus RTU用的是UART空闲中断加DMA接收。ST的做法是开启UART的IDLE中断在中断里判断接收完成然后处理一帧数据。这个逻辑在国产芯片上遇到了两个问题第一是IDLE中断标志的置位条件不一样ST在接收完一个字节后的空闲期触发IDLE中断国产芯片则可能在使能DMA的一瞬间就触发了IDLE第二是清除IDLE标志的顺序有讲究有的芯片要求先读SR再读DR有的只要求写0清除搞错了就会导致下一帧数据收不到。这类问题非常隐蔽因为单纯用串口助手发数据大概率正常一旦连上真实的Modbus主站收发频率提高后就开始丢帧。排查办法是用逻辑分析仪抓UART_RX引脚波形对比DMA搬运数据的时序和IDLE中断发生的时间点。如果还是找不到规律就把DMA接收缓冲区的数据全部导出来看看丢的是哪一部分。最终我的处理方案是绕过厂商库的IDLE处理自己用寄存器方式写了一个收帧状态机彻底不看厂商库的脸色。5.3 ADC校准差异和DMA多次采样ADC是另一个常被忽略的差异点。STM32系列里不少型号上电后需要做校准在HAL库中这个动作封装在HAL_ADC_Start里自动完成但标准外设库工程需要手动调用校准函数。换成国产芯片后有些型号必须按照特定流程做一次校准否则ADC转换结果整体偏小或偏大。我遇到的情况是ADC采样值比实际电压低了大约3%起初以为是电阻分压精度问题后来查了应用笔记才发现是芯片没有执行内部校准。热词里提到“STM32 HAL库ADC单通道DMA多次采样”这也是一个容易出问题的地方。DMA请求映射在ST和国产芯片上往往不同STM32F1的ADC1 DMA请求是固定的但某些国产M3芯片把DMA请求通道分得更细初始化DMA时要多配置一个请求源。我在配置多个ADC通道加DMA循环采样时遇到过数据通道错位的情况通道0的数据跑到通道1的缓冲区里。这种问题的排查效率很低建议直接参考厂商提供的ADCDMA示例工程不要自己凭ST经验去配置DMA请求。5.4 建一个适配层把厂商库隔离在业务层之外经历过这次迁移之后我现在的新项目都强制在业务代码和芯片厂商库之间加一层BSP适配层。BSP层负责完成所有初始化、中断处理、数据收发向上层提供一套和芯片厂无关的接口比如BSP_UART_Send、BSP_TIM_GetCapture、BSP_ADC_ReadChannel。换芯片时只改BSP这一层业务逻辑不动能够大幅缩短迁移周期。这个思想很适合中小团队付出的代价是每个外设要先写一层薄封装看起来多写了很多代码但换平台时的收益非常大。我见过太多项目把串口初始化代码直接散落在各个业务模块里一旦换芯片满工程找USART1、GPIOA这些关键字改到怀疑人生。适配层不需要很复杂用宏和几个C文件就能实现关键是团队里要有这个约束意识。6. 第5个隐藏坑调试、下载与电气参数的实测差异6.1 Keil5识别不到芯片下载报错的解决思路换芯片后第一件要面对的事就是开发环境。Keil5如果不认识这颗料会报No target connected或者Flash Download failed - Cortex-M3。解决办法不是硬刷而是去芯片厂商官网下载对应的Keil Pack安装包双击安装后在Options for Target的Device列表里找到对应型号然后重新选择Flash Download算法。换个说法工程要告诉Keil这颗芯片的内部Flash容量、RAM起始地址和烧录算法这些信息全部由Pack提供。有同事问过我“Keil5兼容C51和STM32安装”的问题其实Keil5支持同时装C51和ARM工具链但安装时要注意安装目录和Pack路径否则两个工具链会互相干扰。建议在一个干净的目录里安装Keil5C51版和MDK版分别安装到不同路径再通过Pack Installer安装对应的芯片支持包。调试器方面ST-Link理论上能连接多数Cortex-M内核芯片但有些国产芯片在连接时会报错遇到这种情况可以把下载器的复位模式改成“Connect under Reset”或者接一个带复位控制的DAP-Link我一次到位直接全部换成DAP-Link省去很多兼容性麻烦。6.2 代码里禁用JTAG/SWD之后无法再次下载做开发的人几乎都遇到过这个问题代码里把SWD引脚配置成普通GPIO烧完程序后调试器就再也连不上了。ST芯片可以通过拉低BOOT0进入系统Bootloader然后擦除Flash来恢复。国产芯片的恢复流程不一定一样有的甚至因为默认没有开放串口Bootloader只能靠SWD接口下载两把钥匙丢了一把非常被动。经验是第一不要在正式版本里随便把SWD引脚释放成GPIO除非你确认量产工具支持其他下载方式第二Debug引脚被占用后的恢复方法是先按住复位键点击下载的同时松开复位也就是常说的“Connect under Reset”多试几次成功率很高第三如果是用DAP-Link优先把复位线接到板子的NRST引脚这比靠内核复位更可靠。我后来在国产芯片上做开发就固定了“先下载一个Bootloader再通过Bootloader更新App”的方式调试引脚随时可以释放干净。6.3 GPIO驱动能力、上下拉和5V容忍度差异国产MCU的GPIO电气参数也不能默认和ST一致。原设计里有一个LED指示灯STM32F103的GPIO推挽输出直接点亮了换成国产芯片后同一颗LED明显变暗。查数据手册发现这颗国产GPIO的输出拉电流能力比ST小不少如果用GPIO直接驱动LED、蜂鸣器、继电器要重新核算限流电阻和驱动能力必要时换成三极管或者专门的驱动芯片。输入引脚的5V容忍度也要逐个核对。ST的FT引脚支持5V输入但有的国产芯片只有部分引脚标注了FT有些引脚标注为“T”表示只能容忍3.3V。如果原板子上有5V逻辑器件直接连到STM32引脚通常没事换了芯片后如果没有检查5V电平可能倒灌到VDD导致芯片发热甚至烧毁。内部上下拉的默认状态也有差异有些国产引脚默认内部上拉很弱甚至没有外部按键扫描电路可能会一直读到低电平需要软件里手动使能。6.4 低功耗模式与唤醒后的时钟状态如果产品是电池供电替代芯片之后一定要重新测试低功耗电流。我原来以为只要代码里调用相同的停机指令功耗应该差不多结果用万用表一测某国产芯片的Stop模式电流比ST大了好几倍。原因可能是芯片内部还有外设时钟没有关干净或者某些IO在低功耗模式下的状态和ST不同产生漏电。更麻烦的是唤醒后系统时钟源的切换。有些国产芯片从Stop模式唤醒后默认回到内部RC振荡器而不是外部高速晶振如果代码没有做时钟切换串口波特率会瞬间错乱紧接着通信就故障。所以实测低功耗唤醒后第一件事就是去读系统时钟状态确认工作频率和配置一致。把这些边界情况在产品开发早期验证完比量产后再去收拾要省心得多。7. 一次顺利迁移的实操流程与自检清单7.1 移植分步走不要一上来就全量编译拿到替代芯片后我建议不要直接把整个工程一键替换而是先分四步走。第一步做最小系统验证板子上电、复位、SWD下载都正常后先点一颗LED确认GPIO操作没问题。第二步跑串口打印这一步能同时验证时钟树配置和UART外设如果串口输出乱码大概率是时钟配置错误。第三步逐个打开要用到的外设每开一个就验证一个不要让多个变量叠加在一起排查。第四步把所有外设都打开做24小时连续运行压力测试同时观察功耗、温度、通信稳定性。整个过程中我强烈建议建一个“移植日志”把每一步改了哪些文件、遇到什么问题、最终怎么解决记录下来。嵌入式问题很多时候是偶发的有日志能快速回溯。我这次就是在验证阶段发现串口偶尔丢字节后来通过日志发现国产芯片的DMA缓冲区和ST有个对齐参数差异修复后问题消失。7.2 硬件差异对照表这个表格是移植前必须做的功课把选用的国产芯片和ST芯片的数据手册摆在一起逐个参数比对。下面是我自己常用的一张简化表你可以直接照着列项目。比对项目原ST型号国产替代型号结论工作电压范围2.0~3.6V必须按手册确认决定电源设计是否仍适用NRST复位脉宽要求手册参数A手册参数B决定外部复位芯片是否够用VDD引脚去耦要求推荐0.1uF4.7uF可能有差异影响PCB微调Boot启动方式BOOT0/BOOT1引脚是否只有BOOT0或Option Byte影响量产烧录所有外设引脚复用表AF表格AF表格逐个核对重映射启动文件向量表ST文件厂商文件不能混用系统存储器地址0x1FFFF000厂商手册影响Bootloader跳转Flash等待周期寄存器布局位定义可能有区别影响稳定性调试接口释放方式寄存器配置可能不同影响量产下载GPIO驱动能力与FT引脚IO规格表IO规格表影响外围电路7.3 软件适配层重构顺序软件方面的移植不是简单把头文件换掉我建议按照“底层引脚定义→RCC时钟树→外设驱动→中断服务函数→应用逻辑”的顺序来。底层引脚定义包括GPIO端口、引脚号、复用功能的宏替换RCC部分直接用厂商例程初始化外设驱动里的初始化代码全部重写中断服务函数要核对启动文件里的名称应用逻辑里的接口函数保持原有名称和业务含义方便做对比测试。如果工程用了RTOS还要额外关注SysTick和PendSV的处理是否正常。国产芯片的内部SysTick和STM32基本一致但最好在更换后单独跑一个任务调度测试确认上下文切换没有异常。这一步做完整个工程就已经从“ST味道”过渡到“国产芯片味道”了。8. 常见问题排查实录与避坑技巧8.1 一张表排查典型故障故障现象可能原因排查思路上电后程序不运行电流正常Boot引脚电平不对或启动文件错误确认BOOT0/Boot配置检查向量表串口输出乱码系统时钟频率配置错误或晶振不起振示波器量外部晶振波形核对PLL配置运行时偶尔HardFaultFlash等待周期设置过小提高主频后检查FLASH_ACR寄存器程序运行但SWD连不上调试引脚被复用为GPIOConnect under Reset或按钮复位后快速下载定时器PWM没有输出引脚复用功能表不兼容查AF表必要时改硬件引脚串口收发丢帧IDLE中断清除顺序不一样改用寄存器状态机不依赖厂家库ADC采样值偏差大未做内部校准按手册执行校准流程检查参考电压低功耗唤醒后外设工作异常唤醒后时钟源未切回外部晶振唤醒流程里主动配置系统时钟8.2 我总结的几个避坑技巧第一拿到新芯片后不要着急写业务代码先花半天时间把官网的所有应用笔记和勘误表下载下来重点看勘误表。第二但凡原工程里用了重映射、复用、DMA请求映射这类功能都要当作高危代码处理直接在国产芯片上做最小化验证不要只在文档层面比对。第三国产芯片厂商的社区和论坛里经常有前人踩坑后写下的案例搜索“型号外设名问题现象”比自己翻手册有效率得多。第四如果项目紧急优先用厂商提供的标准例程作为起点在此基础上把业务代码以“搭积木”方式加进去而不是反向把ST的工程逐步改到国产芯片后者的问题定位难度大得多。最后说点实际经验这次替代项目做了两周换来的最大认知是不要把“Pin-to-Pin兼容”当成“工程完全兼容”。引脚对得上只是降低了你改PCB的成本真正的工作量全在软件底层的适配和外设行为的验证上。国产MCU这些年进步很快很多芯片在价格和供货上的优势非常明显但每一颗芯片都有自己的脾气厂商评测板上的Demo跑得再好也不代表在你的产品里可以直接跑通。我的建议是给替换工作留出足够时间外设逐个验证、异常情况逐条排查然后把踩过的坑整理成团队内部文档这些经验换一个项目再遇到时就是真金白银的研发成本。最后再提醒一句量产前别忘了做高低温、电压拉偏和EMC摸底很多隐藏坑要等到环境变了才现身。
返回列表