Arduino IDE开发ATtiny44:从环境搭建到SPI编程实践
1. 从ATtiny系列单片机说起为什么是它如果你玩过Arduino Uno或者Nano对ATmega328P这颗芯片一定不陌生。但当你需要做一个超小型、超低功耗、功能又不太复杂的项目时比如一个纽扣大小的蓝牙防丢器、一个智能盆栽的土壤湿度监测模块或者一个简单的LED呼吸灯饰品再搬出那块“大板子”就显得有点杀鸡用牛刀了。这时候ATtiny系列就该登场了。ATtiny24/44/84是Microchip原Atmel公司推出的AVR系列8位微控制器中的“小个子”成员。这里的24/44/84主要区别在于闪存Flash容量2KB、4KB和8KB。别看容量小它们“五脏俱全”内置了ADC模数转换器、模拟比较器、多个定时器/计数器以及我们今天要重点用到的硬件SPI和USI通用串行接口。对于很多只需要读取一两个传感器、控制几个IO口、进行简单逻辑判断的应用来说这几KB的代码空间绰绰有余。更重要的是它们体积小巧常见封装如SOP-14、DIP-14功耗极低价格也相当亲民是嵌入式爱好者入门“芯片级”开发、体验“从单片机到系统”完整流程的绝佳选择。然而直接为ATtiny编写原生C代码、配置熔丝位、使用专门的编程器如USBasp进行烧录对于初学者来说门槛不低。寄存器配置、Makefile编写、烧录软件操作每一步都可能成为拦路虎。而Arduino IDE的出现以其近乎“一键式”的编程体验极大地降低了嵌入式开发的门槛。那么一个很自然的问题就来了能否用我们熟悉的Arduino IDE来开发这颗小小的ATtiny呢答案是肯定的。这不仅能让我们继续使用digitalWrite、analogRead、Serial.print这些亲切的函数还能借助Arduino庞大的库生态系统快速实现各种功能。本系列文章的目的就是带你绕过那些复杂的配置坑手把手在Arduino IDE里搭建起ATtiny的开发环境并点亮第一颗LED。2. 核心工具链拆解不只是安装一个“开发板”很多人以为在Arduino IDE里开发第三方芯片就是简单地添加一个“开发板管理器网址”然后点击安装。对于ATtiny这个过程确实始于这一步但其背后的原理远不止于此。理解这套工具链能帮助你在遇到问题时知道该从哪里入手排查。Arduino IDE本质上是一个高度集成化的编辑器和前端界面它背后调用的是完整的AVR-GCC工具链。当我们选择“Arduino Uno”时IDE知道它需要调用avr-g编译器针对atmega328p芯片使用特定的核心库arduino core for AVR并最终通过avrdude这个烧录工具经由板载的USB转串口芯片如CH340、ATmega16U2将程序上传。要让这套流程服务于ATtiny我们需要提供针对ATtiny的“核心定义”和“编程配置”。这就是由David A. Mellis等人维护的attiny核心包所做的事情。它主要包含以下几个关键部分板型定义文件 (boards.txt)这个文件告诉Arduino IDE存在一款叫“ATtiny24/44/84”的“开发板”。它定义了这块“板子”的关键参数build.mcuattiny44指定芯片型号、build.f_cpu8000000L指定内部RC振荡器频率这里是8MHz、upload.toolavrdude指定烧录工具以及最重要的——upload.protocolusbtiny指定烧录协议这里以USBasp为例。引脚映射文件 (pins_arduino.h)这是让digitalPinToPort等宏定义和analogRead函数在ATtiny上正常工作的关键。它建立了Arduino引脚编号如0,1,A0与ATtiny实际物理引脚如PB2,PA7之间的映射关系。没有这个文件你在代码里写pinMode(0, OUTPUT)编译器根本不知道0对应的是哪个芯片引脚。变体目录 (variants/)里面存放了针对不同ATtiny型号如tiny24,tiny44,tiny84的特定配置文件主要是上面提到的引脚映射文件。核心库的适配标准的Arduino AVR核心库是针对ATmega系列优化的有些函数或宏需要在ATtiny上进行调整或简化以确保能在资源受限的环境下运行。当我们通过开发板管理器安装attiny核心时实际上就是把这些文件下载到了Arduino IDE的“便携化环境”目录下。之后当你选择“ATtiny24/44/84”作为开发板时IDE就会自动调用对应的配置去编译和烧录。注意网络上存在多个版本的ATtiny核心包最常用且维护相对活跃的是由David A. Mellis创建现由Spence Konde维护的版本。确保你添加的网址是正确的以避免兼容性问题。3. 一步步搭建开发环境从零到可编译理解了原理实操就清晰了。下面我们进行详细的环境搭建。这里假设你使用的是Windows系统macOS和Linux用户操作类似主要是工具链安装和路径有所区别。3.1 安装Arduino IDE与USBasp驱动首先前往Arduino官网下载并安装最新版的Arduino IDE1.8.x或2.0.x均可。安装过程很简单一路下一步即可。接下来是硬件编程器。要給ATtiny烧录程序你需要一个编程器。最经济实惠的选择就是USBasp它在淘宝上售价通常不到十元。拿到USBasp后将其插入电脑USB口。Windows用户通常需要手动安装驱动。你可以使用Zadig这个通用驱动安装工具。以管理员身份运行Zadig在选项Options菜单中勾选“List All Devices”然后在设备下拉列表中找到“USBasp”确保右侧驱动程序选择“WinUSB”或“libusb-win32”点击“Replace Driver”或“Install Driver”即可。安装成功后在设备管理器中应能看到一个名为“USBasp”的设备。macOS/Linux用户系统通常自带libusb支持插入USBasp后在终端输入lsusbLinux或system_profiler SPUSBDataTypemacOS应能看到相关设备信息。可能需要将当前用户加入dialout或plugdev组以获取访问权限。3.2 添加ATtiny核心支持打开Arduino IDE进入“文件” - “首选项”。在“附加开发板管理器网址”一栏中点击右侧的图标添加以下网址这是目前最主流的ATtiny核心库地址https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json添加后点击“好”关闭首选项。接着点击“工具” - “开发板” - “开发板管理器...”。在弹出窗口的搜索框中输入“attiny”。你应该能看到一个名为“attiny by David A. Mellis”的条目。点击它然后选择版本建议安装最新版最后点击“安装”。安装过程可能会下载一些依赖需要保持网络通畅。安装完成后关闭开发板管理器。3.3 配置开发板选项与烧录参数现在点击“工具” - “开发板”你应该能在列表底部或“ATtiny Microcontrollers”分类下找到“ATtiny24/44/84”选项选择它。选择后“工具”菜单下的其他选项会随之变化你需要逐一进行正确配置处理器 (Processor)根据你手中实际的芯片型号选择比如“ATtiny44”。时钟 (Clock)这是非常关键的一步。ATtiny芯片内部有一个校准过的8MHz RC振荡器。我们选择“Internal 8 MHz”。这意味着单片机将以8MHz的频率运行。不要选择“External 20 MHz”之类的除非你确实在芯片的XTAL1/XTAL2引脚上外接了晶振。编程器 (Programmer)选择“USBasp”。这告诉IDE我们将使用USBasp作为烧录工具。烧录引导程序 (Burn Bootloader)对于ATtiny这个操作不是烧录Arduino Bootloader而是设置“熔丝位”(Fuses)。熔丝位决定了芯片的一些底层硬件配置比如时钟源、启动延时、看门狗等。点击“烧录引导程序”IDE会通过USBasp按照当前“时钟”选项的配置Internal 8 MHz来设置熔丝位。请务必在首次使用某块芯片或更改时钟设置后执行此操作。成功后会输出“烧录引导程序 完成。”的提示。实操心得很多新手会忽略“烧录引导程序”这一步导致程序上传后芯片不工作或者串口通信速率不对。对于ATtiny这一步的核心作用就是配置熔丝位将芯片时钟设置为内部8MHz RC振荡器并禁用时钟分频使芯片全速运行。这是程序能正确执行的基石。4. 硬件连接将USBasp与ATtiny正确对接软件配置好了现在需要把USBasp编程器和ATtiny芯片物理连接起来。ATtiny44的引脚排列以DIP-14封装为例需要你仔细核对。你需要连接以下六根线通常USBasp的10Pin排线会附带一个转接板上面标明了引脚功能USBasp引脚功能ATtiny44引脚 (DIP-14)备注MOSI主出从入 (数据输入)Pin 7 (PB0)编程时数据从USBasp流向ATtinyMISO主入从出 (数据输出)Pin 8 (PB1)编程时数据从ATtiny流向USBaspSCK串行时钟Pin 9 (PB2)提供通信时钟信号RST复位Pin 4 (PB3)用于进入编程模式通常需要接上拉电阻(10kΩ)到VCCVCC电源 (5V)Pin 1 (VCC)给ATtiny供电GND地Pin 14 (GND)共地连接注意事项电源确保USBasp为ATtiny提供稳定的5V电源。如果ATtiny外围电路复杂可能需要外部独立供电但需共地。复位引脚上拉ATtiny的RST引脚内部上拉可能较弱强烈建议在RST引脚和VCC之间连接一个10kΩ的上拉电阻以确保芯片稳定复位并能可靠进入编程模式。避开已用引脚SPI引脚MOSI, MISO, SCK在编程时被占用。如果你的应用中也使用了SPI例如驱动一个SPI显示屏需要注意在编程和正常运行时可能存在的冲突。一种常见的做法是在这些线上串联一个100欧姆左右的电阻或者在编程时暂时断开与外围SPI设备的连接。5. 编写并上传第一个测试程序点亮LED环境搭建和硬件连接的最后一步就是验证整个流程是否通畅。我们用一个最经典的“Blink”程序来测试但需要特别注意引脚映射。在Arduino IDE中新建一个草图。首先你需要知道ATtiny44的Arduino引脚编号。不同的核心包定义可能略有差异但通常你可以参考核心包自带的引脚图或者一个更简单的方法查看IDE中“工具” - “引脚排列图”。对于attiny核心常见的映射如下以ATtiny44 DIP-14为例物理引脚 5 (PA0) - Arduino 引脚 0 (Analog 0)物理引脚 6 (PA1) - Arduino 引脚 1 (Analog 1)物理引脚 7 (PB0) - Arduino 引脚 2物理引脚 8 (PB1) - Arduino 引脚 3... 以此类推。我们假设将一个LED串联一个220Ω限流电阻接在物理引脚6 (PA1) 上那么对应的Arduino引脚号就是1。在代码编辑区输入以下代码void setup() { // 将我们连接LED的引脚Arduino引脚1设置为输出模式 pinMode(1, OUTPUT); } void loop() { digitalWrite(1, HIGH); // 点亮LED delay(1000); // 等待1秒 digitalWrite(1, LOW); // 熄灭LED delay(1000); // 等待1秒 }保存草图。在上传之前确保“开发板”已选为“ATtiny24/44/84”。“处理器”已选对你的芯片型号如ATtiny44。“编程器”已选为“USBasp”。USBasp已正确连接到ATtiny芯片和电脑。点击“草图” - “使用编程器上传”或者直接按快捷键Ctrl Shift U。IDE会开始编译代码然后通过USBasp进行烧录。在输出窗口你应该看到类似这样的信息正在使用编程器 USBasp... avrdude: set SCK frequency to 375000 Hz avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions ... avrdude: verifying ... avrdude: 1024 bytes of flash verified avrdude done. Thank you.如果看到“上传成功”或类似的提示并且你的LED开始以1秒的间隔闪烁那么恭喜你ATtiny在Arduino IDE下的开发环境已经成功搭建并验证踩坑记录如果上传失败常见的错误及排查思路avrdude: error: could not find USB deviceUSBasp驱动未安装好或USBasp接触不良。重新插拔用Zadig检查驱动。avrdude: initialization failed, rc-1硬件连接错误特别是MOSI、MISO、SCK、RST这四根线。请仔细核对引脚顺序。RST引脚是否接了上拉电阻程序上传成功但LED不亮首先检查LED正负极是否接反限流电阻是否合适。其次确认你使用的引脚编号是否正确。最稳妥的方法是查阅你所安装核心包的具体引脚定义文件。最后用万用表测量该引脚在digitalWrite(1, HIGH)时是否输出高电平接近VCC电压。6. 深入理解时钟配置与熔丝位的那些事儿在上面的步骤中我们简单地选择了“Internal 8 MHz”并点击了“烧录引导程序”。这一步背后IDE到底做了什么这涉及到AVR单片机的“熔丝位”配置。熔丝位可以理解为芯片出厂后用户可以进行一次性配置的硬件开关它们控制着芯片最底层的行为。当我们选择“Internal 8 MHz”并烧录引导程序时IDE主要配置了以下两个关键的熔丝位字节以ATtiny44为例低位熔丝位 (LFUSE)主要配置时钟源和启动延时。CKDIV8熔丝这个熔丝默认为0编程状态表示使能“时钟8分频”。也就是说即使内部RC振荡器是8MHz系统时钟也会被分频到1MHz。这通常是为了降低功耗。我们的“Internal 8 MHz”选项会将此熔丝位设置为1未编程从而禁用分频让芯片运行在完整的8MHz下。SUT_CKSEL熔丝组这个组合用于选择时钟源和启动时间。对于内部8MHz RC振荡器并配合较短的启动延时其值通常被设置为0xE2二进制1110 0010。高位熔丝位 (HFUSE)主要配置复位使能、看门狗等。RSTDISBL熔丝这个熔丝如果被编程0则会禁用外部复位引脚PB3的功能将其变为一个普通IO口。这绝对是我们不想要的因为我们需要用这个引脚来烧录程序。所以必须确保此熔丝位是1未编程。我们的配置通常会保持其未编程状态。SPIEN熔丝这是使能SPI编程的熔丝必须保持为0编程状态否则我们将无法通过SPI接口即USBasp给芯片烧录程序了。万幸这个熔丝出厂默认就是编程状态且一般不建议改动。你可以通过点击“工具” - “烧录引导程序”后查看详细的输出信息里面会包含avrdude实际执行的命令其中就有设置熔丝位的具体参数。理解这些有助于你在未来需要自定义时钟比如使用外部晶振以获得更精确的串口通信时知道如何去手动配置熔丝位可以通过编写特定的avrdude命令行或使用一些高级插件。7. 超越Blink引脚功能与模拟读写的实践成功点亮LED只是第一步。ATtiny虽然小但功能不少。我们再来快速验证一下数字输入和模拟输入功能这能帮你更好地理解引脚映射。数字输入测试按键 将一个小按键或跳线帽连接在物理引脚5 (PA0) 和GND之间。在代码中这个引脚对应的Arduino编号是0。我们需要启用内部上拉电阻。const int buttonPin 0; // Arduino引脚0对应物理引脚PA0 const int ledPin 1; // 继续使用引脚1控制LED void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); // 设置为输入并启用内部上拉电阻 } void loop() { int buttonState digitalRead(buttonPin); if (buttonState LOW) { // 按键按下引脚被拉低 digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }上传代码后当按下按键时LED应该点亮松开则熄灭。这验证了数字输入和内部上拉电阻功能正常工作。模拟输入测试电位器 ATtiny44有8通道的10位ADC。我们用一个电位器三个引脚分别接VCC, GND和中间动臂来测试。将电位器的动臂连接到物理引脚11 (PA7)。根据引脚映射它可能对应A7或7模拟引脚编号。查阅核心定义通常A7就是它的模拟通道编号。const int potPin A7; // 模拟引脚A7对应物理引脚PA7 const int ledPin 1; void setup() { pinMode(ledPin, OUTPUT); // 模拟输入引脚无需显式设置pinMode但有些核心要求设为INPUT更安全 pinMode(potPin, INPUT); } void loop() { int sensorValue analogRead(potPin); // 读取0-1023的值 // 将ADC值映射为延时时间例如0-1023映射为50-250毫秒 int delayTime map(sensorValue, 0, 1023, 50, 250); digitalWrite(ledPin, HIGH); delay(delayTime); digitalWrite(ledPin, LOW); delay(delayTime); }上传代码后旋转电位器LED闪烁的频率应该随之改变。这验证了ADC功能正常工作。通过这两个简单的测试你已经掌握了在Arduino环境下操作ATtiny核心的输入输出功能。它们和标准Arduino板子的编程体验几乎一致这正是我们搭建这个环境的目的——降低底层硬件操作的复杂度让我们能更专注于项目逻辑的实现。

相关新闻

职场情绪管理:避免下班后情绪反刍的实用技巧

职场情绪管理:避免下班后情绪反刍的实用技巧

1. 职场情绪管理的核心认知误区那天晚上十点半,我盯着电脑屏幕右下角跳动的数字,胃里翻腾着晚餐没消化完的油腻感。项目上线失败的挫败感像块石头压在胸口,手指机械地滑动着微信群里的指责消息。突然意识到——这已经是我连续第三周用整个晚上…

2026/10/13 16:24:05 阅读更多 →
OPC模式解析:一人公司如何实现高效创业

OPC模式解析:一人公司如何实现高效创业

1. 项目概述:OPC模式的兴起与杭州实践最近在创业圈和自由职业者群体中,"OPC"这个概念突然火了起来。简单来说,OPC(One Person Company)指的是一种"一人公司"的商业模式,即个人通过合理…

2026/10/11 19:16:16 阅读更多 →
群体遗传学中的Tajima‘s D:原理、计算与生物学解读全解析

群体遗传学中的Tajima‘s D:原理、计算与生物学解读全解析

1. 项目概述:从“一个统计量”到理解群体历史的钥匙如果你在群体遗传学领域摸爬滚打过一阵子,肯定对Fst、Pi这些衡量遗传多样性的指标如数家珍。但当你第一次看到“Tajima‘s D”这个名词时,可能会有点懵——它不像前面那些指标那么直观&…

2026/10/13 4:17:44 阅读更多 →

最新新闻

SpringBoot+Vue智慧校园系统:角色权限与动态路由实战解析

SpringBoot+Vue智慧校园系统:角色权限与动态路由实战解析

简介:一套面向毕业设计的智慧校园管理系统源码与论文资料包,采用SpringbootVue技术栈,围绕个性化定制理念实现用户认证、课程管理、教务管理、校园通知、个人中心、系统管理等模块,适合需要完成类似选题或学习前后端分离开发的学生…

2026/10/14 22:40:09 阅读更多 →
Java多线程进阶路线:从线程安全到线程池的实战知识体系

Java多线程进阶路线:从线程安全到线程池的实战知识体系

我最近在整理之前写过的多线程系列笔记,数了数,光Thread相关的进阶笔记已经写到第12篇了。把这些零散知识回笼一下,心里有个感觉:多线程这东西,刚学的时候觉得无非就是new Thread、synchronized、Lock这些东西&#xf…

2026/10/14 22:40:09 阅读更多 →
Claude Code源码包实战:终端AI编程代理的架构解析与避坑指南

Claude Code源码包实战:终端AI编程代理的架构解析与避坑指南

简介:这份源码资料包面向希望借助AI提升编码效率的开发者与编程学习者,围绕Anthropic推出的Claude Code展开,系统梳理其代码理解、生成、调试优化、多语言支持与长上下文窗口等能力,并覆盖访问方式、典型应用场景、使用技巧、与Ch…

2026/10/14 22:40:09 阅读更多 →
厦门纯钛镜框选购全攻略:本土信赖之选——末禾MOHOE眼镜

厦门纯钛镜框选购全攻略:本土信赖之选——末禾MOHOE眼镜

在厦门配镜,职场人群挑选日常通勤的纯钛镜框、家长为孩子选购近视防控镜架时,普遍面临 “高价溢价” 与 “低价踩坑” 的两难:商场连锁品牌的进口镜框、纯钛镜架动辄数百上千元,营销溢价远高于产品本身价值;街边小店与…

2026/10/14 22:40:09 阅读更多 →
深入理解System V共享内存:多进程IPC高效通信实践与并发控制

深入理解System V共享内存:多进程IPC高效通信实践与并发控制

1. 共享内存是什么,为什么绕不开它搞过一段时间 Linux 服务端开发或者写过一些多进程程序的朋友,几乎都会撞上"进程间通信"这堵墙。进程和进程之间默认是各过各的,你改你的变量,我改我的变量,谁也看不见谁。…

2026/10/14 22:40:09 阅读更多 →
TCP拥塞控制实战指南:从慢启动到BBR的全链路优化

TCP拥塞控制实战指南:从慢启动到BBR的全链路优化

1. 为什么“拥塞控制”不是教科书里的抽象概念,而是你写的每一行TCP代码都在默默执行的生存法则很多人学完《计算机网络》教材里“慢启动”“拥塞避免”那几页,合上书就以为掌握了——直到某天自己写的后端服务在流量高峰时响应时间从50ms飙到2秒&#x…

2026/10/14 22:39:08 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →