ATtiny13开发板实战:最小系统、熔丝位与ISP烧写避坑

发布时间:2026/10/26 3:20:47
ATtiny13开发板实战:最小系统、熔丝位与ISP烧写避坑 简介这是一份面向AVR单片机初学者、电子爱好者和嵌入式课程实践者的ATtiny13开发板配套资料包围绕超小型8位微控制器的硬件认知、程序编写与调试展开适合智能家居、物联网小设备及教学实验等场景。压缩包共237个文件、约12.49MB包含C源码、工程与配置类文件、HEX烧录文件、列表与调试输出以及PDF原理图和中文数据手册便于从电路设计到固件验证形成完整学习链路。现有280人学习下载说明其在入门级AVR开发中具有一定参考价值。资料中的示例覆盖PWM调光、按键检测、定时器、ADC采集等典型实验并涉及ISP编程、Atmel Studio与Arduino IDE开发方式可帮助读者理解寄存器配置、中断与定时/计数器的使用并借助原理图排查电源、晶振和编程接口问题快速搭建自己的ATtiny13实验平台。1. ATtiny13 开发板资料到底解决了什么8 个引脚的芯片值不值得开工拿到一份 ATtiny13 开发板资料后很多人第一件事是找原理图对引脚第二件事就卡在熔丝位上再往后连“程序到底跑没跑”都判断不了。这颗 8 脚芯片的规格清单很严苛1KB flash、64 字节 SRAM、64 字节 EEPROM、没有硬件串口、没有外部晶振引脚、装不下 bootloader引脚之间还存在固定的复用冲突。它做不了复杂的事但也正因为做不了一块开发板配一套能用的资料反而能把“最小系统”这件事的每个细节都暴露清楚去耦、复位上拉、ISP 线序、时钟源、代码体积。这份资料真正解决的问题不是“教你点灯”而是让你在一块只有 8 个脚、烧错一个熔丝位就可能锁死芯片的板子上把从硬件核对到烧写验证的整条链路走通。适合两类人手上已经有板子、想把它真正用起来的人以及正准备照着资料自己画一块的人。下面按实际使用顺序推演先核硬件再定熔丝然后建工程、烧程序最后把几种会让芯片无法正常使用的情况和恢复办法说干净。2. 拆开资料包先核对硬件原理图、BOM、ISP 排针三处最容易出错一份开发板资料里原理图和 BOM 是最容易被跳过、也最容易出问题的两份文件。资料里写的是“最小系统”但真正让人出问题的从来不是主控而是去耦电容放在哪、复位脚上并了什么、ISP 排针的 1 脚到底是不是 MISO。这一章按“板子拿到手后第一小时该做什么”来推进。2.1 原理图上必须逐个核对的五个节点第一个节点是电源去耦。ATtiny13 的 VCC 是第 8 脚、GND 是第 4 脚这两个脚之间必须有一个 100nF 的陶瓷电容而且物理位置要贴着芯片。资料里的原理图通常会画但画在图纸角落和画在芯片旁边是两回事。我见过不少自制的板子把电容放在板子另一头跑 1.2MHz 时看着没事一切到 9.6MHz 就随机复位查了两天最后发现是去耦距离的问题这种事在现场真有点偶然性。第二个节点是复位脚。PB5 兼作 RESET外部必须有一个 10k 上拉电阻到 VCC。有些人图省事直接把复位脚接到一个按键上对地靠芯片内部上拉这样也能用但内部上拉阻值在 20k~50k 量级抗干扰能力差在电机或继电器旁边很容易随机复位。第三个节点是复位脚上的电容。这是最容易让编程失败的一处很多经典的最小系统图会在 RESET 和 GND 之间放一个 100nF 电容做 RC 复位。这个电容在人手复位时很舒服但对 ISP 编程是灾难——编程器要通过拉低 RESET 进入编程模式100nF 会让上升沿变缓编程时序直接对不上。资料里如果画了这个电容做板子时把它留成不焊的焊盘。第四个节点是 LED 的位置。PB0 是 MOSI、PB1 是 MISO这两个脚同时也是 ISP 编程用的数据线而绝大多数开发板把 LED 接在这两个脚上。后果是编程时 LED 会跟着数据闪并且如果限流电阻选得太小比如 220ΩLED 会把 MISO 电平拉偏导致校验偶尔失败。第五个节点是供电方式。板子上如果既有 ISP 排针的 VCC又有独立的电源座两路同时接就是两个电源打架。做板子时要么在 ISP 的 VCC 脚上串一个跳线帽或二极管要么明确写清楚“编程时拔掉板载电源”。引脚定义建议直接对着这张表核对别凭记忆引脚端口复用功能开发板上的常见接法1PB5ADC0 / PCINT5 / RESET10k 上拉到 VCC接 ISP 的 RESET2PB3ADC3 / PCINT3 / CLKI空置或接按键3PB4ADC2 / PCINT4空置适合外接传感器4GND—地5PB0MOSI / OC0A / AIN0 / PCINT0LED 或 ISP 的 MOSI6PB1MISO / OC0B / AIN1 / PCINT1LED 或 ISP 的 MISO7PB2SCK / ADC1 / T0 / PCINT2ISP 的 SCK8VCC—100nF 去耦到 GND注意 PB0、PB1、PB2 这三个脚一旦接了 ISP就不能再当普通 IO 随便用如果你要接 LED优先考虑 PB4 和 PB3它们没有编程复用。2.2 BOM 里最容易买错的两个器件资料里的 BOM 通常只有七八行但有两个位置买错会直接导致后面全部返工。第一个是主控的封装。同一颗型号常见三种封装DIP-8 直插、SOIC-8 贴片、更小的 MLF 封装。资料上如果是 DIP-8买到 SOIC 装不进 IC 座反过来更麻烦SOIC 焊盘上插不了直插。采购时看型号后缀不要只看前面的型号。第二个是去耦电容的封装。原理图上写 100nF 没问题但如果是 0402 封装手工焊基本是自找麻烦0805 才是手工板和小批量最舒服的尺寸。位号规格数量买错或焊错的后果U1ATtiny13ADIP-81封装不对装不进座买到早期版本电压范围略窄C1100nF X7R08051缺它高频下随机复位C210µF 电解或钽1缺它上电瞬间电压跌落导致反复重启R110k08051缺它复位脚浮空随机复位R2330Ω~1k08051~2太小拉偏 MISO太大 LED 不亮J12×3 排针 2.54mm1间距错 1.27mm编程器插不上U2可选 LDO 3.3V1用 5V 直供时省略但电池供电必须有还有一个隐性风险散装芯片的熔丝位可能被前一个用户改过。新片出厂是 0x6A/0xFF但二手料里出现被改成 128kHz 甚至关掉 SPIEN 的情况并不罕见。所以拿到板子的第一件事不是烧程序是先读熔丝。2.3 六针 ISP 排针的线序与万用表自检标准 6 针 ISP 的线序是固定的但市面上确实存在“厂家自定义线序”的板子插反了轻则不通信重则把编程器的 5V 灌到 GND 上。动手前用万用表通断档一针一针量到芯片对应的物理引脚比对着丝印猜要可靠得多。标准线序如下排针脚信号对应芯片引脚1MISO6PB12VCC83SCK7PB24MOSI5PB05RESET1PB56GND4自检按这四步走全部通过再上电断电状态下量通断。万用表蜂鸣档红表笔固定在一个排针脚上黑表笔依次点芯片引脚确认每个信号只对应一个脚且没有相邻短路。量 VCC 与 GND 之间的电阻。正常应该在几百欧以上受板上其他器件影响如果读数低于 100Ω说明有短路别上电。上电测电压。VCC 对 GND 应该是 5.0V±0.25V 或 3.3V±0.15V具体看板上稳压。电压偏低常见原因是 USB 供电线太细或 LDO 压差不够。量 RESET 脚电压。正常状态下它应该等于 VCC被上拉如果读到 0V 或者 2V 左右的中间值说明上拉电阻没焊或有漏电。这四步做完硬件这一层基本就没有暗病了。后面所有的“烧不进去”“跑不起来”都可以排除掉板子本身的物理问题。3. 熔丝位是这颗芯片的关键配置区时钟、分频、复位功能怎么设熔丝位是 ATtiny13 上最容易被误解的部分。它不是“配置项”而是一次性写进芯片、断电不丢、写错了可能连编程接口都一起关掉的东西。这一章把默认值拆开、给三条能直接抄的命令、再把时钟档位的取舍讲清楚。3.1 默认的 0x6A / 0xFF 分别意味着什么新片的低字节默认是 0x6A高字节默认是 0xFF。很多人看到 0x6A 就以为是 9.6MHz其实不是。把 0x6A 展开成二进制 0110 1010从高位到低位对应位名称值含义7CKDIV80使能 8 分频6~5SUT1..011最慢的启动延时保守但安全4保留0不要动3~0CKSEL3..01010内部 9.6MHz RC 振荡器也就是说出厂状态下芯片实际跑的是 9.6MHz ÷ 8 1.2MHz。这个设计的用意很清楚让新片在任何供电条件下都能稳定启动用户需要高速时自己改。想把 9.6MHz 跑满把 CKDIV8 关掉即可低字节变成 0xF21111 0010。这一字节是后面所有延时、串口波特率、定时器计算的基础改它之前一定要先读出来备份。高字节默认 0xFF 全 1意味着各位都处于“未编程”状态。这里只需要记住三条RSTDISBL 处于未使能状态复位脚还是复位脚SPIEN 在出厂时已经编程好这就是新片能直接 ISP 烧写的原因EESAVE 未编程整片擦除时 EEPROM 会一起被清掉。3.2 用 avrdude 读、算、写熔丝的三条命令第一步永远是读不是写。读的时候如果目标板跑在 128kHz 或者已经改成了外部时钟编程时钟必须降下来否则连读都读不到报的是“目标无响应”很容易被误判成接线问题。# 读把当前两个字节的熔丝值打印成十六进制先存档 avrdude -c usbasp -p t13 -B 16 -U lfuse:r:-:h -U hfuse:r:-:h-B 16把 ISP 时钟周期设成 16µs约 62.5kHz这个速度对任何时钟配置的 ATtiny13 都够慢能捏住低速目标。慢一点只多花一两秒比反复试错强。# 干跑只连接、只计算不真正写入确认接线和参数都对 avrdude -c usbasp -p t13 -B 16 -U lfuse:w:0xF2:m -n-n是 dry run不会写芯片。这一步能验证“编程器连上了、芯片识别出来了、参数解析没问题”是写入前最后一道保险。# 写9.6MHz 不分频高字节保持出厂默认 avrdude -c usbasp -p t13 -B 16 -U lfuse:w:0xF2:m -U hfuse:w:0xFF:m-U lfuse:w:0xF2:m的含义是对 lfuse 执行写w操作值为 0xF2格式是立即数m。写完 avrdude 会自动回读校验看到 “avrdude done. Thank you.” 才算完。提示写熔丝的瞬间芯片会复位此时如果 PB0/PB1 上挂着 LED会看到一次不规则闪烁这是正常的不代表写失败。3.3 时钟档位怎么选9.6MHz、1.2MHz 还是 128kHzATtiny13 没有外部晶振引脚时钟只有三个来源内部 9.6MHz RC、内部 128kHz RC、外部时钟从 PB3 灌入。所有档位都是从这两个 RC 振荡器分频出来的所以选择本质上是在“速度”和“功耗”之间做取舍。配置低字节CPU 频率最低工作电压典型电流适用场景9.6MHz 不分频0xF29.6MHz2.7V毫安级软串口、需要精确定时、跑算法1.2MHz出厂0x6A1.2MHz1.8V几百微安通用绝大多数项目够用128kHz 不分频0xF1128kHz1.8V十微安量级电池常开、只做周期性采样选 9.6MHz 有两个前提。一是供电必须够手册给出的频率—电压关系是阶梯状的9.6MHz 要求 VCC 不低于 2.7V用 3V 纽扣电池直供时电压一旦跌到 2.6V 就会跑飞这时候必须把 BOD掉电检测打开。二是要接受精度问题内部 RC 振荡器出厂校准过但随温度漂移能到 ±10%做软串口时波特率误差会很明显通信距离一长就丢包。选 128kHz 的场景更明确只做“每几秒醒一次、读个传感器、再睡回去”的活。这个频率下指令执行慢得离谱一条_delay_ms(1000)编译出来的循环会占掉大量 flash所以延时要用定时器加睡眠来做不能靠空转。注意不同文档版本对 CKSEL 的编码描述存在差异改完时钟后如果行为不对先用定时器翻转一个 IO用示波器或逻辑分析仪量实际频率别只信计算。这是唯一可靠的做法。4. 从零建一个能编译的工程avr-gcc 最小框架与点灯验证资料包里如果带了示例代码通常是几个 .c 文件加一个 Makefile直接make就能出 hex。但真正要复现得知道每一行是干什么的。这一章从零搭一个最小工程把 Makefile 里必改的变量、点灯程序的寄存器写法、以及“没有串口怎么知道程序活着”讲清楚。4.1 Makefile 里必须改的四个变量工具链用 avr-gcc avr-libc avr-objcopy avrdude这是 AVR 平台上最通用的一套不需要额外安装包。# 芯片型号决定寄存器定义和指令集必须是 attiny13a MCU attiny13a # 主频必须和熔丝位一致否则所有 _delay_ms 都是错的 F_CPU 9600000UL # 目标文件名 TARGET blink # 编程器型号 PROGRAMMER usbasp CC avr-gcc OBJCOPY avr-objcopy CFLAGS -mmcu$(MCU) -DF_CPU$(F_CPU) -Os -Wall \ -ffunction-sections -fdata-sections LDFLAGS -mmcu$(MCU) -Wl,--gc-sections all: $(TARGET).hex $(TARGET).elf: main.c $(CC) $(CFLAGS) $(LDFLAGS) -o $ $^ $(TARGET).hex: $(TARGET).elf $(OBJCOPY) -O ihex -R .eeprom $ $ # 看 flash 和 RAM 占用1KB 的片子必须常看 size: $(TARGET).elf avr-size --mcu$(MCU) --formatavr $ # 烧写-B 8 表示 ISP 时钟 125kHz flash: $(TARGET).hex avrdude -c $(PROGRAMMER) -p t13 -B 8 -U flash:w:$:i四个变量里MCU和F_CPU是最关键的。F_CPU写错是最常见的“程序跑得慢 8 倍”的原因——代码按 9.6MHz 算延时芯片实际跑 1.2MHz闪灯周期就变成 8 秒而不是 1 秒。-Os是必须的1KB flash 上用-O0编出来的点灯程序能占掉三四百字节。-ffunction-sections加--gc-sections能把没调用的函数整段扔掉在这个容量下能省出可观空间。Makefile 的缩进必须是 Tab这一点从别处复制粘贴时最容易出问题报错是 “missing separator”看着莫名其妙。4.2 一个两百字节以内的点灯程序直接操作寄存器不用任何封装层这样体积最小、行为最可预测#include avr/io.h #include util/delay.h int main(void) { /* PB0 设为输出其余引脚保持输入减少意外驱动 */ DDRB | (1 PB0); for (;;) { PORTB | (1 PB0); /* 输出高电平LED 熄灭灌电流接法时相反 */ _delay_ms(500); PORTB ~(1 PB0); /* 输出低电平LED 点亮 */ _delay_ms(500); } }逻辑说明DDRB是方向寄存器置 1 为输出PORTB在输出模式下决定电平在输入模式下决定是否开内部上拉。程序段只有两个语句加两个延时编译出来大约 120~160 字节占 1KB 的六分之一剩下的空间留给真正的业务逻辑。_delay_ms有两个硬性约束参数必须是编译期常量且F_CPU必须准确定义。如果传一个变量进去编译器会报错或者悄悄生成一大坨浮点代码直接吃光 flash。延时精度也值得一提_delay_ms(500)在 9.6MHz 下的实际误差在 1% 量级做闪灯完全够但如果用来做软串口的位定时这点误差累积几个字节就会丢帧那时候必须改用定时器中断。4.3 烧写、回读比对以及没有串口时怎么确认程序活着烧写的命令前面已经出现在 Makefile 里单独执行是这样# 烧写并自动校验 avrdude -c usbasp -p t13 -B 8 -U flash:w:blink.hex:i # 把芯片里的内容读回来和源文件比字节数 avrdude -c usbasp -p t13 -B 8 -U flash:r:readback.hex:i-B 8把 ISP 时钟压到 125kHz 左右。芯片跑 1.2MHz 以上时用-B 8没问题如果芯片被改到 128kHz就必须用-B 16甚至更慢否则回报的是校验错误而不是“时钟太慢”。ATtiny13 没有硬件串口所以“程序有没有跑起来”不能靠打印。我一般用这三种办法按可靠性从低到高排第一种是闪灯节奏编码。正常启动闪 1 下进入主循环闪 2 下某个条件不满足闪 5 下。缺点是要盯着数容易数错。第二种是让某个 IO 输出固定频率方波。用一个定时器配一个引脚翻转示波器一量就知道频率对不对。这个方法同时能反推 CPU 实际频率——如果应该输出 1kHz 结果量到 125Hz说明熔丝位的 8 分频没关掉F_CPU的定义和实际不符。这是判断“熔丝位到底生效没有”唯一可靠的手段比看 avrdude 的回读值还准。第三种是电流法。程序正常跑和卡在死循环里功耗差别很小但如果程序进了掉电模式电流会掉到微安级用万用表串在电源上能明显看出来。这个方法在调低功耗时必用。5. 踩坑记录五种把 ATtiny13 弄成砖的方式和救回来的路径这一章是整篇里最该先看的部分。ATtiny13 的坑集中在“一旦写错就连不上”这一类而这类问题的共同点是错误发生在你按下回车的那一刻后果在你下一次想连它的时候才出现。5.1 现象avrdude 报初始化失败芯片完全无响应原因通常是三个之一目标板由编程器供电的同时板上还接了另一路电源两边电压打架ISP 六根线里有一根接反或虚焊RESET 脚上并了 100nF 以上的电容把编程时序的上升沿拉平了。解决顺序是先拔掉板载电源只留编程器供电再用万用表逐根量通断最后用烙铁把复位电容摘掉。这三步做完还是不行就把-B从 8 加到 16 甚至 32让时钟慢到目标能跟上。我遇到过一块板子所有检查都过了还是不认最后发现是排针的 3 脚和 4 脚在 PCB 上有一根 0.1mm 的毛刺搭在一起血泪经验是新板子到手先用放大镜看一眼排针焊盘。5.2 现象程序烧进去了但闪灯周期是预期的 8 倍原因是F_CPU的定义和熔丝位不一致。出厂芯片跑 1.2MHz而代码里写的是9600000UL所有基于_delay_ms的时序都慢了 8 倍。这个错误特别隐蔽因为程序确实在跑只是慢容易怀疑到硬件上。解决先读一次熔丝确认 CKDIV8 的状态再决定是改熔丝还是改F_CPU。我的习惯是两者必须一起改改完立刻用 4.3 节说的方波法验证一次别靠“看着差不多”。5.3 现象设了 RSTDISBL 之后再也连不上所有编程器都失效这是唯一一种真正意义上的“不可恢复”除非上高压并行编程。RSTDISBL 的作用是把 PB5 从复位脚变成普通 IO代价是芯片失去了进入串行编程模式的入口——编程器靠拉低 RESET 让芯片进入编程状态这个脚一旦不再是复位脚串行编程就彻底没门。救回来的唯一办法是高压并行编程在 RESET 脚上施加 12V同时按并行时序驱动另外几个引脚。这需要一个专门的恢复装置成本远高于一颗新芯片。所以我的做法很直接这颗片子上永远不碰 RSTDISBL需要多一个 IO 就去用 PB3、PB4。这是最该提前买好后悔药的地方——不是买设备是买“不动它”的纪律。5.4 现象编译报 region text overflowed by N bytes原因是 1KB 装不下。最常见的三个体积大户是printf系列函数、任何浮点运算、以及大块的常量数组。avr-libc 里带格式化的函数动辄几百字节在 1KB 的片子上是不可接受的。解决用-Os把所有printf换成自己写的最小整数转字符串十几行代码一百多字节彻底避免 float 和 double需要小数就放大成定点整数运算常量表能算就别存。改完用make size看占用我一般把 flash 控制在 85% 以内留出后续加功能的余地。5.5 现象LED 接在 PB0 或 PB1 上烧写时疯狂闪烁甚至校验失败原因是 PB0 是 MOSI、PB1 是 MISO编程时这两根线正在高速传数据LED 直接挂在上面对编程器来说就是额外负载。限流电阻越小拉偏越严重。表现为校验阶段偶尔报错重烧一次又能过很容易被当成编程器不稳定。解决把 LED 换到 PB3 或 PB4如果板子已经做死了就把限流电阻提到 1k 以上并且在烧写时断开 LED 那一路。顺带一提编程过程中 LED 闪是正常现象不代表程序在跑别拿它当调试信号。6. 把 1KB flash 用出花位操作、睡眠模式与低功耗的实测验证容量小反而能逼出好习惯。这一章讲两个具体技巧都是在 1KB 的框架内把性能和功耗压到极限时总结出来的。第一个是把所有 IO 操作写成寄存器直写。封装层的digitalWrite一类函数在 1KB 的片子上代价太高一次调用要走引脚编号判断、查表、位运算编出来几十字节执行要几十个周期。直接写PORTB | (1 PB0)只占两条指令。要频繁翻转的引脚还可以进一步用PORTB ^ (1 PB0)做异或翻转一条指令搞定。当代码里出现十几次 IO 操作时这种替换能省出上百字节。第二个是睡眠。ATtiny13 的掉电模式下主要耗电只剩漏电流手册标称的量级在微安以下比空闲模式低两个数量级。配上一个引脚变化中断做唤醒就是典型的电池常开方案#include avr/io.h #include avr/sleep.h #include avr/interrupt.h /* 引脚变化中断唤醒后什么都不用做回到主循环即可 */ ISR(PCINT0_vect) { } int main(void) { DDRB 0x00; /* 全部设为输入悬空引脚不要开上拉 */ PORTB 0x00; GIMSK | (1 PCIE); /* 使能引脚变化中断 */ PCMSK | (1 PCINT2); /* 只监听 PB2 p a hrefhttps://download.csdn.net/download/jkd_405/9943455 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询