ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ATtiny13A开发全攻略:从引脚定义到熔丝位实操

ATtiny13A开发全攻略:从引脚定义到熔丝位实操 简介面向嵌入式初学者的ATtiny13单片机开发资料包覆盖从硬件特性、开发环境搭建到编程调试的完整学习链路。ATtiny13虽仅有1KB闪存与8个引脚却适合智能家居、物联网节点等小型化控制场景可快速掌握这款AVR芯片的实战开发。压缩包共237个文件约12.49MB核心内容包括中文手册与开发板原理图PDF、C语言实例源码、工程文件prj、mak以及编译生成的hex、list等产物源代码与工程文件适合对照学习PDF文档便于查阅手册与电路hex等编译产物可直接烧录验证。资料内含LED闪烁、按键检测、定时器中断、ADC采集、PWM调光等多个示例程序覆盖常见基础外设操作对理解中断、定时器、模拟采样等关键知识点很有帮助。已有274人学习使用对有硬件基础的爱好者或准备入门AVR开发的学生而言是一份即下即用的参考资料。 这两天整理零件盒翻出一板ATtiny13ADIP-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位ADCPB0到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/按键/PWMPB1数字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/OPB0到PB3同时是ADC输入PB0和PB1同时是PWM输出这种复用意味着同一个引脚不能同时干两件事。比如PB0接了LED又想用ADC采样就得在时间片上做切换或者换到PB1。PB5默认是复位脚不是普通I/O这点新手特别容易踩坑后面第5章详细说。2.2 面包板接线与编程口需要准备的元件非常少一块面包板、一颗ATtiny13ADIP-8、一颗0.1µF退耦电容、一个10kΩ上拉电阻、一颗220Ω到1kΩ的限流电阻、一颗LED、一个6针ISP排针。总成本比一顿早饭还便宜。接线要点VCC第8脚接5V或3.3VGND第7脚接地VCC和GND之间紧挨着放0.1µF陶瓷电容尽量靠近芯片引脚。RESET脚第1脚接10kΩ上拉电阻到VCC防止外部干扰导致误复位。LED正极接PB0第5脚负极串联220Ω电阻到GND。ATtiny13的I/O最大能拉20mA左右的电流但不要长期满载跑实测5V供电下串联220Ω电阻点亮红色LED电流在15mA左右长期运行建议把电流控制在5mA以内。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 -mmcuattiny13 -Os -DF_CPU9600000 -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接PB0MOSI、D12接PB1MISO、D13接PB2SCK注意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_DOWN8秒后看门狗中断唤醒继续循环。注意进入睡眠前务必关闭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依次拉高拉低在面包板上确认引脚分配无误同时把熔丝值存档。这套动作用不了十分钟后面开发项目的时候能省很多排查时间。八脚小芯片学起来不贵玩进去之后你会发现限制反而是最好的老师。本文还有配套的精品资源点击获取
返回列表