当前位置: 首页 > news >正文

ATtiny85低功耗优化实战:从20mA到5.5µA的七步改造

1. 项目概述:从毫安到微安的功耗攻坚战

如果你玩过用ATtiny85这类微型单片机做的电池供电小项目,大概率会遇到一个让人头疼的问题:电池怎么没几天就没电了?我手头就有一个用Digispark(基于ATtiny85的开发板)做的温湿度记录器,最初版本接上5V电源,一测电流,好家伙,稳稳的20mA。用个2000mAh的充电宝,理论续航也就四天,这离“长期无人值守运行”的设想差了十万八千里。这促使我开始深入研究ATtiny85的低功耗优化,目标很明确:把平均电流从毫安(mA)级别打到微安(µA)级别,让一颗普通的CR2032纽扣电池能撑上一年甚至更久。

这不仅仅是省电,更是电池供电设备,尤其是那些部署在难以更换电池场合的物联网传感器节点的生存之本。经过一系列从硬件改造到软件策略的调整,我成功地将系统待机电流从最初的20mA降到了5.5µA,实现了近4000倍的功耗降低。整个过程就像一场精细的外科手术,涉及供电、时钟、外设、代码逻辑乃至芯片熔丝位的层层优化。下面,我就把这七个关键步骤的详细操作、背后的原理,以及我踩过的坑、总结的经验,毫无保留地分享出来。

2. 核心思路与功耗来源拆解

在动手之前,我们必须搞清楚ATtiny85(或者说绝大多数微控制器)的功耗都花在了哪里。简单来说,功耗(P)等于电压(V)乘以电流(I)。我们的优化就是围绕降低这两个变量,以及减少不必要的电流消耗路径展开的。

2.1 静态与动态功耗构成

对于ATtiny85这样的CMOS芯片,电流消耗主要分两大类:

  1. 动态电流:芯片内部晶体管开关(逻辑状态翻转)时产生的电流,与工作频率(时钟速度)和供电电压的平方成正比。频率越高、电压越高,这部分电流就越大。
  2. 静态电流:即使芯片什么都不做(处于休眠状态),由于半导体物理特性,也存在微小的漏电流。此外,芯片内部一些始终工作的模块,如看门狗、掉电检测(BOD)、模拟数字转换器(ADC)的基准源等,也会产生持续的静态电流。

我们的优化策略就是双管齐下:降低工作电压和频率以减少动态功耗,并关闭所有不必要的外设和功能模块以最小化静态功耗

2.2 Digispark开发板的额外负担

标准的ATtiny85芯片本身在深度睡眠下可以做到极低的功耗(纳安级)。但我们通常使用的是像Digispark这样的开发板,为了方便用户,板上集成了许多额外电路:

  • 5V稳压芯片(如AMS1117):用于将USB的5V降压到3.3V或升压到5V供芯片使用,但其自身有静态工作电流(Quiescent Current)。
  • 电源指示灯LED:只要通电就会亮起,消耗恒定电流。
  • USB通讯相关电路:包括数据线上的上拉电阻、保护二极管等,即使不通讯,也可能存在电流通路。

这些“便利设施”在电池供电场景下就成了“功耗大户”。因此,低功耗优化的第一步,往往是从“改造硬件”开始的。

3. 硬件层面的功耗削减手术

硬件改造是降低基础功耗最直接有效的方法,但需要一定的动手能力。请务必在断电情况下操作,并准备好电烙铁、吸锡器、万用表等工具。

3.1 第一步:降低供电电压

操作:放弃标准的5V供电,改用单节锂离子电池(标称3.7V,满电约4.2V,截止约3.0V)直接为VCC引脚供电。原理:CMOS电路的动态功耗与电压的平方成正比。将电压从5V降至3.7V,动态功耗理论上能降低约(5² - 3.7²)/5² ≈ 45%。同时,芯片内部的一些线性损耗也会随电压降低而减少。实测效果:在16MHz全速运行同一程序,电流从20mA(5V)降至约13mA(3.7V)。对于一个2000mAh的电池,续航从4天提升到约6天。注意事项

  • 电压范围:ATtiny85的工作电压范围是2.7V - 5.5V。3.7V锂电完全在安全范围内,但需注意电池过放(低于2.7V可能工作不稳定或损坏)。建议在软件中增加电压检测逻辑,在电压过低时进入永久睡眠。
  • 时钟稳定性:在3.7V下运行16MHz,虽然芯片标称支持,但边际安全余量变小。如果环境温度变化大,可能偶尔出现时序错误。对于可靠性要求高的场景,建议同步执行下一步——降频。

3.2 第二步:移除板载“耗电大户”

这一步是针对Digispark这类开发板的“减负”手术。

1. 拆除电源指示灯(Power LED)

  • 操作:找到连接电源LED的限流电阻(通常标记为102,即1kΩ)。用刀片小心刮断电阻一端与LED或电源之间的铜箔走线,或者直接将这个1kΩ电阻焊下来。
  • 原理与计算:LED工作时需要约1.9V的压降。在3.7V供电下,这个1kΩ电阻两端的电压约为3.7V - 1.9V = 1.8V。根据欧姆定律 I = V/R,流经LED的电流为 1.8V / 1000Ω = 1.8mA。这是一个持续存在的、毫无意义的消耗。
  • 技巧:用万用表蜂鸣档确认要切断的线路。切断后,再用万用表测量LED两端是否还与VCC连通,确保彻底断开。

2. 拆除板载稳压芯片(LDO Regulator)

  • 操作:由于已采用电池直接供电,板载的5V转3.3V稳压芯片(如ME6211、AMS1117)不再需要,且其静态电流(约1-2mA)纯属浪费。用烙铁和吸锡器小心将其从板上移除。
  • 原理:线性稳压器(LDO)是通过内部电路“消耗”掉多余电压来稳压的,其自身就有静态工作电流。当输入输出电压差较大时(如5V转3.3V),这个电流可能达到1-2mA。
  • 详细步骤与避坑
    • 对于SOT-23等小封装,可以用堆锡法:在芯片三个引脚上堆上足量的焊锡,然后用烙铁头同时加热所有引脚,待焊锡全部熔化后,用镊子迅速将芯片夹走。
    • 对于稍大的封装,可以先用烙铁和镊子将芯片一侧的两个引脚轻轻撬起脱离焊盘,再处理另一侧。
    • 关键:移除芯片后,务必用万用表检查芯片焊盘之间是否有短路,并确认VCC输入焊盘与输出焊盘是否已经断开(它们之前是通过芯片内部连接的)。移除后,电池的正极就直接连接到原VCC输入焊盘或相关滤波电容的正极。
    • 空间利用:移除芯片后空出的位置,我常用来焊接一个轻触开关作为复位按钮,利用旁边的地平面(GND)铺铜来固定开关的一个引脚,非常方便。

完成效果:经过第一步和第二步的硬件改造,在1MHz频率、3.7V供电下,系统电流从最初的20mA(5V)降至约5.5mA。续航提升至15天左右。

3.3 第三步:优化USB上拉电阻电路(高阶技巧)

这是针对需要保留USB编程功能,但又想极致省电的进阶修改。

问题:Digispark板上的USB接口,其数据线D-需要通过一个上拉电阻(1.5kΩ或1kΩ,标记152或102)连接到VCC,以告知主机这是一个全速USB设备。这意味着,只要板子通电,即使不连接USB,这个电阻上就一直有电流从VCC流向D-线(通过一个3.7V左右的齐纳二极管到地)。计算:在5V时,电流 I = 5V / 1500Ω ≈ 3.3mA。在3.7V时,由于齐纳二极管特性,电流约为 (3.7V - 3.5V) / 1500Ω ≈ 0.13mA,加上二极管本身的漏电流,总损耗约0.7-1.1mA。

改造目标:将这个上拉电阻的供电源从“始终有电的VCC”改为“仅当插入USB时才有的USB_VBUS(USB电源线)”。操作步骤

  1. 定位:找到标记为152(1.5kΩ)或102(1kΩ)的电阻。用万用表确认其���端连接ATtiny85的VCC(Pin8),另一端连接USB接口的D-引脚。
  2. 断开:用刀片小心刮断该电阻连接ATtiny85 VCC那一侧的铜箔走线。此时,USB功能暂时失效。
  3. 重连:找到USB接口的电源正极(USB_VBUS)。在Micro USB接口上,通常是外侧的某个引脚;在USB-A母口板上,更容易识别。用万用表蜂鸣档,在板子通电时(注意安全!)测量USB接口引脚与板子5V网络的通断,找到那个插入USB才有电的引脚。
  4. 飞线:用一根细导线,将刚才断开的上拉电阻(原来接VCC的那一端)连接到刚刚找到的USB_VBUS点上。原理:改造后,上拉电阻仅在开发板插入USB线时才会得到供电,从而在电池供电时彻底切断这近1mA的消耗。

重要兼容性说明

  • Bootloader版本:此修改与Micronucleus 1.x版本Bootloader完全兼容。如果你刷写了新的2.x版Bootloader,必须确保刷写的是名称中带有“activePullup”的2.6.x版本。否则,USB可能无法正确枚举。
  • 刷写方法:在Arduino IDE中,通过“工具”->“开发板”->“Digispark”->“烧录引导程序”,选择“Micronucleus (recommended)”版本进行烧录,切勿选择默认或“aggressive”版本

此步后效果:在1MHz、3.7V下,系统电流进一步降至约1.6mA。如果程序再控制板载LED(Pin1)熄灭,电流就是纯芯片消耗,约1.6mA。此时用2000mAh电池,续航可达约52天。

4. 软件策略:让CPU“偷懒”的艺术

硬件改造奠定了低功耗的基础,但软件策略才是实现“超长待机”的灵魂。核心思想是:让CPU在无事可做时进入睡眠模式,并且睡得越“沉”越好。

4.1 第四步:用睡眠模式替代延时函数

这是最核心的软件优化。绝大多数低功耗应用的业务逻辑都是“采集-处理-睡眠”的循环,两次操作之间的间隔用delay()函数填充,这期间CPU空转,白白耗电。

原理:ATtiny85支持多种睡眠模式,最省电的是SLEEP_MODE_PWR_DOWN(掉电模式)。在此模式下,CPU核心、大多数时钟和外设都停止工作,电流消耗可降至微安级。我们需要一个“闹钟”来唤醒它,最常用的就是看门狗定时器(Watchdog Timer, WDT)。

关键代码实现与解析

#include <avr/sleep.h> #include <avr/wdt.h> // 声明一个全局变量,用于记录睡眠次数(调试用) volatile uint16_t sleepCount = 0; void setup() { // 启用睡眠功能,并设置为最深的掉电模式 sleep_enable(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); // ... 其他初始化代码 } void loop() { // 1. 执行你的主要任务,比如读取传感器 readSensor(); // 2. 任务完成,进入睡眠250毫秒 sleepWithWatchdog(WDTO_250MS, true); // 3. 被看门狗中断唤醒后,继续执行loop()下一轮循环 // 或者可以睡眠更久,比如2秒 // sleepWithWatchdog(WDTO_2S, true); } // 自定义睡眠函数 void sleepWithWatchdog(uint8_t wdtPrescaler, bool adjustMillis) { MCUSR = 0; // 清除复位标志,重要! ADCSRA &= ~ADEN; // 睡眠前关闭ADC,可节省约200µA! // 配置看门狗作为定时器中断(而非复位) wdt_enable(wdtPrescaler); // 设置看门狗超时时间 WDTCR |= _BV(WDIE); // 启用看门狗中断模式 sei(); // 开启全局中断 sleep_cpu(); // 进入睡眠,等待中断唤醒 // 从这里开始,是被看门狗中断唤醒后继续执行 wdt_disable(); // 立即禁用看门狗,防止它随后触发复位 ADCSRA |= ADEN; // 重新启用ADC(如果后续需要) // 调整Arduino的millis()计数器,因为睡眠期间定时器中断停止了 if (adjustMillis) { extern volatile unsigned long timer0_millis; // 访问Arduino内部计时变量 timer0_millis += computeSleepTime(wdtPrescaler); } } // 看门狗中断服务程序,唤醒CPU ISR(WDT_vect) { sleepCount++; // 可以在这里增加计数,但尽量保持简短 } // 根据看门狗预分频器计算实际睡眠的毫秒数 uint16_t computeSleepTime(uint8_t wdtPrescaler) { // WDTO_15MS, WDTO_30MS, ..., WDTO_8S 对应 0~9 // 计算基础睡眠时间(不含唤醒启动时间) uint16_t baseTime = 8000; // 从8秒开始 for (uint8_t i = 0; i < (9 - wdtPrescaler); ++i) { baseTime >>= 1; // 除以2 } return baseTime + 65; // 加上约65ms的唤醒启动时间 }

深度解析与避坑指南

  1. MCUSR = 0;的重要性:看门狗中断标志位(WDRF)存在于MCUSR寄存器中。如果不先清零,在某些情况下,唤醒后可能立即触发看门狗系统复位,导致程序重启。
  2. 关闭ADC:模拟数字转换器(ADC)模块及其内部基准电压源是睡眠时的耗电大户,约消耗200µA。务必在睡眠前用ADCSRA &= ~ADEN;关闭它,并在唤醒后根据需要重新开启(ADCSRA |= ADEN;)。
  3. 看门狗模式切换wdt_enable()函数会同时启用看门狗和系统复位功能(WDE)。我们用WDTCR |= _BV(WDIE);启用的是中断模式。唤醒后必须立刻调用wdt_disable()来清除WDE位,否则下一次看门狗超时将触发芯片复位,而不是中断。
  4. millis()校正:Arduino的millis()函数依赖定时器0(Timer0)的溢出中断。在掉电睡眠模式下,定时器时钟停止,millis()会停滞。唤醒后,我们需要手动将睡眠的时长加到timer0_millis这个内部变量上,以保持时间戳的连续性。这是adjustMillis参数的作用。
  5. 唤醒启动时间:从掉电模式唤醒到程序继续执行,需要约65ms(与熔丝位设置有关)。因此,用睡眠替代delay()时,只对大于80ms的延时有意义。如果业务间隔很短(如几毫秒),睡眠带来的省电收益可能抵不上唤醒开销。

实测效果:在1MHz、3.7V、关闭ADC进入掉电睡眠时,ATtiny85的电流可降至约20µA。如果使用一个200mAh的CR2032电池,仅维持睡眠的理论时间可达:200mAh / 0.02mA ≈ 10000小时,约13.7个月。这还只是纯睡眠,如果加上定期唤醒工作的平均功耗,续航会缩短,但依然非常可观。

4.2 第五步:优化外设与I/O引脚配置

睡眠模式省下了CPU的功耗,但芯片外围的“漏电”也不能忽视。

  1. 未使用的I/O引脚:悬空(浮空)的输入引脚会因感应噪声而在高、低电平间振荡,导致不必要的电流消耗。最佳实践是将所有未使用的引脚设置为输出低电平(pinMode(pin, OUTPUT); digitalWrite(pin, LOW);)或输出高电平(如果外部电路允许)。如果必须设置为输入,则启用内部上拉电阻(pinMode(pin, INPUT_PULLUP);),提供一个确定的电平。
  2. 禁用未使用的外设:除了ADC,如果项目不用到模拟比较器(Analog Comparator)、USI(通用串行接口)等,也应在初始化代码中将其禁用。相关寄存器位可以在ATtiny85的数据手册中找到。
  3. 降低工作频率:在setup()中,可以通过时钟预分频寄存器(CLKPR)来降低CPU主频。例如,CLKPR = 0x80; CLKPR = 0x03;可以将16MHz主频分频至2MHz。动态功耗与频率成正比,在满足性能需求的前提下,频率越低越好。对于仅需定时唤醒读个传感器的应用,1MHz甚至128kHz都足够。

5. 终极优化:熔丝位配置与极限微安世界

当你完成了以上所有步骤,系统睡眠电流可能还在20µA左右。想要进入个位数的微安(µA)世界,甚至接近芯片数据手册标称的0.3µA,就必须触碰芯片的配置熔丝位(Fuses)了。警告:熔丝位配置有风险,配置错误可能导致芯片锁死,需要高压编程器才能恢复!务必谨慎,并做好备份。

5.1 第六步:配置熔丝位以禁用BOD并优化启动

核心目标:禁用掉电检测(Brown-out Detection, BOD)

  • 原理:BOD是一个电压监控电路,当VCC电压低于某个阈值(如2.7V)时,它会强制芯片复位,防止在低压下运行导致不可预知的行为。但这个电路本身需要消耗电流(约10-20µA)。在电池供电应用中,我们通常通过软件监测电压,或者接受电池耗尽自然关机的行为,因此可以禁用BOD以节省这部分功耗。
  • 操作:需要使用ISP编程器(如USBasp)连接ATtiny85的SPI接口(RESET, MOSI, MISO, SCK)。不能通过USB(Micronucleus bootloader)修改熔丝位。常用的工具是avrdude命令行或图形化工具(如XLoaderAVRDUDESS)。
  • 关键熔丝位
    • BODLEVEL(Brown-out Detector trigger level): 设置为BOD_DISABLED(或对应值111).
    • SUT_CKSEL(启动时间和时钟选择): 选择适合你时钟源的选项。如果使用内部RC振荡器,可以选择较短的启动延迟(如SUT_0MS),这能将从睡眠唤醒的65ms启动时间减少到4ms左右,进一步降低唤醒期间的能耗。
  • 推荐配置脚本(通过avrdude):
    # 示例:为内部8MHz RC振荡器,禁用BOD,设置快速启动 avrdude -c usbasp -p t85 -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m -U efuse:w:0xFF:m
    注意:上述值(0xE2, 0xDF, 0xFF)仅为示例,必须根据你的具体芯片型号、时钟需求和开发环境(如Arduino核心使用的熔丝设置)进行计算和确认。错误的值会导致芯片无法编程或启动。

禁用BOD后的效果:睡眠电流从~20µA降至约5.5µA。其中,5µA是看门狗定时器(如果使能了看门狗中断作为唤醒源)的运行电流,0.5µA是芯片本身的漏电流。

5.2 向纳安级迈进:最后的障碍

数据手册宣称ATtiny85在掉电模式下最低可达0.3µA。如果你测得的电流远高于此(比如几十微安),可能的原因有:

  1. 看门狗定时器(WDT):如果使能了看门狗作为唤醒源,它会持续运行并消耗约5µA电流。如果应用允许,可以使用外部中断(如引脚电平变化中断)来唤醒,从而彻底关闭WDT。
  2. I/O引脚漏电:再次检查所有I/O引脚的状态。一个配置为输入且悬空的引脚,在特定环境下可能产生数微安的漏电流。
  3. PCB或外部元件漏电:检查你的电路板。焊接残留、受潮、劣质的阻容元件都可能产生漏电通路。肖特基二极管(如用于防止USB电源反灌的二极管)在反向电压下也有微小的漏电流(nA到µA级)。
  4. 测量误差:在测量µA级电流时,万用表本身的精度、表笔接触电阻、测试点的选择都会影响结果。建议将万用表串联在电池正极与板子VCC之间,并确保板子完全独立(不连接任何编程器或调试器)。

极限场景计算:假设我们实现了0.3µA的睡眠电流,并且每8秒唤醒一次,工作3毫秒(工作电流约2mA)。那么平均电流为:I_avg = (0.3µA * 7997ms + 2000µA * 3ms) / 8000ms ≈ 0.3µA + 0.75µA = 1.05µA这个平均电流已经非常低了。一颗200mAh的CR2032电池,理论续航时间为:200mAh / 0.00105mA ≈ 190,476小时 ≈ 21.7年当然,这是理想情况,忽略了电池自放电(CR2032年自放电率约1%)、温度影响、电路其他微小损耗等,但运行2-3年是完全可以期待的。

6. 实战问题排查与经验心得

在实际操作中,你肯定会遇到各种问题。下面是我总结的一些常见坑点和解决思路。

6.1 睡眠后无法唤醒或程序行为异常

  • 症状:芯片进入睡眠后,再也没有醒来,或者唤醒后程序跑飞。
  • 排查
    1. 中断向量表:确保你正确编写了中断服务程序(ISR),例如看门狗中断ISR(WDT_vect)。即使ISR里什么都不做,也必须存在,否则中断触发时程序会跳到错误地址。
    2. 全局中断开关:在调用sleep_cpu()之前,必须用sei()开启全局中断。但注意,有些库或代码可能在别处关闭了全局中断。
    3. 看门狗模式混淆:最易出错的一点。确保在睡眠函数中,唤醒后立即调用wdt_disable()。我的代码模板中,sleep_cpu()之后的第一条语句就是它。
    4. 栈溢出:如果ISR或睡眠函数使用了大量局部变量,可能导致栈溢出。尽量使用全局变量或静态变量在ISR内外传递数据,并保持ISR代码极其简短。

6.2 电流测量不准或优化后效果不明显

  • 症状:按照步骤做了,但万用表显示的电流还是很高(>100µA)。
  • 排查
    1. 测量方法:必须将万用表(电流档)串联在供电回路中。对于开发板,最简单的方法是断开VCC的跳线或焊点,将表笔串联进去。切勿并联在电源两端!
    2. 隐藏的电源路径:检查是否有其他方式在给芯片供电?比如,通过未配置的I/O引脚从外部电路反灌电流?编程接口(如ISP的MOSI/MISO)是否悬空?
    3. ADC未关闭:这是最常见的疏忽。一定要在每次进入睡眠前执行ADCSRA &= ~ADEN;,并在唤醒后需要时再打开。
    4. 库函数的影响:某些Arduino库在初始化时可能开启了你不需要的功能。仔细检查setup()中所有库的初始化调用,或者直接阅读库的源代码。

6.3 USB编程功能失效

  • 症状:进行硬件改造(特别是修改USB上拉电阻)或刷写Bootloader后,电脑无法识别Digispark。
  • 排查
    1. Bootloader版本:确认你刷写的Bootloader版本是否支持“主动上拉”(activePullup)模式。这是修改硬件连接后正常工作的关键。
    2. 物理连接:检查飞线是否连接牢固?USB_VBUS点是否找对?用万用表测量,插入USB时,飞线连接点是否有5V电压?
    3. 驱动问题:在Windows上,有时需要卸载旧驱动,重新安装Digispark的驱动(如libusb-win32)。
    4. 插入时机:Micronucleus Bootloader要求在上电后的几秒内插入USB。尝试先给板子上电,然后在Arduino IDE点击上传后,迅速插入USB线。

6.4 功耗与性能的权衡

低功耗优化本质上是做减法。你需要根据应用需求,做出明智的取舍:

  • 响应速度 vs 功耗:睡眠越深,唤醒时间越长。如果应用需要快速响应外部事件(如按键),可能不适合使用最深的PWR_DOWN模式,而应选择IDLEADC Noise Reduction等唤醒更快的模式,但功耗会相应增加。
  • 精度 vs 功耗:禁用BOD后,芯片在电压过低时不会自动复位,可能导致数据写入Flash时出错(如果涉及EEPROM操作)。如果数据完整性至关重要,可能需要保留BOD,或者实现更复杂的软件电压监控和掉电保护。
  • 开发便利性 vs 终极功耗:保留USB编程功能需要额外的电路和功耗。对于最终产品,可以考虑在编程后,彻底移除USB相关元件(包括上拉电阻和二极管),并使用ISP编程器进行后续更新,这将达到最极致的功耗水平。

7. 总结与扩展思路

经过这七个步骤的锤炼,你的ATtiny85项目已经从一只“电老虎”变成了“省电王”。从最初的20mA到最终的5.5µA,每一个数量级的下降���都对应着对硬件和软件更深一层的理解与控制。这个过程让我深刻体会到,嵌入式低功耗设计是一门在资源极度受限的条件下追求极致的艺术,它要求开发者既要有电路工程师的严谨,也要有软件架构师的全局思维。

回顾整个优化路径,其实是一个从外围到核心、从显性到隐性的过程:先解决板级外围电路(LED、LDO)的“傻耗电”,再优化供电和时钟这些系统级参数,然后通过软件架构让CPU最大限度地休息,最后深入到芯片配置层面关闭那些最深层的耗电模块。每一步都有明确的量化收益,这让优化工作非常有成就感。

在实际项目中,你未必需要走完所有七步。例如,如果你的设备每天只需工作几分钟,那么可能做到软件睡眠(第四步)就足够了。如果使用大容量电池,前几步的硬件改造也能带来显著的续航提升。关键是理解每一层优化背后的原理,然后根据你的具体需求(续航目标、电池容量、成本、开发难度)来制定合适的优化方案。

最后,再分享一个进阶技巧:动态电压频率调节(DVFS)。虽然ATtiny85不支持硬件DVFS,但我们可以通过软件模拟:在需要高性能计算时(如处理传感器数据),切换到较高频率和电压(如果使用可调稳压);在空闲时,切换到低频率和电压。这需要更复杂的电源管理和时钟切换代码,但对于一些计算任务不均衡的应用,可以进一步优化能耗效率。这或许可以作为你探索ATtiny85低功耗之旅的下一站。

http://www.jsqmd.com/news/948653/

相关文章:

  • TuxGuitar 终极免费吉他谱编辑软件:从零开始完全指南
  • 上饶新手卖黄金全攻略|避坑科普 + 本地靠谱变现渠道详解 - 润富黄金回收
  • Vivado FIFO IP核的Data Counts配置避坑指南:从Common Clock到Independent Clock的实战解析
  • 别再死记硬背了!用Multisim仿真带你搞懂多级放大电路的耦合方式(直接/阻容/光电)
  • 3步轻松备份语雀文档:告别数据丢失的终极指南
  • Windows 11任务栏歌词终极指南:如何优雅地在任务栏显示歌词
  • 实战应用:使用快马平台快速构建三极管光控开关仿真系统
  • 如何快速下载抖音无水印视频:douyin-downloader完整教程
  • Windows HEIC缩略图插件:深度解码苹果照片在Windows系统的无缝预览架构
  • 用Kotlin协程重构你的Socket客户端:告别传统线程,实现更优雅的异步网络通信
  • 5分钟快速上手:YaeAchievement原神成就导出终极免费指南
  • DeepSeek V4国产大模型实战部署:从边缘设备到政务云的全栈落地指南
  • 做烤鸭用什么成品料更好吃?这家调料配方让你轻松在家做出大众喜爱的口味 - 品牌2026
  • 大AI淘金热终极推演:卖铲子的人分四层,金子可能藏在六条暗河里
  • 告别重复劳动:用快马AI生成自动化脚本组件,极速提升工作效率
  • WorldWide Telescope:构建数字宇宙平台,赋能天文教学与科研探索
  • 从住宅到商业:建筑动画在多种地产业态中的应用实践
  • 保姆级教程:Halcon形状匹配find_shape_model参数调优避坑指南(从MinScore到Greediness)
  • 2026诚信甄选沧州市各区黄金白银回收实体店TOP排行|铂金彩金回收联系方式全收录 - 余生黄金回收
  • 技术大会深度研究法:从Build 2013看高效知识转化与工程实践
  • 告别Wi-Fi和蓝牙!用ESP32的ESP-NOW协议做个无线遥控小车(附完整Arduino代码)
  • PokitMeter万用表测试线损坏?手把手教你内部焊接改装与外壳适配
  • 为什么83%的AI评估项目6个月内失败?——头部金融机构内部复盘报告(限阅版)
  • DB-KAUNet:基于KAN的视网膜血管分割创新方案
  • 实测:天津大学校园网不拨号,网线直插就能跑满千兆?手把手教你开启IPv6的正确姿势
  • Vivado 2023.1 关联 Vscode 避坑全记录:从环境变量到插件配置,让你的FPGA开发流程更顺滑
  • RV1126开发板实战:手把手教你为双目摄像头(GC2053+GC2093)添加Linux驱动
  • Windows HEIC缩略图终极指南:如何在Windows资源管理器中高效预览iPhone照片
  • 精通Python视频编辑:5步实战掌握MoviePy核心技能
  • 从TinyALSA到AGM:深入理解高通AudioReach架构下的PCM设备变迁