
简介这份ATtiny13开发板资料面向嵌入式初学者与电子爱好者聚焦Atmel AVR系列超小型8位微控制器的入门与实战。ATtiny13具备1KB闪存、64B SRAM、128B EEPROM及内置8MHz RC振荡器常用于智能家居、物联网节点与教学项目。资源包共237个文件约12.49MB涵盖C源码、Makefile工程文件、汇编与链接脚本、编译中间产物、HEX固件、PDF手册及多个实例工程另附原理图与中文数据手册便于理解电源管理、编程接口与引脚功能。内容包含LED闪烁、按键检测、定时器、ADC采样与PWM调光等示例可帮助读者掌握ISP编程、中断配置及寄存器操作。已有279人学习下载适合希望从零搭建微型控制系统、快速上手AVR开发的读者参考实践。1. 从一颗八脚芯片说起ATtiny13开发板资料到底能帮你做什么如果你手头有一块只有 8 个引脚、Flash 仅 1KB 的 ATtiny13 开发板却不知道怎么把程序烧进去、熔丝位怎么配、为什么上电后毫无反应那这份 ATtiny13 开发板资料就是为你准备的。它围绕 Atmel现 MicrochipATtiny13/ATtiny13A 这颗经典低功耗 8 位 AVR 单片机整理了开发板原理图、示例工程、烧录工具配置和常见外设驱动代码。适合电子爱好者、嵌入式入门者以及需要做超低成本小控制器的工程师。这颗芯片资源极小没有硬件串口定时器和 ADC 都要精打细算所以资料里对寄存器配置和熔丝位的说明比一般开发板更细。下面我按“先搞懂芯片和工具链再动手烧录最后避坑”的顺序把这份资料拆开讲清楚。2. ATtiny13 的硬件底子与工具链选型为什么 1KB Flash 反而逼你写对每一行ATtiny13A 是这份资料的核心器件理解它的资源边界才能明白资料里那些“抠门”写法不是炫技而是被逼出来的。这一章先把芯片关键参数和开发环境选型讲透后面烧录和写代码才不会翻车。2.1 芯片资源与开发板引脚分布ATtiny13A 常见封装有 8 脚 PDIP 和 8 脚 SOIC开发板一般把 6 个 I/O 全部引出另外保留 VCC、GND 和复位脚。它的核心参数如下项目参数内核AVR 8 位 RISCFlash1KBSRAM64BEEPROM64B工作电压1.8V – 5.5V最高主频20MHzVCC≥4.5VADC4 通道 10 位定时器1 个 8 位 Timer0PWM2 路共用 Timer0通信无硬件 UART/SPI/I2C注意最后一行没有硬件串口。这意味着资料里如果出现“串口打印调试”那一定是软件模拟bit-bang或者干脆用 LED 闪灯代替。我一般建议新手先别碰软件串口1KB Flash 里塞一个软串口库剩下的空间可能连业务逻辑都放不下。开发板上的 6 个 I/O 分别是 PB0 到 PB5其中 PB5 同时是复位脚如果把它当普通 I/O 用就必须改熔丝位禁用复位功能这一步后面会专门讲也是新手最容易把芯片“锁死”的地方。2.2 工具链选型AVR-GCC 还是 Arduino IDE这份资料同时给了两种开发路径选哪个取决于你对底层寄存器的熟悉程度。路径一AVR-GCC avr-libc Makefile。这是最“原汁原味”的方式资料里的示例工程大多是这个结构。优点是生成的代码体积小1KB Flash 能压到极致缺点是你要自己写 Makefile、自己配熔丝位、自己调 avrdude 命令。适合想彻底搞懂 AVR 的从业者。路径二Arduino IDE ATTinyCore 支持包。优点是上手快pinMode、digitalWrite直接可用缺点是 Arduino 框架本身有开销一个空的setup/loop可能就占掉几百字节留给你的空间非常紧张。资料里附了在 Arduino IDE 里添加第三方板支持的方法但我要提醒用 Arduino 写 ATtiny13必须把优化等级调到-Os否则很容易超 Flash。我一般会这样选如果只是点个灯、读个 ADC、做个延时开关用 Arduino 快速验证如果要量产或者功能稍复杂直接上 AVR-GCC把每一字节都攥在手里。资料里两种工程的目录是分开的别混着编译否则链接阶段会报一堆重复定义。2.3 资料包里的目录结构与文件用途拿到资料后先别急着打开代码花两分钟看清目录能省掉后面很多“找不到文件”的麻烦。常见结构是这样的attiny13_board_pack/ ├── hardware/ # 开发板原理图、PCB、BOM ├── firmware/ # 示例工程 │ ├── blink_gcc/ # AVR-GCC 版点灯 │ ├── adc_demo/ # ADC 采样 │ └── pwm_led/ # PWM 调光 ├── tools/ # 烧录脚本、熔丝位计算表 └── docs/ # 芯片手册摘要、引脚图hardware里的原理图要重点看 LED 接在哪个引脚、有没有上拉电阻、复位脚怎么接。firmware里每个工程都带独立 Makefile编译前先确认MCU和F_CPU两个变量和你板子一致。tools里的熔丝位计算表是血泪经验的结晶后面避坑章节会用到。docs里的手册摘要把 1KB Flash 相关的寄存器说明摘出来了不用翻几百页原版手册。3. 从零烧录第一个程序avrdude 命令、熔丝位与时钟配置这一章是整份资料最核心的落地部分。很多人卡在“编译通过了但芯片没反应”九成是熔丝位或时钟没配对。下面按顺序走一遍。3.1 编译示例工程Makefile 关键变量怎么改以firmware/blink_gcc为例打开 Makefile 先看这几个变量# 目标芯片ATtiny13 和 ATtiny13A 在这里都写 attiny13 MCU attiny13 # 主频必须和熔丝位里的时钟源一致否则延时全错 F_CPU 1200000UL # 源文件 SRC main.c # 优化等级1KB Flash 必须用 -Os CFLAGS -Os -mmcu$(MCU) -DF_CPU$(F_CPU)F_CPU写 1200000 表示 1.2MHz这是 ATtiny13 内部 9.6MHz 振荡器经过 8 分频后的默认频率。如果你改成 9.6MHz熔丝位也必须同步改否则_delay_ms的延时会长短不一。改完直接make生成main.hex。如果报region text overflowed说明代码超了 1KB得回去删功能或换更精简的写法。3.2 连接烧录器与 avrdude 命令拆解资料默认用 USBasp 或 Arduino 作为 ISP 烧录器。以 USBasp 为例接线是固定的 6 根MOSI、MISO、SCK、RESET、VCC、GND。接反了不会烧芯片但会一直报target doesnt answer。烧录命令如下# 读取芯片签名确认通信正常 avrdude -c usbasp -p t13 -U signature:r:-:h # 烧录 flash avrdude -c usbasp -p t13 -U flash:w:main.hex:i # 读取当前熔丝位低字节和高字节 avrdude -c usbasp -p t13 -U lfuse:r:-:h -U hfuse:r:-:h-c usbasp指定烧录器类型-p t13是 ATtiny13 的简写。-U flash:w:main.hex:i里w表示写入i表示 Intel HEX 格式。读熔丝位那条命令会返回两个十六进制数比如0x6A和0xFF记下来改之前先备份。我习惯每次动熔丝位前先读一遍存到文本里这就是后悔药。3.3 熔丝位配置时钟源、复位禁用与 BOD熔丝位是 ATtiny13 最容易翻车的地方。资料里的计算表把常用组合列出来了这里说三个关键位。时钟源选择。低熔丝位里的 CKSEL 决定用内部还是外部时钟。默认出厂是内部 9.6MHz但分频位 CKDIV8 默认是 0即 8 分频所以实际跑 1.2MHz。如果你想跑满 9.6MHz要把 CKDIV8 改成 1未编程状态。复位禁用。高熔丝位的 RSTDISBL 如果被编程为 0PB5 就变成普通 I/O但同时也失去了复位功能。一旦禁用复位再用 ISP 烧录就需要高压编程器普通 USBasp 救不回来。新手千万别动这一位除非你确定要用 PB5 做输出且已经调通了。BOD 掉电检测。电池供电场景建议开启 BOD电压低于阈值时自动复位避免跑飞。但 BOD 会增加功耗资料里给了 1.8V 和 2.7V 两档的配置值。改熔丝位的命令# 设置内部 9.6MHz、未分频、使能复位、BOD 2.7V avrdude -c usbasp -p t13 -U lfuse:w:0x7A:m -U hfuse:w:0xFB:m0x7A和0xFB是资料计算表里推荐的组合m表示直接写数值而不是读。写完断电重上电用avrdude再读一次确认。如果读出来和写进去不一致检查烧录器供电是否稳定。3.4 验证程序运行LED 闪灯与延时校准烧录完成后最直接的验证就是看 LED。资料里的blink_gcc让 PB0 上的 LED 以 500ms 间隔闪烁。如果灯不亮先量 PB0 电压是否在高低之间跳变如果电压不变说明程序没跑起来回去查熔丝位和时钟。如果闪烁频率明显不对比如快了一倍或慢了一半那就是F_CPU和实际时钟不匹配重新核对熔丝位。我一般还会写一个极简的测试上电后 LED 常亮 2 秒再进入闪烁这样能区分“没烧进去”和“烧进去了但主循环卡住”。这个技巧在资料里的blink_gcc注释里也提到了。4. 外设驱动与低功耗实战ADC、PWM 和睡眠模式怎么配点灯只是热身ATtiny13 真正有用的是 ADC 采样和 PWM 输出以及电池供电时的低功耗。这一章把资料里几个外设示例的关键寄存器配置讲清楚。4.1 ADC 采样参考电压与通道选择ATtiny13 的 ADC 是 10 位逐次逼近型4 个通道对应 PB2、PB3、PB4、PB5PB5 需禁用复位。资料里的adc_demo用 PB3 接电位器读取电压并映射到 LED 亮度。关键寄存器是 ADMUX 和 ADCSRA。// 选择 VCC 作为参考电压通道 ADC3PB3 ADMUX (0 REFS0) | (3 MUX0); // 使能 ADC预分频 8启动转换 ADCSRA (1 ADEN) | (1 ADPS1) | (1 ADPS0); // 启动一次转换 ADCSRA | (1 ADSC); // 等待转换完成 while (ADCSRA (1 ADSC)); // 读取结果10 位先读低字节再读高字节 uint16_t val ADC;REFS0为 0 时参考电压是 VCC为 1 时是内部 1.1V。如果你测的是电池电压用内部 1.1V 参考更稳。ADPS位决定 ADC 时钟必须控制在 50kHz 到 200kHz 之间1.2MHz 主频下预分频 8 刚好。读结果时先读ADCL再读ADCH否则高字节会锁存错误这是 AVR 的经典坑资料里用ADC宏帮你处理了但自己写的时候要注意。4.2 PWM 调光Timer0 快速 PWM 模式ATtiny13 只有 Timer0 一个定时器两路 PWM 共用它。资料里的pwm_led用 PB0 输出 PWM 做呼吸灯。配置步骤如下// 设置 PB0 为输出 DDRB | (1 PB0); // 快速 PWM 模式TOP 为 0xFF比较匹配时清零 TCCR0A (1 COM0A1) | (1 WGM01) | (1 WGM00); // 预分频 8PWM 频率约 1.2MHz/8/256 ≈ 586Hz TCCR0B (1 CS01); // 占空比 50% OCR0A 128;COM0A1置 1 表示比较匹配时 OC0A 清零WGM01和WGM00都置 1 是快速 PWM 模式。预分频选 8 时 PWM 频率约 586Hz人眼看不到闪烁。如果你把预分频改成 1频率到 4.7kHz但占空比分辨率还是 8 位没有提升。呼吸灯就是在一个循环里逐渐改变OCR0A的值注意别用_delay_ms阻塞太久否则按键响应会迟钝。4.3 睡眠模式与看门狗唤醒把功耗压到微安级电池供电的场景ATtiny13 大部分时间应该睡觉。资料里给了空闲模式和掉电模式的配置。掉电模式功耗最低但只有看门狗或外部中断能唤醒。#include avr/sleep.h #include avr/wdt.h // 配置看门狗约 1 秒唤醒一次 wdt_enable(WDTO_1S); // 使能看门狗中断而不是复位 WDTCSR | (1 WDIE); // 进入掉电模式 set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); // 唤醒后继续执行看门狗中断标志自动清除注意WDTCSR的配置需要先置WDCE位才能改wdt_enable宏已经处理了。掉电模式下电流可以降到 0.5μA 左右但看门狗本身会消耗几微安。如果对功耗要求极致可以关掉看门狗用外部中断唤醒但那样就需要额外的传感器信号。资料里还提醒进入睡眠前要把未使用的 I/O 设为输入并开启上拉避免悬空引脚漏电。5. 避坑与排查熔丝位锁死、时钟错乱和 Flash 溢出这一章是我踩过的坑也是资料里tools目录那些脚本的由来。每条按“现象 → 原因 → 解决”写照着排查能省下不少抓头发的时间。5.1 现象烧录一次后再也连不上avrdude 报 target doesnt answer原因高熔丝位的 RSTDISBL 被误编程为 0PB5 变成普通 I/O复位功能失效ISP 无法进入编程模式。这是最典型的“把芯片锁死”。解决普通 USBasp 救不回来需要高压并行编程器或者用另一颗芯片。预防办法是改熔丝位前先读一遍备份并且永远不要动 RSTDISBL除非你确定不需要再 ISP 烧录。资料里的熔丝位计算表把这一位标红了就是提醒别碰。5.2 现象LED 闪烁频率明显不对延时快了一倍或慢了一半原因F_CPU宏定义和实际时钟源不匹配。比如熔丝位设的是内部 9.6MHz 不分频但代码里F_CPU写 1200000_delay_ms就会按 1.2MHz 计算实际跑 9.6MHz延时缩短 8 倍。解决用avrdude读熔丝位对照资料里的时钟表算出实际频率然后改 Makefile 里的F_CPU。改完必须重新编译只改熔丝位不重编译没用。我习惯在main.c开头加一句#if F_CPU ! 1200000 #error F_CPU mismatch #endif强制自己核对。5.3 现象编译报 region text overflowed by XX bytes原因1KB Flash 被代码占满。常见于用了printf、浮点运算或者 Arduino 框架。解决先看 map 文件里哪个函数占得最多。把printf换成自己写的轻量输出浮点改成定点Arduino 工程换成 AVR-GCC。资料里的示例都控制在 500 字节以内留一半空间给业务逻辑。如果实在不够只能换 ATtiny25 或 ATtiny85但那就不是这份资料的范围了。5.4 现象ADC 读出来的值一直在跳或者始终是 0 或 1023原因参考电压选错、通道选错或者 PB5 没禁用复位却当 ADC 用。另外ADC 时钟太快也会导致精度下降。解决先确认ADMUX的REFS0和MUX位。用内部 1.1V 参考时输入电压不能超过 1.1V否则永远是 1023。PB5 做 ADC 必须禁用复位但禁用复位又会导致无法 ISP 烧录所以资料里建议 ADC 优先用 PB2、PB3、PB4。ADC 预分频确保在 50-200kHz 之间读结果先低字节后高字节。5.5 现象睡眠模式唤醒后程序跑飞或者功耗没降下来原因唤醒后没有清除看门狗中断标志或者未使用的 I/O 悬空漏电。另外如果看门狗配置为复位模式而不是中断模式唤醒会直接复位芯片。解决确认WDTCSR的WDIE置 1、WDE置 0。进入睡眠前把未用 I/O 设为输入并开启上拉或者设为输出低电平。用万用表测睡眠电流如果还是毫安级检查有没有外设模块没断电。资料里的低功耗示例带了一个sleep_all函数把上述操作都封装好了。6. 进阶技巧用 EEPROM 存参数与软件串口调试的取舍资料里除了基础示例还有两个进阶用法值得单独说EEPROM 读写和软件串口。这两个功能在 1KB Flash 的芯片上都要精打细算用好了能省一颗外部存储或调试器。6.1 EEPROM 读写掉电保存校准值ATtiny13 有 64 字节 EEPROM适合存传感器校准系数、运行次数等小数据。资料里的eeprom_demo演示了读写一个字节#include avr/eeprom.h // 写入地址 0x00值 0x5A eeprom_write_byte((uint8_t*)0x00, 0x5A); // 读取地址 0x00 uint8_t val eeprom_read_byte((uint8_t*)0x00);eeprom_write_byte内部会等待上一次写完成不用手动延时。但 EEPROM 寿命约 10 万次别在循环里频繁写。我一般加一个判断只有新值不等于旧值时才写减少磨损。另外EEPROM 读写函数会占用一些 Flash如果空间紧张可以直接操作EEARL、EEDR、EECR寄存器能省几十字节。6.2 软件串口1KB Flash 里的调试手段没有硬件串口但调试时又想看变量值怎么办资料里给了一个极简的软件发送端只占约 200 字节波特率 9600用 PB0 做 TX。它只发不收够用来打印调试信息。// 软件串口发送一个字节PB0 为 TX9600bps 1.2MHz void soft_uart_tx(uint8_t data) { uint8_t i; // 起始位 PORTB ~(1 PB0); _delay_us(104); // 8 个数据位低位在前 for (i 0; i 8; i) { if (data 1) PORTB | (1 PB0); else PORTB ~(1 PB0); _delay_us(104); data 1; } // 停止位 PORTB | (1 PB0); _delay_us(104); }_delay_us(104)对应 9600bps 的位宽1.2MHz 主频下约 125 个时钟周期实际用示波器量一下再微调。这个函数是阻塞的发一个字节约 1ms调试时别放在中断里。如果 Flash 还有富余可以加一个soft_uart_print把数字转成字符串但那样又要占几百字节。我的习惯是只在开发阶段用软件串口量产固件里直接删掉把空间留给功能。6.3 验证与固化从面包板到成品的检查清单最后一步是把调通的程序固化到成品板。我每次都会走一遍这个清单读一次熔丝位确认和代码一致用avrdude校验 Flash 写入上电看 LED 是否按预期动作测睡眠电流是否达标把最终 hex 和熔丝位值一起归档。资料里的tools目录有一个flash_and_fuse.sh脚本把烧录和校验串起来了但熔丝位值需要你自己填。从那以后我每次改熔丝位都强制先读备份再写这个习惯救过好几颗芯片。希望这份 ATtiny13 开发板资料能帮你少走点弯路把 1KB 的潜力榨干。本文还有配套的精品资源点击获取