资讯详情

资讯详情

嵌入式开发板全解析:组成原理、选型与调试实战

做嵌入式的朋友大概都有这种经历项目立项第一天产品经理丢过来一句“先买块板子试试”然后你打开商品页面面对几百个型号参数栏里写着主频、Flash、RAM、封装、引脚数、工作温度、价格从十几块到上千块。那一刻的茫然跟第一次进建材市场差不多——你其实只想装个灯泡但老板问你螺纹是E14还是E27、色温要3000K还是6000K。嵌入式开发板就是这么个东西它本身不是产品而是你验证想法、跑通代码、甚至直接拿去小批量出货的载体选错一块板子后面三个月都在给它擦屁股。这篇内容我想把“嵌入式开发板”这件事从根上拆开讲先讲清楚一块板子上到底有什么、为什么这些元件必须存在再讲核心原理里最容易被教程含糊带过的时钟、存储、中断三块最后落到实战选型和上手实操。不管你是刚学完C语言想找个东西练手的在校生还是做了几年上层软件想转下来接地气的工程师或者是手上有个小产品要做原型验证的独立开发者应该都能从里面找到能直接抄的东西。我不打算写成芯片手册的翻译版只讲我自己动手时真正用得上的那部分。1. 先把“板子”这件事拆开看开发板到底由什么组成1.1 从内核到排针一条信号要走过的五道门很多人拿到开发板的第一反应是数引脚、看主频但真正决定这块板子好不好用的是信号从芯片内部走到外部排针这一路上的五道门内核、总线、外设控制器、引脚复用矩阵、外部电路。内核算逻辑总线搬运数据外设控制器把并行的寄存器操作翻译成串行时序引脚复用矩阵决定这个功能到底出现在哪个物理引脚上外部电路则决定了信号出来之后还剩多少完整性。这五道门里任何一道卡住你在代码里写再多初始化也没用。我见过太多新手把“引脚复用”当成小问题。某款通用MCU的同一个物理引脚能配成普通GPIO、串口发送、定时器通道、SPI片选甚至ADC输入但同一时刻只能选一个。你在代码里开了串口又想在同一个脚上点灯编译不报错运行就是不动查一天都查不出来。所以看到开发板原理图的时候别急着看主芯片先看“引脚分配表”把你要用的功能和板子已经占用的资源对一遍。有些板子把调试口、外部晶振、USB引脚都引到了排针上看着引脚很多实际能自由用的没几个。另一个常见误区是忽略板上的“隐形器件”。一块看起来很简单的核心板周围至少还藏着电源芯片、晶振、复位电路、启动模式跳线、去耦电容、指示灯和按键。这些东西不写在代码里但决定了你的代码能不能跑起来。我个人的习惯是拿到新板子先花二十分钟把原理图从头翻到尾重点看电源部分和启动配置部分比直接抄例程点灯效率高得多。1.2 板级三件套电源、时钟、复位怪问题九成出在这如果让我给嵌入式调试的疑难杂症排个序电源、时钟、复位这三块能占七成以上剩下三成里还有一半是接地问题。电源这块新手最容易忽略的是“电压对但电流不够”。你用USB口供电标称5V实际线材细一点、板载稳压器效率低一点一开无线模块或者点亮一排LED电压瞬间掉到4.3V芯片进入欠压复位表现就是“跑着跑着重启”。示波器夹一下电源脚问题一目了然没有示波器就临时并一个大电容试试能缓解就说明是瞬态供电不足。时钟这块的坑更隐蔽。外部晶振的负载电容必须和晶振规格匹配常见的是12pF到20pF之间板子设计时焊的是两个22pF你换了个不同规格的晶振起振就变得勉强冷机启动正常、温度一高就死机。还有一种情况是晶振根本没起振芯片自动切到内部RC振荡器程序照跑但串口波特率全错接收全是乱码。判断方法很简单把系统时钟输出到某个引脚用示波器或者频率计量一下看看是不是你配置的那个值。复位电路相对简单但也有讲究。复位脚上的电容太小上电瞬间的毛刺会让芯片反复复位电容太大复位释放太慢调试器连不上。我见过一块自制板子复位按键按下后松手程序要等两秒才启动原因就是复位脚上挂了个10µF的电容。标准做法是复位脚配10kΩ上拉加100nF电容需要手动复位再加个按键别自己乱加容量。1.3 从上电到main函数启动流程里藏着很多答案绝大多数人写嵌入式代码是从main函数开始的但芯片从上电到走进main中间跑了几百行你看不见的代码。这段路大致是上电复位释放芯片从固定的启动地址读取初始栈指针和复位向量跳进启动文件初始化时钟和存储器把已初始化的全局变量从Flash搬到RAM把未初始化的变量区清零然后才调用main。你在main里定义了一个全局数组却没赋初值指望它是0靠的就是这一步如果启动文件配错了或者你手写链接脚本时漏了段这个数组里就是一堆随机数。还有启动模式的问题。很多开发板上有BOOT跳线或者按键用来选择从内部Flash启动、从系统存储器启动、还是从外部接口下载。新手最常见的“程序下载进去了但不运行”十次有三次是BOOT脚状态不对芯片根本没从Flash启动。我的做法是把启动配置这一页打印出来贴在工位上遇到“下载成功但不跑”先看一眼跳线。链接脚本和存储器映射也值得花时间看一眼。Flash多大、RAM分几块、哪一块是给DMA专用的、栈放在哪、堆放在哪这些在链接脚本里写得清清楚楚。有些芯片的RAM分成两段一段接在高速总线上一段接在低速总线上你把频繁访问的缓冲区放错位置性能差一倍都不止。2. 核心原理拆解把“能跑”变成“知道为什么能跑”2.1 时钟树主频不是填个数字就完事时钟是嵌入式系统的心脏但大部分教程只教你“把主频配到多少”不告诉你这个数字是怎么算出来的。以一颗典型的32位通用MCU为例外部晶振8MHz进来先经过一个分频器再进锁相环倍频倍频后的中间频率叫VCO频率它对范围有硬性要求比如必须在192MHz到432MHz之间最后再经过一个分频得到系统时钟。你想跑168MHz就得反推VCO取336MHz输出分频2得到168MHz输入分频取88MHz除以8得1MHz1MHz乘以倍频系数336得336MHz。三个参数任何一个超出范围锁相环就锁定失败芯片退回到内部低速时钟你的程序看起来在跑实际速度慢了十几倍。我建议每个做底层的人都手算一遍自己板子的时钟配置然后把各个总线的分频关系画在一张纸上。因为外设时钟往往是系统时钟再分频来的串口挂在低速总线上、定时器挂在高速总线上你算波特率的时候用错了时钟源通信就是不通。更麻烦的是有些外设的时钟使能位默认关闭你不开时钟就去写寄存器写进去没有任何反应也不报错。还有一个实际经验调时钟不要一步到位。先把系统跑到内部时钟确认串口能打印再切到外部晶振确认还是能打印最后开锁相环跑到最高主频。三步分开做出问题的时候你知道是哪一步挂的。一次性全配上再调试等于把三个变量同时改出了问题只能靠猜。2.2 存储层次与总线你的数据到底放在哪嵌入式系统里的存储不是一个平面而是一个有层级、有速度差、有访问限制的结构。最靠近内核的是寄存器和指令缓存往下是紧耦合的片上RAM再往下是普通SRAM最后是Flash和外部存储。速度差可以达到几十倍。你把一个高频访问的循环计数器放在慢速RAM里和放在快速RAM里实测性能差距很明显。DMA是另一个必须理解的东西。它的本质是一个不占CPU的小搬运工能在后台把外设数据搬到内存、或者把内存数据搬到外设。用好了串口收数据不需要每个字节都进中断CPU可以专心算别的用不好会出现“数据搬了一半被CPU改了”的竞争问题。我的经验是只要外设支持DMA数据量超过十几个字节就优先考虑DMA但一定要配好传输完成中断和半传输中断别指望轮询标志位。Flash这块也有坑。写入Flash之前必须先擦除而擦除是按扇区来的一个扇区可能是1KB、2KB甚至更大。你想保存一个20字节的配置参数实际上要占用一整个扇区反复擦写还会磨损。所以参数存储要么用专门的EEPROM芯片要么在Flash里做磨损均衡把写操作轮流分散到多个扇区。见过一个项目每次开机都往同一地址写一次配置三个月后那块Flash就彻底写废了整批设备返修。2.3 中断与实时性从裸机前后台到RTOS的临界点裸机开发的主流结构是“前后台”主循环里轮询处理业务中断里处理紧急事件。这个结构在任务少、实时性要求不高的时候非常好用代码简单、没有调度开销、调试直观。但它的临界点很明确当你有三个以上的任务需要“看起来同时运行”或者某个任务要等一个较长的延时又不能阻塞别人前后台就开始变得难写你会写出一堆状态机互相嵌套。这时候引入一个轻量级实时操作系统是合理的。它带来的最大好处不是“多任务”这个名头而是把时间管理和任务解耦你可以让一个任务专门等串口数据一个任务专门跑控制算法一个任务处理显示刷新各自用阻塞式写法不用再拼状态机。代价是每个任务都要独立栈空间RAM消耗上升而且一旦用上调度器就必须注意临界区保护和优先级设置中断里调用系统API还有专门的安全函数。我个人的判断标准是任务数量超过三个、或者存在“必须严格按周期执行”的控制逻辑、或者需要用到网络协议栈这类庞然大物就上RTOS只是点灯、读传感器、发串口裸机足够别为了技术时髦给自己找麻烦。用RTOS之后最容易出的问题是栈溢出某个任务里定义了一个大数组做缓冲栈空间不够直接把相邻任务的数据覆盖掉现象是“另一个毫不相关的任务莫名跑飞”。排查方法是在任务切换钩子里记录每个任务栈的高水位线看剩余空间还有多少。2.4 调试手段会点灯不算本事会看现场才算嵌入式调试和纯软件调试最大的区别是你没有printf随时可用也没有断点可以无限次打断。所以真正的功夫在于“建立一个可观测的现场”。最基本的三件套是一个空闲的串口用来打印日志、一个GPIO用来翻转做时序标记、一个调试器用来读寄存器和内存。串口打印要注意别在主循环里同步阻塞输出波特率115200下打印50个字符大概要4ms你在1kHz的控制循环里打印一次日志整个时序就乱了。正确做法是环形缓冲区加DMA发送日志进缓冲区就走发送在后台完成。GPIO翻转是更精准的手段在中断入口拉高、出口拉低示波器一测就知道这个中断执行了多久、多久进来一次比打印日志直观得多。调试器方面除了设断点更实用的是“实时变量监视”和“寄存器查看”。程序跑飞进了硬件异常处理先看栈里的现场程序计数器指向哪、链接寄存器指向哪、出错的访问地址是多少对照反汇编和映射文件基本能定位到出问题的函数。我养成的一个习惯是在硬件异常处理函数里加一段代码把关键寄存器打印出来再死循环这样每次死机都能留下“遗言”比盲目加打印效率高太多。3. 实战选型先算需求再看参数最后看生态3.1 把需求翻译成硬指标别从参数表开始选选型最常见的错误顺序是打开商城按销量排序看哪个便宜买哪个。正确顺序应该反过来先把手上的需求翻译成几条硬指标。第一是算力需求你是做简单的采集控制还是要跑简单的信号处理、图形界面、甚至轻量级神经网络推理前者一颗几十兆主频的内核就够后者可能需要几百兆主频加硬件加速单元。第二是内存需求跑裸机程序几十KB RAM够用跑实时操作系统加网络协议栈至少上百KB跑完整的Linux没有几百MB根本转不动。第三是外设需求需要几路串口、几路SPI、有没有USB、有没有以太网、要不要CAN总线、ADC需要几位精度多少采样率。第四是环境需求工业现场要宽温、要抗干扰消费电子可以宽松些电池供电则要把低功耗放在第一位。把这四条列成一张表你会发现能选的型号瞬间从几百个收敛到十几个。这时候再去看价格和供货效率完全不一样。我做过一个带屏幕的小设备一开始被推荐了一颗主频很高的芯片后来一算屏幕刷新靠的是专门的显示接口加DMA主核算力要求其实很低换成一颗主频只有一半、但带硬件显示控制器的型号成本降了四成功耗降了一半。算力不是越高越好够用且匹配才是最优解。3.2 一张对比表主流开发板类型的定位和适用边界为了讲得具体一点我按用途把常见的开发板分成几类参数是典型范围的估算不是具体型号的规格书你按这个框架去对照实际产品就行。板型定位典型内核与主频内存规模优势明显短板适合谁入门学习型小板32位内核48至72MHzFlash 64至256KBRAM 8至32KB便宜、资料多、烧录简单外设少、算力紧张、扩展性一般刚学完C语言想练手的新手通用型核心板32位内核100至200MHzFlash 512KB至1MBRAM 128至256KB外设齐全、带浮点单元、生态成熟引脚复用复杂、上手门槛中等做产品原型的工程师无线连接型双核主频百兆级RAM 几百KB内置Wi-Fi与蓝牙、开发框架完善功耗偏高、实时性受射频影响做物联网节点、智能家居低功耗传感型32位内核16至48MHzRAM 几十KB休眠电流可到微安级、外设按需唤醒算力弱、开发调试略麻烦电池供电的长期在线设备单板计算机型四核64位1GHz以上RAM 1至4GB能跑完整操作系统、接口丰富实时性差、功耗高、启动慢做网关、边缘计算、带屏交互异构多核型应用核加实时核共享内存兼顾界面与硬实时控制开发复杂、双核通信要设计做工业HMI、机器人主控这张表最想说明的一件事是没有全能板。你在一个维度上占便宜一定在另一个维度上付出代价。我见过有人拿单板计算机去做电机控制结果因为操作系统调度抖动控制环根本稳不住最后还是加了一颗实时内核的协处理器才解决。3.3 生态比主频更容易翻车选型的时候很多人盯着参数表但真正决定项目进度的是生态官方有没有完整的软件开发包、有没有能直接跑的例程、社区里问问题有没有人回、文档是全还是只有一页纸。我吃过一次亏选了一颗参数很漂亮的芯片结果官方库函数里有个外设的初始化顺序是错的按文档写就是不通最后是在社区一个两年前的帖子里找到绕法前后折腾了一周。参数可以慢慢挖生态不行就是天天挖坑。判断生态好坏有个很土但有效的办法去搜“这颗芯片 某个具体外设 问题现象”看能搜到多少条结果、回答质量如何。如果搜出来全是没人回复的提问你就得掂量一下自己是不是愿意当第一个吃螃蟹的人。另外看官方开发环境是否支持你熟悉的工具链有些芯片只能用厂商自己的集成环境跨平台支持很差团队协作会很难受。供应链这块也得提一句。有些型号平时好买一遇到需求波动就断货交期从四周变成四十周。产品要量产的话选型阶段就要确认有没有pin-to-pin兼容的替代型号软件上有没有做硬件抽象层隔离。我现在的习惯是底层驱动统一封装成一层接口上层业务不直接碰寄存器换芯片的时候只改驱动层业务代码几乎不动。这个习惯看起来前期多花两天换型的时候能省两个月。3.4 按场景给几条具体的选型建议纯学习和练手我建议从入门学习型小板起步别一上来就买单板计算机。原因很实际你需要先建立“寄存器、时序、中断”这套肌肉记忆这些在裸机环境里体会最深。板子便宜烧了不心疼例程多遇到问题搜得到答案。等你能独立把串口、定时器、ADC、SPI都跑通再往上走。做带无线的物联网节点选无线连接型但要提前想清楚功耗预算。射频发射瞬间的电流峰值能到几百毫安电源和电容必须留足余量否则一发数据就复位。天线布局也有讲究板载天线下方要挖空铺地金属外壳会严重影响通信距离这些在选型阶段就要看板子的射频设计是否认真做过。做工业控制或者需要长期稳定运行的设备优先看宽温型号和带CAN、带隔离接口的板子同时把看门狗、掉电检测、参数存储这几件事在硬件层面就规划好。别指望软件层面兜底工业现场的干扰强度跟实验室完全不是一个量级。做带屏交互的设备直接考虑异构多核或者单板计算机用应用核跑界面、实时核跑控制两条腿走路。自己在一颗小核上硬扛图形界面最后一定是帧率和实时性两头不讨好。4. 上手实操从最小系统验证到稳定运行4.1 环境搭建先把工具链跑通再谈业务拿到板子的第一件事不是写业务代码而是把工具链、下载器、串口终端这三样跑通。工具链方面确认编译器版本和官方例程匹配很多奇怪的编译错误其实是版本不一致导致的。下载器方面先确认能读到芯片的ID读不到就检查接线、供电、调试口是否被程序禁用。串口终端方面先确认能收到芯片发出的任意字节哪怕是乱码有字节就说明物理链路通了。这里的顺序很重要先证明“我能把代码放进去”再证明“代码能跑起来”最后才证明“代码跑得对”。我见过不少新手跳过前两步直接调业务逻辑结果卡了三天最后发现是下载器驱动没装好。新建工程的时候我建议从官方提供的最小工程模板改不要自己从零建。链接脚本、启动文件、系统初始化这些内容官方已经调好了你自己重写一遍大概率会漏东西。你要做的是读懂它而不是重造它。读懂的标准是能说清楚启动文件里那段汇编干了什么、链接脚本里每一段内存分配给了谁。4.2 最小系统验证的五步顺序我把上手验证固定成五步每步都有明确的通过标准任何一步不通过就不往下走。第一步供电与基础检查。不插下载器只上电测量各路电压是否正常复位脚是否为高晶振是否起振。这一步不用写代码但能排掉一半的硬件问题。第二步下载与运行。烧一个最简单的程序进去让一个引脚周期性翻转。通过标准是用示波器或万用表能看到电平变化。这一步验证的是下载链路和启动配置。第三步时钟确认。把系统时钟输出到某个引脚测量频率是否等于你配置的值。通过标准是误差在晶振精度范围内。这一步验证的是时钟树配置。第四步串口通信。配置串口打印一段固定字符串通过标准是终端上看到的字符完全正确没有乱码。这一步验证的是时钟、波特率计算、引脚复用三件事同时正确。第五步中断与定时器。配置一个定时器中断在中断里翻转另一个引脚通过标准是示波器上看到稳定的方波周期等于设定值。这一步验证的是中断向量表、中断优先级、定时器配置。这五步全过说明你的最小系统是健康的后面不管加什么外设出问题都能排除掉基础层面的原因。这套流程看着笨但我每次换新平台都这么走一遍平均两小时能省掉后面好几天的怀疑人生。4.3 参数计算实操波特率和定时器别靠猜串口波特率的计算值得单独说一下因为这是新手最常算错的地方。以常见的16倍过采样为例分频值等于外设时钟除以16乘以目标波特率。假设你的串口挂在84MHz的总线上目标波特率115200那么分频值等于84000000除以16乘以115200结果约等于45.57。整数部分是45小数部分是0.57乘以16得到约9.1取9。实际分频值是45加9/16也就是45.5625。反算实际波特率用84000000除以16乘以45.5625得到约115226跟目标的115200相比误差约0.02%远小于串口能容忍的2%到3%所以通信是可靠的。如果你偷懒直接填45实际波特率变成116666误差1.27%勉强能用但接近临界如果你把总线频率记错了比如实际是42MHz你按84MHz算误差直接50%收到的全是乱码。所以算完一定要反算一遍用实际分频值回推实际波特率看误差在不在安全范围内。这个习惯我在每个项目里都保留着五分钟的事能省掉半天排查。定时器的计算同理。假设你要一个1kHz的中断定时器时钟是84MHz预分频设为84计数器时钟变成1MHz自动重装值设为999那么每1000个计数溢出一次正好1ms。这里容易错的是“自动重装值到底是999还是1000”因为计数器从0数到999是1000个数想要1ms就填999。差一个数看起来无所谓但如果你的系统靠这个定时器做累积计时一天下来就差了86秒。4.4 功耗实测与优化别信手册信你自己的表低功耗是选型时被提得最多、实测时被坑得最惨的一项。手册上写的“休眠电流0.5微安”通常是在特定条件下测的所有外设关闭、所有引脚配置成模拟输入、电压精确到小数点后两位、温度25度。你的实际板子上有指示灯、有稳压器静态电流、有上拉电阻、有外部传感器实测下来可能是几十微安甚至上百微安。我的做法是做一个简单的功耗模型列出设备的所有工作状态测出每个状态的电流和持续时间算加权平均。比如一个传感器节点每秒唤醒一次唤醒后工作10毫秒电流8毫安其余时间休眠电流5微安。那么平均电流等于10毫秒乘以8毫安加上990毫秒乘以0.005毫安除以1000毫秒结果是0.085毫安也就是85微安。用一块2000毫安时的电池供电理论续航约两万三千小时接近两年八个月。这个算法很粗糙但足够你在选型阶段做横向对比。优化的时候按影响大小排序第一是缩短唤醒时间能10毫秒干完的事别拖到50毫秒第二是降低休眠电流把不用的外设时钟全关、引脚配成模拟输入、指示灯能拆就拆第三才是考虑换更低功耗的芯片。我见过太多人一上来就换芯片结果换了之后休眠电流只降了10微安因为板上那颗稳压器的静态电流就有几十微安换芯片根本解决不了。5. 常见问题与排查实录5.1 下载失败和“下载成功但不运行”下载失败先分两类连不上芯片和连上了但烧写报错。连不上芯片检查顺序是供电、地线、调试口接线、复位状态、芯片是否被设置了读保护。有一种很坑的情况是程序里把调试用的两个引脚复用成了普通GPIO烧进去之后就再也连不上了只能靠启动模式跳线进入特殊启动模式才能救回来。所以我在任何项目里都会在代码注释里写明“调试引脚不可复用”并且尽量在硬件上留一个跳线帽。“下载成功但不运行”这类问题我的排查顺序是一看启动配置芯片到底从哪块存储启动二看复位后第一条指令的地址对不对链接脚本里的起始地址和实际存储映射是否一致三看时钟芯片是不是因为晶振不起振退到了内部时钟导致初始化里某个等待超时的循环永远等不到四看栈顶地址启动文件里设置的初始栈指针是否指向了合法的RAM区域。这四条查完九成问题能定位。还有一个容易被忽略的点有些芯片在低电压或者低温下擦写Flash会失败但调试器只报“校验错误”不报具体原因。如果一批板子里只有个别出现这个问题先怀疑硬件用可调电源把电压调低一点复现一下能复现就是电源设计余量不够。5.2 串口乱码与通信异常串口乱码几乎是最常见的求助帖原因基本集中在四个方向波特率算错、时钟源不对、电平不匹配、接地没接。前两个前面讲过了重点说后两个。电平不匹配指的是芯片串口输出的是3.3V逻辑电平你接到一个需要5V逻辑或者需要RS232负逻辑的设备上物理层就不通必须加电平转换芯片。接地问题更隐蔽两块板子各自用独立的电源只连了信号线没连地线通信时好时坏接上地线立刻稳定。还有一种“偶尔丢字节”的情况通常是接收缓冲区溢出。中断里收到一个字节就往缓冲区塞主循环处理得慢缓冲区满了新数据就覆盖旧数据。解决办法是加大环形缓冲区并且在设计上让处理速度跟得上接收速度或者加硬件流控。我在调试阶段会在缓冲区溢出时翻转一个引脚用示波器一看就知道是不是溢出导致的丢数据比在代码里加打印快得多。SPI和I2C的问题也有共性。SPI通信距离一长、速率一高就容易出错杜邦线超过二十厘米、时钟上到十几兆基本就别指望稳定了要么降速要么改成差分或者用板内连接。I2C最常见的问题是上拉电阻总线上设备多、走线长上拉阻值太大上升沿变缓波形变成圆角通信就失败。标准是4.7kΩ长线可以降到2.2kΩ但阻值太小会增加功耗得权衡。5.3 偶发死机与硬件异常的定位思路偶发死机是最难查的一类因为它不可复现。我的第一原则是一定要让死机留下证据。具体做法是配置硬件异常处理函数在里面把程序计数器、链接寄存器、栈指针、异常类型全部读出来存到一个不被清零的内存区然后让一个指示灯快闪。下次死机的时候接上调试器读那块内存或者干脆用串口在复位后打印上次的死机信息。拿到程序计数器的值之后对照编译生成的映射文件和反汇编就能定位到出问题的函数和指令。如果地址落在一个数据区而不是代码区基本可以判断是函数指针被踩了或者栈溢出。如果异常类型是总线错误重点查是不是访问了非法地址或者未对齐访问有些内核不支持非对齐访问你把一个指针强制转换之后按四字节读地址不是四的倍数直接就异常。栈溢出的排查有个简单办法在启动时把整个栈空间填成一个固定图案比如全填0xAA运行一段时间后从栈底往上扫看从哪里开始被改掉就能算出实际用了多少栈。这个方法我在每个项目里都用能直观看到栈的使用水位比凭感觉设栈大小靠谱得多。5.4 硬件层面的坑地、纹波与静电软件查不出来的时候就得往硬件上看。第一个要看的是地。数字地、模拟地、功率地如果混在一起走大电流回路的压降会叠加到小信号上ADC采样值乱跳就是这么来的。正确的做法是单点接地模拟部分单独铺地最后在电源入口处汇合。这条经验是拿无数次跳动的采样值换来的。第二个要看的是电源纹波。开关电源的输出纹波如果超过芯片能容忍的范围各种奇怪现象都会出现通信误码、ADC精度下降、偶尔复位。用示波器看电源脚把带宽限制打开、用弹簧地线短接测量别用长地线夹否则测到的全是空间干扰。纹波大的话加LC滤波或者换低噪声的稳压器。第三个是静电和浪涌。接口引到机壳外面的设备没有静电保护器件在干燥季节摸一下就可能打坏芯片表现是某个引脚永久失效。成本上增加几毛钱的保护器件能省掉大量售后。这个投入我认为在所有硬件设计里性价比最高。6. 几条我踩过坑之后才明白的事选型这件事我现在的顺序是先看“这个平台能不能让我在两天内跑通最小系统”再看参数。参数漂亮的平台如果工具链难用、文档缺失、社区冷清你的时间会全部消耗在环境问题上项目进度根本推不动。反过来生态成熟的平台哪怕主频低一点、内存小一点你也能靠优化把活干完。第二个体会是“留一层抽象”。不管项目多小我都会把硬件相关的操作包一层接口点灯是一个函数读传感器是一个函数串口发送是一个函数。上层业务只调这些函数不碰寄存器。这层抽象前期多写两百行代码换芯片、换板子的时候能救你一命。我做过一个项目中途换平台因为这一层在业务代码一行没改只重写了驱动层三天完成迁移。第三个体会是“先测量再优化”。性能不够就换芯片、功耗超标就加电池这种拍脑袋的决策往往花了大钱没解决问题。拿示波器量一下中断执行时间拿电流表量一下各状态电流拿逻辑分析仪看一下总线时序数据出来了问题往往比想象的简单。我见过一个项目为了降功耗换了三代芯片最后发现是一颗指示灯常亮吃掉了大半预算拆掉就达标了。最后分享一个很土但极其有效的小技巧给每块新板子建一个“板子档案”里面放原理图、引脚分配表、时钟配置图、实测功耗表、已知问题和解决办法。半年后你再拿起这块板子或者同事接手你的项目这份档案能省掉重新摸索的全部时间。我手上现在有十几份这样的档案每次开新项目翻一翻比搜任何资料都快。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →