资讯动态

ATtiny13开发板资料详解:从最小系统到低功耗实战

发布时间:2026/10/21 17:53:28 来源:尧图企业网站定制
简介这份资料面向单片机初学者与嵌入式爱好者围绕Atmel AVR系列超小型8位微控制器ATtiny13展开帮助读者在低功耗、8引脚封装的平台上完成从硬件认知到程序编写的入门实践适用于智能家居、物联网设备及教学实验等微型控制场景。压缩包共237个文件约12.49MB以C源码、工程文件、编译中间产物与HEX固件为主另含原理图与中文手册两份PDF覆盖开发板电路设计、寄存器说明、指令集及引脚功能等关键参考。资源中整理了LED闪烁、按键检测、定时器与PWM调光、ADC采样等实例代码配合Atmel Studio或Arduino IDE即可上手便于理解ISP编程接口与中断、定时器配置思路。目前已有279人学习下载适合希望快速搭建ATtiny13开发环境、对照实例掌握底层控制方法的读者。1. 从一颗八脚芯片说起ATtiny13开发板资料到底能干什么如果你手头有一块比指甲盖还小的八脚单片机丝印写着 ATtiny13却不知道怎么把它跑起来这份开发板资料就是为你准备的。ATtiny13 是 Atmel 早期 AVR 系列里最小的一档1KB Flash、64B SRAM、64B EEPROM八个引脚里能用的 IO 只有五个但就是这颗看起来“寒酸”的芯片在低成本闪烁灯、简单 PWM 调光、电池供电的定时器、玩具控制板里活了快二十年。资料包里通常包含原理图、示例代码、烧录工具配置和几个能直接跑的工程适合刚接触 AVR 的嵌入式新手也适合需要一颗极简 MCU 做量产方案的老手。它不解决复杂计算但能把“最小系统”这件事讲透。2. 先把最小系统跑通ATtiny13 的硬件接线与供电边界2.1 为什么 ATtiny13 的最小系统比 STM32 更容易翻车很多人第一次画 ATtiny13 的板子会下意识照搬 STM32 的经验外部晶振、复位电容、BOOT 电阻。但 ATtiny13 出厂默认用的是内部 9.6MHz RC 振荡器±10% 精度不需要任何外部晶振就能跑。它的复位引脚PB5同时也是 GPIO如果你在熔丝位里没把 RSTDISBL 关掉又把它当普通 IO 用下一次烧录就会直接连不上芯片——这是新手最常遇到的“锁死”现象。供电范围是 1.8V 到 5.5V但注意当电压低于 2.7V 时最高主频要降到 4.8MHz 以下否则会出现随机复位或程序跑飞。常见做法是如果做 3.3V 系统就把时钟设为 4.8MHz 或 1.2MHz别硬上 9.6MHz。2.2 接线步骤与烧录接口的物理层资料包里一般会提供两种烧录方式ISP 六针接口和直接飞线。我一般会先焊一个 2x3 的排针间距 2.54mm顺序是 MISO、VCC、SCK、MOSI、RST、GND。对应 ATtiny13 的引脚ISP 针脚ATtiny13 引脚说明MISOPB6 (pin 7)数据输出VCCpin 8供电正SCKPB7 (pin 9)时钟MOSIPB5 (pin 1)数据输入RSTPB5 复用复位需 10k 上拉GNDpin 4地注意 PB5 既是 MOSI 又是复位脚烧录时编程器会拉低它所以目标板上不要加太强的上拉10k 到 47k 之间比较稳。如果板子上已经有 10k 上拉一般不用拆。供电方面用 USBasp 或 AVRISP mkII 时目标板最好独立供电不要从编程器取 5V 大电流否则烧录时电压跌落会导致校验失败。2.3 用 avrdude 验证芯片是否在线在 Linux 或 macOS 下插上 USBasp 后先看设备节点lsusb | grep -i usbasp # 输出类似Bus 001 Device 012: ID 16c0:05dc Van Ooijen Technische Informatica然后读芯片签名avrdude -c usbasp -p t13 -U signature:r:-:h # 期望输出0x1e,0x90,0x07如果返回0x000000或0xffffff说明接线反了、芯片没供电、或者 PB5 被锁死。先量 VCC 和 GND 之间电压再检查 MISO/MOSI 有没有接反。USBasp 的 10 针转 6 针线序很容易搞错我习惯用万用表蜂鸣档对一遍。2.4 熔丝位怎么设才不锁芯片ATtiny13 的熔丝位只有两个字节低字节和高字节。出厂默认低字节 0x6A高字节 0xFF。常见配置内部 9.6MHz不分频低字节 0x6A高字节 0xFF内部 4.8MHz不分频低字节 0x69高字节 0xFF内部 1.2MHz不分频低字节 0x68高字节 0xFF写熔丝前一定先读一遍avrdude -c usbasp -p t13 -U lfuse:r:-:h -U hfuse:r:-:h确认当前值再写。如果误把 RSTDISBL 置 0高字节 bit7复位脚变成普通 IOISP 就再也连不上只能用高压并行编程器救。资料包里如果有“熔丝恢复”说明通常就是讲这个。我一般会在板子上留一个跳线把 PB5 和复位排针之间断开烧完再短接。3. 代码怎么写从寄存器操作到示例工程拆解3.1 不用 Arduino 框架直接操作 DDRB 和 PORTBATtiny13 的 IO 只有 PORTB 一个端口对应 PB0 到 PB5。方向寄存器 DDRB 写 1 是输出写 0 是输入。输出高电平写 PORTB 对应位为 1低电平写 0。下面是最简单的闪烁代码用 avr-gcc 编译#include avr/io.h #include util/delay.h int main(void) { DDRB | (1 PB0); // PB0 设为输出 while (1) { PORTB | (1 PB0); // PB0 拉高 _delay_ms(500); PORTB ~(1 PB0); // PB0 拉低 _delay_ms(500); } return 0; }逻辑说明DDRB是方向寄存器PORTB是输出寄存器。_delay_ms依赖F_CPU宏编译时要指定频率比如-DF_CPU9600000UL。如果频率写错延时会长短不对。参数上_delay_ms最大延时受编译器优化影响超过 262ms 时建议用循环或定时器。3.2 用定时器做精确 PWM 调光ATtiny13 有两个定时器Timer0 是 8 位Timer1 也是 8 位但带 PWM 功能。PB0 对应 OC0APB1 对应 OC0B。下面用 Timer0 快速 PWM 模式输出可调占空比#include avr/io.h void pwm_init(void) { TCCR0A | (1 COM0A1) | (1 WGM00) | (1 WGM01); // 快速 PWMOC0A 非反相 TCCR0B | (1 CS00); // 无分频 DDRB | (1 PB0); // PB0 输出 } int main(void) { pwm_init(); OCR0A 128; // 占空比 50% while (1) { // 可以在这里改 OCR0A 做呼吸灯 } return 0; }参数说明WGM00和WGM01同时置 1 是快速 PWM 模式频率 F_CPU / (256 * 分频)。9.6MHz 无分频时约 37.5kHz人耳听不到适合 LED 调光。OCR0A从 0 到 255 对应占空比 0% 到 100%。注意 PB0 和 PB1 共用定时器时两个通道频率相同占空比独立。3.3 示例工程的文件结构与编译命令资料包里的工程一般长这样project/ ├── main.c ├── Makefile └── README.mdMakefile 里关键几行MCU attiny13 F_CPU 9600000UL CC avr-gcc CFLAGS -mmcu$(MCU) -DF_CPU$(F_CPU) -Os -Wall OBJCOPY avr-objcopy all: main.hex main.elf: main.c $(CC) $(CFLAGS) -o $ $ main.hex: main.elf $(OBJCOPY) -O ihex -R .eeprom $ $ flash: main.hex avrdude -c usbasp -p t13 -U flash:w:main.hex:i编译时执行make烧录执行make flash。如果报错avr-gcc: command not found在 Ubuntu 下装gcc-avr avr-libcWindows 下用 WinAVR 或 Atmel Studio 自带工具链。注意-Os是优化尺寸ATtiny13 只有 1KB Flash不优化很容易超。4. 避坑与排查ATtiny13 开发中最容易踩的五条血泪经验4.1 烧录时提示“target doesnt answer”现象avrdude 返回avrdude: error: program enable: target doesnt answer。原因通常是 PB5 复位脚被拉低、芯片没供电、或者 SCK 频率太高。解决先量 VCC 是否在 1.8V 到 5.5V 之间检查 USBasp 的 SCK 跳线有些廉价编程器默认 1.5MHzATtiny13 在低压下可能跟不上短接 JP3 降到 375kHz 再试如果 PB5 被外部电路拉死断开负载再烧。4.2 程序烧进去但不跑或者跑几秒就复位现象LED 闪几下就灭或者完全不亮。原因多半是熔丝位设了外部晶振但板子上没焊晶振或者电压低于 2.7V 却跑了 9.6MHz。解决读熔丝确认 CKSEL 位改回内部 RC用示波器看 VCC 纹波电池供电时加 100nF 和 10uF 电容如果用了看门狗检查 WDTCR 是否误开。4.3 延时函数不准差出好几倍现象_delay_ms(1000)实际只有 200ms。原因F_CPU宏和实际熔丝频率不一致。解决编译时-DF_CPU必须和熔丝设置的时钟源一致。如果熔丝是 4.8MHz编译写 9600000UL延时就会快一倍。我一般会在 Makefile 里把F_CPU和熔丝值写在一起改一个就改另一个。4.4 用 PB5 做输入时读不到电平现象按键接在 PB5 上按下没反应。原因PB5 默认是复位脚内部上拉弱而且编程器可能还在驱动它。解决烧录时把 RSTDISBL 置 0 可以释放 PB5但之后只能用高压编程。更稳妥的做法是PB5 只做输出或者用 PB3/PB4 做输入。如果非要用 PB5加外部上拉 10k并且烧录时断开按键。4.5 Flash 空间不够编译报“region text overflow”现象链接时提示.text超过 1KB。原因用了printf、浮点、或者_delay_ms大参数导致库函数膨胀。解决去掉printf用uart_putc自己写延时用循环代替_delay_ms编译加-Os和-ffunction-sections -Wl,--gc-sections。如果还超检查有没有把常量数组放到 RAM 里用PROGMEM挪到 Flash。5. 进阶技巧用 ATtiny13 做低功耗定时器和 EEPROM 存参数5.1 掉电模式把静态电流压到微安级ATtiny13 在掉电模式Power-down下典型电流 0.1uA 到 0.5uA3V25°C。配合看门狗定时器唤醒可以做一个每 8 秒醒一次的采集节点。关键寄存器#include avr/io.h #include avr/sleep.h #include avr/wdt.h void setup_wdt(void) { WDTCR | (1 WDP3) | (1 WDP0); // 8 秒超时 WDTCR | (1 WDTIE); // 使能看门狗中断 } ISR(WDT_vect) { // 唤醒后执行一次然后继续睡 } int main(void) { setup_wdt(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sei(); while (1) { sleep_mode(); } }参数说明WDP3和WDP0组合决定超时时间8 秒对应 WDP31、WDP01。注意看门狗中断和复位是两套机制WDTIE是中断使能WDE是复位使能别同时开。唤醒后如果不想执行太多代码尽快回到sleep_mode()。5.2 用 EEPROM 保存校准参数ATtiny13 有 64 字节 EEPROM擦写寿命 10 万次。适合存传感器偏移、亮度等级、运行小时数。读写用avr/eeprom.h#include avr/eeprom.h uint8_t brightness EEMEM 128; // 定义在 EEPROM 里的变量 void save_brightness(uint8_t val) { eeprom_write_byte(brightness, val); } uint8_t load_brightness(void) { return eeprom_read_byte(brightness); }逻辑说明EEMEM宏把变量分配到 EEPROM 地址空间编译后生成.eeprom段。烧录时如果只写 FlashEEPROM 保持原值如果要一起写avrdude 加-U eeprom:w:main.eep:i。注意 EEPROM 写入需要 3.3ms 左右期间 CPU 可以继续跑但别断电。我一般会在写之前先读一遍值没变就不写省寿命。5.3 验证低功耗的实操方法拿一个万用表串在 VCC 和电池之间打到 uA 档。先跑正常模式看电流是不是几毫安然后进入掉电模式看是不是降到 1uA 以下。如果降不下来检查所有 IO 有没有设成输入且关内部上拉有没有悬空的引脚BOD brown-out detection有没有关BOD 在掉电模式下也会耗电熔丝高位 bit6 置 1 可以关掉。我习惯在板子上留一个 0 欧电阻测电流时焊开测完再短上。从那以后我每次做 ATtiny13 的低功耗项目都会先烧一个只进掉电模式的空程序量完静态电流再写业务逻辑。这个习惯帮我省过好几次“以为芯片坏了”的返工。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑