☰
ATtiny13A开发全攻略:从引脚定义到熔丝位实操
2026/10/16 20:45:06 网站建设 项目流程

简介:面向嵌入式初学者的ATtiny13单片机开发资料包,覆盖从硬件特性、开发环境搭建到编程调试的完整学习链路。ATtiny13虽仅有1KB闪存与8个引脚,却适合智能家居、物联网节点等小型化控制场景,可快速掌握这款AVR芯片的实战开发。压缩包共237个文件,约12.49MB,核心内容包括中文手册与开发板原理图(PDF)、C语言实例源码、工程文件(prj、mak)以及编译生成的hex、list等产物;源代码与工程文件适合对照学习,PDF文档便于查阅手册与电路,hex等编译产物可直接烧录验证。资料内含LED闪烁、按键检测、定时器中断、ADC采集、PWM调光等多个示例程序,覆盖常见基础外设操作,对理解中断、定时器、模拟采样等关键知识点很有帮助。已有274人学习使用,对有硬件基础的爱好者或准备入门AVR开发的学生而言,是一份即下即用的参考资料。 这两天整理零件盒,翻出一板ATtiny13A,DIP-8封装的小家伙,个头和米粒差不多。可能有人会问,都2025年了,ST的H7、乐鑫的ESP32-S3到处都是,谁还碰这种Flash只有1KB的八脚单片机?说实话,我一开始也觉得这玩意儿只能当个“会眨眼的灯”。但等我认真翻了数据手册、搭了个最小的开发板跑起来之后,结论变了:在传感器周期采样、简单状态机、低成本电子开关这些场景里,ATtiny13反而是最合适的那颗料。这篇文章就围绕ATtiny13开发板资料做一次完整沉淀,从引脚定义、最小系统、开发环境,到烧录链路、PWM和低功耗实测,最后重点聊熔丝位和复位引脚复用这两个最容易翻车的点。

1. 为什么这颗八脚小芯片还值得玩

1.1 先看清它的家底

ATtiny13/13A是Microchip(原Atmel)的8位AVR单片机,属于tiny系列的最入门型号。核心参数看着非常寒酸:1KB Flash、64B SRAM、64B EEPROM、6个I/O口,DIP-8或者SOIC-8封装。但它的优势恰恰藏在参数背后:工作电压1.8V到5.5V,内部RC振荡器可以跑9.6MHz、4.8MHz或者128kHz,出厂默认开了8分频,所以很多片子拿到手实际是1.2MHz。5V供电下如果外接时钟,最高可以到20MHz。

外设方面,它有4路10位ADC(PB0到PB3)、一个8位定时器Timer0、模拟比较器、USI串行接口、以及带独立振荡器的看门狗定时器。USI这个东西可以当SPI用,也能靠软件模拟I2C,但千万不要把它当成硬件UART,这芯片没有硬件串口,想通信只能软串口或者位拆腾。还有一点很关键:它没有boodloader,程序基本是靠外部编程器直接写Flash。

1KB Flash能干什么?按AVR的指令宽度来算,大概能装一千条左右的原生指令。看着不多,但对状态机、按键消抖、传感器周期读取这种“小逻辑”来说,完全够用。我用它做过一个单键切换三档色温的小夜灯,整个程序编译出来不到700字节,还剩三百多字节给以后扩展。C语言正常写,配合 -Os 编译优化,不用刻意抠汇编。

1.2 适合的活和不适合的活

适合它的场景有几个共同点:任务单一、功耗敏感、成本敏感、不需要复杂协议。

  • 电池供电的周期唤醒设备:平时睡眠电流能到1µA以下,看门狗定时醒来采一次样,再睡回去。
  • 简单的PWM调光/调色:Timer0生成两路PWM足够。
  • 传感器小从机:比如温度传感器、湿度传感器,周期上报数据。
  • 替代一块逻辑电路:一颗八脚芯片经常比一堆74系列芯片更省空间、更便宜。

不适合它的场景也很明显:跑TCP/IP协议栈、做音频处理、刷小型操作系统、处理大量日志输出。还有一点要注意,它没有硬件乘法器,浮点运算更是灾难,做复杂计算得靠查表。选型时别拿它和ESP32比,定位完全不同。很多人觉得“1KB能干嘛”,实际动手做完一个小项目,才会发现少即是多。

2. 自制最小开发板:引脚、供电与ISP接口

2.1 八根引脚各司其职

ATtiny13没有官方开发板,市面上那种“ATtiny13开发板”多半也是爱好者自己画的。想最快上手,直接在面包板上搭一个最小系统就好,这跟Arduino Uno那种动辄几十个引脚的开发板完全是两种玩法。

先看引脚,DIP-8封装从缺口开始看:

┌───┐ PB5/RST │1 8│ VCC PB3 │2 7│ GND PB2 │3 6│ PB4 PB1 │4 5│ PB0 └───┘

六个I/O的功能分配是:

引脚主要功能复用功能备注
PB0数字I/OADC0、OC0A、USI-DI常用作LED/按键/PWM
PB1数字I/OADC1、OC0B、USI-DO第二路PWM输出
PB2数字I/OADC2、USCK、T0外部计数SPI时钟/USI时钟
PB3数字I/OADC3、CLKI外部时钟输入用
PB4数字I/OPCINT4无ADC,可做引脚中断
PB5复位引脚PCINT5、dW默认复位,改熔丝才能当I/O

PB0到PB3同时是ADC输入,PB0和PB1同时是PWM输出,这种复用意味着同一个引脚不能同时干两件事。比如PB0接了LED,又想用ADC采样,就得在时间片上做切换,或者换到PB1。PB5默认是复位脚,不是普通I/O,这点新手特别容易踩坑,后面第5章详细说。

2.2 面包板接线与编程口

需要准备的元件非常少:一块面包板、一颗ATtiny13A(DIP-8)、一颗0.1µF退耦电容、一个10kΩ上拉电阻、一颗220Ω到1kΩ的限流电阻、一颗LED、一个6针ISP排针。总成本比一顿早饭还便宜。

接线要点:

  1. VCC(第8脚)接5V或3.3V,GND(第7脚)接地,VCC和GND之间紧挨着放0.1µF陶瓷电容,尽量靠近芯片引脚。
  2. RESET脚(第1脚)接10kΩ上拉电阻到VCC,防止外部干扰导致误复位。
  3. LED正极接PB0(第5脚),负极串联220Ω电阻到GND。ATtiny13的I/O最大能拉20mA左右的电流,但不要长期满载跑,实测5V供电下串联220Ω电阻点亮红色LED,电流在15mA左右,长期运行建议把电流控制在5mA以内。
  4. 6针ISP接口的定义:PB0对应MOSI、PB1对应MISO、PB2对应SCK,外加RESET、VCC、GND。这个接线方式和Arduino Uno的ICSP口是对应的,插线时别搞反。

我自己还习惯在面包板上额外留两个空引脚,一个接PB4当调试LED口,一个接按键到GND。这样程序跑起来,至少能用LED闪几下判断执行到哪一步,不用每次干瞪眼。

3. 开发环境与烧录方案怎么选

3.1 Arduino IDE + ATtinyCore:新手的捷径

ATtiny13能被Arduino生态支持,主要归功于社区维护的ATtinyCore和MicroCore这两个内核。MicroCore专门针对ATtiny13系列做了优化,代码尺寸和兼容性都更好,我个人更推荐。安装方式是在Arduino IDE的文件→首选项→附加开发板管理器地址里,填ATtinyCore或MicroCore的GitHub仓库地址,然后在开发板管理器里搜索安装。

装好后选择开发板为ATtiny13/13A,处理器选ATtiny13A,时钟频率一般选Internal 1MHz就够了。注意这个“1MHz”选项在ATtinyCore里实际是设置9.6MHz内部RC再开8分频,延时函数会按1MHz来算,所以基本不会出现时间不准的问题。选9.6MHz则不分频,适合对速度有要求的场合。128kHz选项适合超低功耗场景,但跑起来明显很慢,IO翻转都肉眼可见。

必须理解Arduino IDE里两个按钮的区别:点“烧录引导程序”实际上是写熔丝位,不是烧bootloader;点“上传(使用编程器)”才是把编译好的hex文件写进Flash。ATtiny13没有预装bootloader,也没必要装,因为Flash太小,装了bootloader就剩不下多少空间给用户程序了。

3.2 AVR-GCC + avrdude:进阶路线

如果你更习惯裸机开发,或者想精确控制生成的代码体积,建议直接走avr-gcc命令行。安装好avr-gcc、avr-binutils、avrdude之后,一条链路就能完成编译烧录:

avr-gcc -mmcu=attiny13 -Os -DF_CPU=9600000 -o blink.elf blink.c avr-objcopy -O ihex blink.elf blink.hex avrdude -c usbasp -p t13 -U flash:w:blink.hex

这里的几个参数解释一下:-DF_CPU必须和芯片实际运行的时钟一致,否则delay函数的时间基准全错;avrdude的-p t13代表目标芯片是ATtiny13,-c后面跟编程器型号。这种方式的好处是熔丝位、Flash、EEPROM都能用命令精确控制,适合产品化之前做完整测试。

3.3 三种烧录器方案横向对比

没有烧录器的话,开发板的ISP口就是摆设。我实际试过的方案有三种,各有取舍:

方案成本优点缺点
Arduino Uno做ISP零成本手头有Uno就能用接线较多,速度一般,要先给Uno烧ArduinoISP示例
USBasp十几元便宜稳定,支持目标板供电,速度快部分Win10驱动要手动装
USBTinyISP几十元开源成熟,3.3V/5V可选性能与USBasp差异不大,价格偏高

我最常用的还是USBasp,因为它带一个5V跳线,可以直接给面包板供电,调试时少接一根电源线。如果只是临时玩一下,手头又有Arduino Uno,那直接用Uno做ISP最省钱。接线是:Uno的D10接目标板RESET、D11接PB0(MOSI)、D12接PB1(MISO)、D13接PB2(SCK),注意Arduino IDE里选编程器为“Arduino as ISP”。第一次连的时候如果报“avrdude: stk500_recv(): programmer is not responding”,先查RESET线,这是最高频的接线错误。

4. 实测记录:点灯、PWM呼吸灯和看门狗唤醒

4.1 第一步点灯,顺便确认熔丝与时钟

拿到芯片第一件事,点灯。我用的代码很简单:

#define LED_PIN 0 // PB0 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(200); digitalWrite(LED_PIN, LOW); delay(800); }

烧录完成后,如果LED闪烁节奏是亮200ms灭800ms,说明熔丝设置和代码里选的时钟一致。如果亮灭节奏明显偏慢,最常见原因是实际运行时钟比IDE选择的频率低,也就是熔丝里的CKDIV8还开着,代码却按9.6MHz编译。这种问题用肉眼就能看出来,不需要示波器。

ATtiny13没有硬件串口,调试信息全靠LED或者外接引脚。我后来的做法是固定留一个PCINT引脚接逻辑分析仪,在关键节点翻转电平,比加串口方便得多,还能省Flash。

4.2 用Timer0做呼吸灯

普通点灯只用到digitalWrite,但ATtiny13的很多价值体现在PWM上。直接用寄存器写一个呼吸灯效果:

void setup() { DDRB |= (1 << PB0); // PB0设为输出 TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0A1); // Fast PWM, 比较匹配清零 TCCR0B = (1 << CS00); // 无分频,直接跑 OCR0A = 0; // 初始占空比0 } void loop() { for (uint8_t i = 0; i < 255; i++) { OCR0A = i; delay(5); } for (uint8_t i = 255; i > 0; i--) { OCR0A = i; delay(5); } }

关键在TCCR0A这一行:WGM01和WGM00组合成Fast PWM模式,COM0A1让PB0在比较匹配时清零,从而实现PWM输出。OCR0A是占空比寄存器,从0到255循环就能得到呼吸效果。另一个PWM引脚PB1对应的是COM0B1和OCR0B,用法一样。实测下来,1MHz时钟下这个呼吸节奏很顺滑,不需要再挂外部定时器。

4.3 看门狗定时唤醒,功耗降到微安级

ATtiny13真正让我服气的,是低功耗能力。PWR_DOWN模式下芯片功耗轻松到1µA以下,靠看门狗定时醒来干活。看门狗在ATtiny13上最长的定时是8秒,如果要更长的休眠周期,就多醒几次计数。先看代码:

#include <avr/sleep.h> #include <avr/interrupt.h> #include <avr/wdt.h> ISR(WDT_vect) {} void setupWDT() { MCUSR &= ~(1 << WDRF); WDTCR |= (1 << WDCE) | (1 << WDE); // 允许修改WDT配置 WDTCR = (1 << WDTIE) | (1 << WDP3) | (1 << WDP0); // 8秒超时并中断 } void setup() { DDRB |= (1 << PB0); ADCSRA &= ~(1 << ADEN); // 关闭ADC,省电 setupWDT(); sei(); } void loop() { PORTB |= (1 << PB0); _delay_ms(20); PORTB &= ~(1 << PB0); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_cpu(); // 在这里睡过去 sleep_disable(); // 醒来后继续执行 }

这段代码的逻辑是:亮20ms的LED用来指示醒了一次,然后进入PWR_DOWN,8秒后看门狗中断唤醒,继续循环。注意进入睡眠前务必关闭ADC,否则模拟电路本身就会吃掉几百微安,低功耗就白做了。

我实际用万用表测试过这个电路的休眠电流,5V供电下整板(包括LED不亮时)在2µA左右,如果RESET脚不是悬空而是通过10kΩ上拉到VCC,还能更低。对于一节CR2032电池供电的项目,这个功耗可以跑非常久。

5. 熔丝位、复位复用和那些坑

5.1 熔丝位是怎么影响开发的

熔丝位是AVR芯片上的硬件配置位,决定时钟源、启动时间、BOD(掉电检测)、看门狗是否常开、以及复位引脚能不能复用。它存储在单独的存储区,不影响Flash程序,但一旦配置错误,芯片可能直接“变砖”。

烧熔丝前一定要做两件事:第一,把芯片出厂时的熔丝值保存下来,最简单的方法是拍照——USBasp烧录时终端会打印当前熔丝值,先记下来备用;第二,用熔丝计算器而不是手写十六进制值。我见过有人图省事直接写0x6A/0xFF,结果芯片用的是外部时钟而板上根本没焊接晶振,烧完就再也连不上了。

ATtiny13出厂默认一般是内部9.6MHz RC加上CKDIV8分频,也就是实际跑1.2MHz。Arduino IDE里通过ATtinyCore选时钟的时候,IDE会自动帮你计算并写对应的熔丝,但你在命令行用avrdude裸烧时,必须自己搞清楚熔丝值,不然程序跑起来时间和预期差好几倍。

5.2 把RESET引脚改作普通IO的代价

PB5在默认情况下是复位引脚,不能当I/O用。想要释放它,需要写RSTDISBL熔丝位。这个功能很诱人,因为释放之后PB5可以当普通数字IO,等于多一个可用引脚。

但代价极其沉重:PB5一旦被设成普通IO,芯片的复位功能就失效了,ISP编程器无法再通过复位信号进入编程模式,USBasp、USBTinyISP、ArduinoISP全部失效。想再次编程,只能用高压并行编程器或者高压串行编程器,这种设备一般业余玩家手里没有。

所以我的建议很明确:除非你真的缺那一个IO,而且手头备有高压编程器,否则不要碰RSTDISBL。我见过太多人改完熔丝之后,芯片彻底失联,只能拿专用的恢复器救砖。普通开发场景里,PB0到PB4五个IO加ADC/PWM复用,已经能覆盖绝大多数小项目了。

5.3 供电、引脚冲突和代码优化经验

最后说几个实操积累的经验,都是数据手册不会直白告诉你的:

  • 供电与时钟要匹配。1.8V供电时芯片只能跑很低的频率,强行跑9.6MHz会出现程序跑飞或者EEPROM写入失败。保守一点:3.3V供电跑4.8MHz以内,5V供电跑9.6MHz,日常完全够用。超频到20MHz不是不行,但发热和稳定性都不可控,没必要赌。
  • 未使用的引脚不能悬空。悬空的输入引脚容易受噪声干扰,还可能额外耗电。能设成输出就设成输出拉低,不能设成输出就用内部上拉,别让引脚浮着。
  • ADC采样电池电压时,如果以VCC为参考电压,读到的比例值能算电池剩余百分比,但测不出绝对电压。想测绝对电压,用内部1.1V参考,但要注意VCC必须高于1.1V且留出余量,精度也没有想象中那么高,适合粗略判断。
  • 代码优化思路上,优先用uint8_t而不是int,多用位运算,少用浮点。1KB Flash没有空间给你挥霍,写两三行就要想一下有没有更省的写法。我实测同一个呼吸灯程序,用Arduino自带AnalogWrite能写进去占用Flash偏大,直接操作OCR0A能省几十字节,在极限项目里这就是能不能放下的区别。

看到这里,你应该已经能从零搭起一块能用的ATtiny13开发板:面包板接线、ISP烧录、PWM输出、低功耗唤醒,以及最危险的熔丝位操作。最后分享一个我自己形成的习惯:拿到新批次ATtiny13,第一件事不是写业务代码,而是写一个全引脚翻转的测试程序,把所有能用的I/O依次拉高拉低,在面包板上确认引脚分配无误,同时把熔丝值存档。这套动作用不了十分钟,后面开发项目的时候能省很多排查时间。八脚小芯片学起来不贵,玩进去之后,你会发现限制反而是最好的老师。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询