
这东西我是真放不下。STK500这个老伙计从Atmel时代一路用到Microchip时代别人早换成各种USB高速调试器了我还在串口线上跟它打交道。圈里不少人觉得它老掉牙但实际用下来你就会发现它支持AVR全系列芯片的ISP和高压并行编程光这一条就足够让它到今天都不过时。这篇东西就是写给那些手里有块吃灰的STK500、或者正在纠结要不要收一块二手板子的人看的。1. 老将出马STK500的定位和它为什么还活着1.1 先聊聊这块板的真实身份STK500是Atmel在2000年前后推出的AVR开发板兼编程器。它被设计成一个“全功能评估平台”板子上焊着各种跳线、LED、按键、DIP插座、扩展排针既能直接插入芯片做裸机调试又能通过ISP接口给目标板烧录程序。关键的是它支持当时几乎所有AVR系列芯片ATmega、ATtiny、AT90从8引脚的小芯片到40引脚的ATmega128都能伺候。在2000年代初这就是AVR爱好者的顶配装备。放到今天看STK500仍然有它的不可替代性。现代调试工具基本都往“小巧、高速、廉价”走但代价是兼容性收窄。比如很多USBASP只支持AVR ISPAVR Dragon虽然全能却停产多年原厂新出的工具要么只支持较新的XMEGA和AVR-DA要么价格高得劝退学生党。而STK500集齐了ISP、HVPP高压并行编程、HVSP高压串行编程几乎把AVR历史上所有编程模式都包圆了用它处理一块上古ATmega8或者新出的、还在用老烧录协议的芯片一个板子全搞定。1.2 今天用STK500到底图它什么我最近一次把它从箱底翻出来是因为要做一批ATmega328P的量产烧录。这批芯片熔丝位需要设置成外部晶振模式Bootloader也要一并写入。手头其他工具折腾来折腾去要么只能烧Intel HEX文件、不管熔丝要么对老芯片支持不全。STK500配合AVRDUDE一行命令擦除、烧Flash、写EEPROM、改熔丝位一步到位十分钟内干完20片。效率反而比那些功能花哨的新工具高。还有一个很现实的原因成本。二手市场上STK500的价格现在已经被打到很低的水平一块功能正常的裸板加一根串口线总花费可能还不到一杯咖啡钱。几乎任何玩AVR的人都能负担得起。相比之下原厂或者第三方USB编程器动辄几百块起步。而如果你手头还有一批老AVR芯片库存STK500绝对是你最保险的备份方案。2. 拆开看板载资源与协议背后的设计逻辑2.1 板子和接口都是干嘛用的STK500的正面从左到右一堆东西。先说最核心的几块中央的DIP40插座基本覆盖了40脚以内的AVR芯片旁边还有一个6针的ISP排针用于连接目标板。板载资源包括8个LED、8个按键、一个电位器、一个RS232串口、一个并口并行编程用、一个电源插座。这设计思路在当时很超前一个板子同时充当开发板、编程器、IO测试平台。要注意的一个细节是电源接口。STK500外部供电范围是10V15V DC板载一颗7805稳压芯片降到5V给逻辑电路供电。这个设计直接影响你后面接目标板的方式。如果你给目标板供电也依赖STK500的VTG引脚那外接电源必须足够稳定否则烧录过程中电压跌落会造成校验错误。我习惯用一个独立的5V电源给目标板供电STK500只负责编程信号这样互相不干扰省掉很多排查时间。2.2 ISP、HVPP、HVSP三种编程模式的理解很多人只把STK500当成一个ISP编程器这就局限了。完整了解它支持的三种模式你才能在手头芯片遇到极端情况时处理自救。ISPIn-System Programming在系统编程通过SPI接口的MOSI、MISO、SCK、RESET四条线就能烧录。AVR芯片出厂时默认启用ISP除非你主动把熔丝位中的SPIEN关掉。这是日常最常用的模式多数情况下一根6芯排线就搞定。HVPPHigh-Voltage Parallel Programming高压并行编程把RESET引脚拉到12V配合并口数据线对芯片编程。用于那些熔丝位配置错误导致ISP失效的芯片最常见的就是你把RESET引脚配置成了普通IO口芯片从此进入“锁死”状态。STK500板载了完整的复位电压电路和并口接口可以直接对付这种芯片。HVSPHigh-Voltage Serial Programming高压串行编程原理类似HVPP但用于8引脚小封装芯片这些芯片没有足够的引脚供并行编程使用只能通过串行数据线配合高压复位信号来恢复。理解了这三者的区别你就明白了为什么STK500在芯片变砖自救这件事上比绝大多数USB编程器都靠谱——它们只支持ISP一种模式一旦芯片ISP被熔丝锁死只能干瞪眼。2.3 STK500通信协议v1和v2到底怎么选AVRDUDE里与STK500相关的配置有两个stk500v1和stk500v2。这不是随便选择的它们的差异主要体现在底层通信速度和命令集上。STK500原厂固件默认走的是stk500v1协议波特率设置常见为115200或19200具体看固件版本和跳线设置。而stk500v2则是后来AVRISP mkII等设备采用的协议命令握手和数据帧格式都有变化。实际插上STK500到电脑上AVRDUDE自动识别到串口但如果你用的是默认参数大概率会报stk500_recv(): programmer is not responding。这时候别慌大概率就是协议和波特率不匹配。先试试-c stk500v1 -b 19200不行再试-b 115200再不行检查串口线是直连线还是交叉线。这个我后面在常见问题里还会详细说。3. 现代电脑上重新启用STK500的完整实操3.1 硬件连接串口、USB转串口、电源怎么接STK500原生接口是DB9串口和DB25并口。现在绝大多数电脑都没有串口并口所以你需要一根USB转串口线。这里有个关键点STK500的串口要求的是标准RS232电平不是TTL电平。所以你不能拿一块常见的CH340/CP2102模块直接怼上去必须用带电平转换芯片的USB-RS232线也就是那种一头USB、一头DB9公头的成品线。注意很多USB转串口线标称支持RS232但实际用的是TTL电平这种接到STK500上会出现信号乱码或者完全没响应。判断方法很简单看DB9口的2、3脚电平RS232标准的空闲电平是负电压-3V到-15VTTL空闲电平是正电压3.3V或5V。用万用表测一下最稳妥。接线顺序建议这样先把USB转串口线插到电脑确认系统识别出COM口Windows设备管理器里看Linux下用ls /dev/ttyUSB*。将USB转串口线的DB9公头连接到STK500的DB9母头注意2、3脚要交叉。绝大多数成品线已经是交叉好的直接用即可。给STK500接12V直流电源确认电源指示灯亮起。在DIP40插座上插入目标芯片或者用6针ISP线连接外部目标板。然后才是打开终端软件或者直接跑AVRDUDE命令。我自己是用了一根FTDI芯片的USB-RS232线稳定度很好。之前试过几根十几块钱的线要么丢数据要么波特率高一点就乱码烧录过程中断得让人抓狂。3.2 驱动与串口识别电脑这端需要准备什么在Windows下只要USB转串口线用的是常见芯片FTDI、CH340、PL2303系统会自动安装或者提示安装驱动。安装完看设备管理器找到对应的COM号。注意STK500的固件版本不同对波特率有不同要求而USB转串口线默认的波特率可以设置成与STK500匹配一般设成19200或者115200这是通过设备管理器端口设置里能改的。Linux下更简单大概率免驱插上后dmesg | tail能看到设备节点一般是/dev/ttyUSB0。但要注意权限问题普通用户无法直接访问串口设备。我通常把当前用户加入dialout组sudo usermod -a -G dialout $USER改完需要重新登录一次才生效。还有个小坑有些系统默认把ttyUSB0的串口参数设置得比较激进比如流控默认开启而你串口线上可能没有接流控线结果就是数据卡死。用stty -F /dev/ttyUSB0 -crtscts把硬件流控关掉能少很多麻烦。3.3 AVRDUDE参数还不明白逐项拆给你看AVRDUDE是AVR编程的事实标准工具它支持的编程器列表里有stk500v1、stk500v2等多个STK500相关配置。我平时用的命令模板是这样avrdude -c stk500v1 -p m328p -P /dev/ttyUSB0 -b 19200 -U flash:w:main.hex:i逐项说明一下-c stk500v1指定编程器类型为STK500 v1协议。如果你的STK500固件比较新刷过v2协议也可以试试-c stk500v2。-p m328p目标芯片型号。AVRDUDE对芯片型号有自己的一套缩略命名m328p对应ATmega328Pm8对应ATmega8t85对应ATtiny85。不确定的话可以用avrdude -p ?查看完整列表。-P /dev/ttyUSB0指定串口设备。Windows下写-P com3。-b 19200波特率必须与STK500当前设置一致。-U flash:w:main.hex:i操作目标为Flashw表示写入main.hex是文件名i表示Intel HEX格式。写熔丝位用类似的语法把flash换成lfuse或者hfuseavrdude -c stk500v1 -p m328p -P /dev/ttyUSB0 -b 19200 -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m参数里的m表示直接写入字节值。这个操作有风险改动之前一定要对着芯片数据手册把熔丝位含义查清楚别拍脑袋写。3.4 完整烧录流程从空片到能跑的固件假设我现在要把一个空白ATmega328P配置成Arduino Uno的等效环境整个过程如下第一步插上芯片确认供电和串口都正常先跑一个读操作确认通信建立avrdude -c stk500v1 -p m328p -P /dev/ttyUSB0 -b 19200正常情况下会输出类似AVR device initialized and ready to accept instructions的信息。看到这个说明你的STK500和电脑已经建立了可靠通信。第二步写熔丝位。对于外部16MHz晶振Arduino Uno的熔丝通常设为低0xFF、高0xDE。但注意如果你的板子用的是内部8MHz RC振荡器就不要这么设而是要写成低0xE2、高0xD9。这一个区别我在不少项目里见人翻过车芯片写完之后跑起来极其不稳定因为内部振荡器精度不够。第三步写入Bootloader。Arduino环境里你烧的是optiboot_atmega328.hexavrdude -c stk500v1 -p m328p -P /dev/ttyUSB0 -b 19200 -U flash:w:optiboot_atmega328.hex:i第四步擦除重新设置熔丝位中的BOOTRST位如果需要从Bootloader启动最后写入用户程序。如果你只是想直接烧一个普通固件不需要Bootloader那就跳过第三步擦除后直接写入main.hex即可。整个流程走下来你会发现STK500并没有想象中那么慢。虽然理论上下载速度不如USB编程器快但我用的时候32KB的Flash从擦除到写入完成大概也就十几秒完全够用。4. 实战中的坑与排查STK500的疑难杂症速查4.1 串口通信不上先别急着怀疑板子坏了最典型的症状就是stk500_recv(): programmer is not responding。这个报错的原因千奇百怪但按概率排大部分就这几类波特率错误。STK500默认通信波特率有的固件是19200有的是115200还有极少数是9600。逐个试一遍就知道了。我甚至见过有人用38400也能通的属于固件被改过。USB转串口线质量差。我之前提到过这种线便宜没好货建议直接上FTDI主控的。CH340不是不能用但有些CH340线在115200下时序漂移严重导致每帧都报错。串口被占用。如果你开了串口监视器、Arduino IDE的串口绘图、或者其他任何占用该COM口的程序AVRDUDE当然连不上。关掉它们再试。电源问题。STK500没有电源指示灯那先查电源适配器吧低于10V的适配器带不动7805会进入欠压保护。我的一个排查习惯是先跑一个简单的AVRDUDE读签名操作不带任何写入参数确认通信链路没问题再往前推进。这样可以把故障限定在“通信”还是“烧录”两个层面不会越排查越乱。4.2 目标芯片供电不统一引发的诡异现象STK500的ISP接口上有个VTG引脚它的作用是把目标板的供电电压反馈给STK500让逻辑电平能跟随目标板电压。这设计的初衷是支持3.3V和5V混合系统但实际操作中如果目标板没供电或者供电电压不稳VTG检测异常STK500可能会拒绝进入编程模式。比较典型的场景是目标板上有自己的电源开关烧录时忘了开然后AVRDUDE报target is not powered一类的错误。或者你用了多个电源适配器目标板和STK500的GND没共地导致电平参考不一致。解决方案很简单把GND接好确保目标板上电然后用万用表确认VTG引脚上确实有目标板的电压。还有一个容易被忽略的问题如果你用STK500自带电源给目标板供电而目标板电流需求比较大比如接了几个高亮LEDSTK500板载7805可能会过热保护输出跌落到4.5V以下芯片工作不稳定烧录时校验出错。这时候果断改用独立电源供电STK500只接编程信号线一点问题都没有。4.3 熔丝位操作失误导致芯片“变砖”的急救流程熔丝位改错是玩AVR最经典的翻车场景。最常见的错误是改了RSTDISBL熔丝位把RESET引脚变成了普通IO口从此ISP进不去了。还有的把SPIEN关掉了同样锁死ISP。STK500的高压并行编程这时候就是救命稻草。以ATmega328P为例急救流程是这样的把芯片从目标板上拆下来插到STK500的DIP40插座上。根据引脚对应关系把芯片的RESET、VCC、GND以及并口数据线、控制线通过跳线接到STK500的HVPP接口。这一步要仔细查STK500说明书上的引脚映射表。使用AVRDUDE指定HVPP编程器类型avrdude -c stk500pp -p m328p -P /dev/ttyUSB0 -b 19200注意这里-c参数变成了stk500pp而不是stk500v1因为走的是并行编程协议。先执行擦除avrdude -c stk500pp -p m328p -P /dev/ttyUSB0 -b 19200 -e擦除成功后马上重新写入正确熔丝位avrdude -c stk500pp -p m328p -P /dev/ttyUSB0 -b 19200 -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m之后芯片就恢复ISP可用了。整个过程不复杂核心就是别慌按步骤来。特别提醒高压并行编程对引脚连接的正确性要求极高一旦接错轻则烧录失败重则可能损坏芯片引脚或者STK500并口驱动电路。接完线之后先用万用表逐个确认引脚连通性再上电操作。我就是有一次偷懒没查结果芯片直接冒烟了教训深刻。5. 工具选型STK500与常见现代编程器的横向对比5.1 STK500 vs USBASPUSBASP应该是最常见的DIY AVR编程器基于ATmega8或ATmega48实现价格在十几块到三十块之间支持ISP协议在Arduino社区用得很多。它的优点是便宜、小巧、烧录速度快通过SPI接口固件优化的好的话能跑到几百kbps。缺点也很明显不支持高压编程、不支持并行编程、对芯片电压的适应能力弱而且由于是DIY方案固件水平参差不齐有的连擦除都容易出错。STK500在这几个维度上全面领先高压编程能力、芯片宽电压适应、原厂硬件品质保证。但价格和体积没有优势。如果你只烧Arduino Uno这类ATmega328PUSBASP完全够用如果你要处理一堆老芯片、要变砖自救STK500才是全能工具。5.2 STK500 vs AVR DragonAVR Dragon是Atmel官方推出的低价编程器/调试器支持ISP、HVPP、HVSP、JTAG、debugWIRE几乎覆盖了STK500的所有功能还多了调试接口。它一度是STK500的完美继任者但问题是已经停产多年市面上流出的多是二手货且固件不再更新在新电脑上装驱动的体验很差部分型号在Windows 10以上系统直接不识别。STK500虽然没有调试功能但烧录功能扎实二手货源充足各操作系统下都有成熟的驱动和工具链支持。对于纯烧录场景STK500的实际体验反而优于Dragon。5.3 STK500 vs 现代USB调试器Atmel-ICE等Atmel-ICE是原厂现役主力调试器支持所有主流AVR系列支持调试和烧录USB接口即插即用。它的优点是速度快、功能全、软件兼容性好缺点是价格硬伤官方渠道价格四位数人民币对业余爱好者来说性价比堪忧。相比之下STK500价格几乎可以忽略不计而且它支持并口编程这一点在工程现场有独特的价值——很多老产线、老设备只预留了并口编程接口现代工具反而接不上。我见到过不止一个工厂里工程师翻出吃灰的STK500来救急。5.4 怎么选一张表总结对比项STK500USBASPAVR DragonAtmel-ICE价格二手/全新极低极低中等高接口串口/并口USBUSBUSBISP编程支持支持支持支持HVPP/HVSP支持不支持支持部分型号支持JTAG/debugWIRE不支持不支持支持支持电脑兼容性串口方案成熟依赖驱动Win10有坑官方持续更新适合场景老芯片、量产、自救日常Arduino烧录中古全功能新项目高阶调试看完这个表你就明白为什么STK500到今天还能在圈子里拥有一席之地。它不是一个全能冠军但在烧录这个垂直场景里它几乎是无死角的可靠选择。我个人的观点是如果预算只允许买一个编程器STK500是综合性价比最高的选择如果预算宽裕可以入一个现代调试器负责新芯片开发再囤一个STK500负责老芯片和应急恢复两个互补基本无敌。6. 几点心得我现在怎么用STK500最后说说我目前的工作流算是对前面内容的一个小结也分享一点比较私人的经验。我现在不会把STK500当成主力日常烧录工具毕竟速度确实不如现代USB编程器。但我会把它放在手边承担两类工作一类是量产烧录一块块往DIP40座里插芯片配合AVRDUDE脚本批量跑稳定可靠另一类是出问题时的救火队员任何芯片只要没物理损坏我都有信心用STK500给它救回来。使用中还有一个习惯就是给STK500单独准备一根优质串口线和一个稳压电源不去用那些乱糟糟的充电头。这块板的供电设计虽然皮实但对串口信号质量还是挺敏感的线材不好时偶尔会出奇怪的时序错误别让这成了你的瓶颈。如果你最近刚得到一块STK500别急着因为它没有USB接口就判它死刑。花点时间把USB转RS232线备好把AVRDUDE参数摸熟你会发现它依然是个非常能打的工具能陪你走很远。