简介:这份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(现 Microchip)ATtiny13/ATtiny13A 这颗经典低功耗 8 位 AVR 单片机,整理了开发板原理图、示例工程、烧录工具配置和常见外设驱动代码。适合电子爱好者、嵌入式入门者,以及需要做超低成本小控制器的工程师。这颗芯片资源极小,没有硬件串口,定时器和 ADC 都要精打细算,所以资料里对寄存器配置和熔丝位的说明比一般开发板更细。下面我按“先搞懂芯片和工具链,再动手烧录,最后避坑”的顺序,把这份资料拆开讲清楚。
2. ATtiny13 的硬件底子与工具链选型:为什么 1KB Flash 反而逼你写对每一行
ATtiny13A 是这份资料的核心器件,理解它的资源边界,才能明白资料里那些“抠门”写法不是炫技,而是被逼出来的。这一章先把芯片关键参数和开发环境选型讲透,后面烧录和写代码才不会翻车。
2.1 芯片资源与开发板引脚分布
ATtiny13A 常见封装有 8 脚 PDIP 和 8 脚 SOIC,开发板一般把 6 个 I/O 全部引出,另外保留 VCC、GND 和复位脚。它的核心参数如下:
| 项目 | 参数 |
|---|---|
| 内核 | AVR 8 位 RISC |
| Flash | 1KB |
| SRAM | 64B |
| EEPROM | 64B |
| 工作电压 | 1.8V – 5.5V |
| 最高主频 | 20MHz(VCC≥4.5V) |
| ADC | 4 通道 10 位 |
| 定时器 | 1 个 8 位 Timer0 |
| PWM | 2 路(共用 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 doesn't 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 如果被编程为 0,PB5 就变成普通 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、PB5(PB5 需禁用复位)。资料里的adc_demo用 PB3 接电位器,读取电压并映射到 LED 亮度。关键寄存器是 ADMUX 和 ADCSRA。
// 选择 VCC 作为参考电压,通道 ADC3(PB3) 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); // 预分频 8,PWM 频率约 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 doesn't answer
原因:高熔丝位的 RSTDISBL 被误编程为 0,PB5 变成普通 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 为 TX,9600bps @ 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 的潜力榨干。
本文还有配套的精品资源,点击获取