1. 项目概述:为什么选择“光板”AVR128?
如果你玩腻了Arduino Uno或者Nano,想找一个更便宜、更灵活、引脚更多,并且能真正深入底层学习的微控制器开发板,那么市面上那些售价仅几十元的“光板”(Bare Bone)AVR128开发板绝对值得一试。我最初接触它,是因为一个需要大量GPIO(通用输入输出)引脚但预算极其有限的学生项目。与集成度高的Arduino开发板不同,这块板子上除了核心的ATmega128芯片、晶振、电源滤波和复位电路,几乎什么都没有——没有USB转串口芯片,没有稳压器,甚至连个像样的LED指示灯都得靠跳线帽选择是否接入。这种“极简”设计,恰恰是它的魅力所在,也是学习的绝佳起点。它迫使你从最基础的电源管理、编程接口连接开始思考,让你清晰地理解一个微控制器系统是如何从零搭建起来的。
这块板子的核心是Microchip(原Atmel)的ATmega128,这是一颗8位AVR架构的微控制器,拥有128KB的Flash、4KB的SRAM和53个可编程的GPIO引脚。相比ATmega328P(Arduino Uno的核心),它的资源要丰富得多。通过本指南,你将学会如何将这块“光秃秃”的板子,变成一个可以通过Arduino IDE方便编程的得力工具,并掌握其低功耗应用的潜力。整个过程涉及硬件选型、开发环境搭建、Bootloader烧录以及串口通信调试,是嵌入式入门到进阶的完美实践。
2. 硬件深度解析与连接实战
拿到一块AVR128光板,第一步不是急着写代码,而是把它看清楚、接明白。很多初学者在这里栽跟头,往往是因为忽略了电源和接口的细节。
2.1 板载资源与引脚功能映射
板子中央是ATmega128芯片,四周是四排引脚座,将所有芯片引脚引出。板子上丝印的标识是端口号(如PA0, PE1),而非Arduino的引脚编号,这是第一个需要转换思维的地方。
核心外设与跳线:
- 板载LED:通常连接在PA0和PA1(对应Arduino引脚44和43)。旁边有一个跳线帽(Jumper),拔掉即可断开LED与芯片的连接。这个设计非常贴心,当你需要将PA0/PA1用作模拟输入(ADC)或其它敏感功能时,LED及其限流电阻可能会干扰电路,断开即可解决。
- 时钟选择跳线:板载一个8MHz晶振,并通过一个跳线选择是否将其接入芯片的时钟引脚。旁边还有一个空的晶振插座,允许你焊接其他频率的晶振。对于低功耗应用,你可以选择使用内部RC振荡器或更低频率的外部晶振,这个跳线是关键。
- 电源输入:有一个类似Arduino的DC电源插座,但请注意,这里没有线性稳压器(如AMS1117)!输入电压会直接经过一个二极管和滤波电容后送到VCC引脚。ATmega128的工作电压范围是2.7V-5.5V,因此你必须确保输入电压严格在这个范围内,推荐使用稳定的5V或3.3V电源。直接接入9V适配器会瞬间烧毁芯片。
- ISP编程接口:这是一个6针或10针的标准AVR ISP接口,用于连接USBasp等编程器。它是我们给板子“注入灵魂”(烧录程序或Bootloader)的唯一初始途径。
- 复位电路:一个经典的RC复位电路,确保上电时产生稳定的复位脉冲。
引脚映射表: 这是编程的基础,必须熟记。Arduino IDE通过我们安装的“MegaCore”来识别这些映射。
| Arduino 引脚编号 | 芯片端口引脚 | 特殊功能备注 |
|---|---|---|
| 0 - 7 | PE0 - PE7 | UART0: Rx(1), Tx(0) |
| 8 - 15 | PB0 - PB7 | SPI: SS(8), SCK(9), MOSI(10), MISO(11) |
| 16, 17 | PG3, PG4 | 普通GPIO |
| 18 - 25 | PD0 - PD7 | UART1: Rx(18), Tx(19) |
| 26, 27 | PG0, PG1 | 普通GPIO |
| 28 - 35 | PC0 - PC7 | 普通GPIO |
| 36 | PG2 | 普通GPIO |
| 37 - 44 | PA7 - PA0 | 注意:顺序是反的!PA7对应37,PA0对应44。 |
| 45 - 52 (A0 - A7) | PF0 - PF7 | 模拟输入通道 |
重要提示:映射关系是“MegaCore”定义的,不同的核心(如原始的Arduino AVR Core)可能不同。务必确认你使用的是MegaCore。
2.2 必需的外围硬件与连接方法
你需要准备三样东西:
- AVR128开发板:从常见的在线平台均可购得。
- USBasp编程器:这是最经济可靠的AVR编程工具。购买时注意选择带10针或6针ISP排线的版本。
- USB转TTL串口模块:用于程序上传(在烧录Bootloader后)和串口通信。推荐使用CH340或CP2102芯片的模块,因其在各大操作系统上驱动兼容性好。务必选择带有DTR/RTS输出引脚的版本,这对后续实现自动复位至关重要。
首次连接步骤:
- 连接编程器:将USBasp的ISP排线连接到开发板的ISP接口。注意方向,通常排线红色线对应接口的1号引脚(有三角或圆点标记)。连接顺序是:VCC -> VCC, GND -> GND, MOSI -> MOSI, MISO -> MISO, SCK -> SCK, RST -> RST。
- 供电:此时,开发板可以通过USBasp的VCC引脚取电(如果USBasp支持供电)。但更稳妥的做法是,同时为开发板提供独立的5V电源。可以使用USB转TTL模块的5V输出,或者一个独立的5V稳压电源,连接到开发板的电源输入引脚。确保共地(GND连接在一起)。
- 检查跳线:确保时钟选择跳线连接了8MHz晶振,LED跳线可以根据需要连接或断开。
实操心得:在连接任何线缆前,先用万用表蜂鸣档检查一下USBasp排线的通断,劣质排线内部断线是常见故障。另外,首次上电前,再次确认供电电压是否为5V,可以避免“烟花事故”。
3. 软件开发环境搭建与核心配置
硬件连接妥当后,我们需要让Arduino IDE认识这块特殊的板子。
3.1 安装MegaCore
Arduino IDE默认不支持ATmega128,我们需要安装第三方硬件支持包。
- 打开Arduino IDE,进入
文件->首选项。 - 在“附加开发板管理器网址”中,填入以下URL:
如果有多个URL,用逗号分隔。https://mcudude.github.io/MegaCore/package_MCUdude_MegaCore_index.json - 点击“好”保存,然后打开
工具->开发板->开发板管理器...。 - 在搜索框中输入“MegaCore”,找到后点击安装。
安装完成后,你就能在工具->开发板列表中找到“MegaCore”分类下的“ATmega128”了。
3.2 驱动安装与设备识别
- USBasp驱动:在Windows系统上,首次插入USBasp可能需要安装驱动。推荐使用
Zadig工具为其安装libusb-win32或libusbK驱动,这样可以让avrdude(Arduino IDE背后的烧录工具)以通用方式识别它。在macOS和Linux上,通常无需额外驱动。 - USB转TTL驱动:根据你购买的模块芯片(CH340/CP2102/FT232等),去制造商官网下载对应操作系统的驱动并安装。安装成功后,在Arduino IDE的
工具->端口菜单中,应该能看到一个新的串口设备(如COM3或/dev/cu.usbserial-XXXX)。
验证连接: 插入USBasp,在Arduino IDE的工具->编程器菜单中,选择USBasp。然后点击工具->烧录引导程序。如果IDE下方状态栏显示“烧录引导程序完成”,且没有报错,说明USBasp连接和驱动一切正常。
4. 首次程序烧录与Bootloader植入
这是从“砖头”到“可编程设备”的关键一步。我们将分两步走:先用编程器烧录一个测试程序并同时写入Bootloader;之后就可以像普通Arduino一样用串口上传了。
4.1 通过USBasp烧录Blink程序
- 编写代码:打开经典的Blink示例,但需要修改引脚号。根据映射表,板载LED在PA0,即Arduino引脚44。
void setup() { pinMode(44, OUTPUT); // 将引脚44设置为输出模式 } void loop() { digitalWrite(44, HIGH); // 点亮LED delay(1000); digitalWrite(44, LOW); // 熄灭LED delay(1000); } - 配置IDE:
- 开发板:
ATmega128 - 时钟:
External 8 MHz(务必与板上跳线设置一致) - Bootloader:
Yes (UART0)(关键!这个选项会编译并烧录Bootloader) - 编程器:
USBasp - 端口:暂时无关,可以任意选或不选。
- 开发板:
- 执行烧录:不要点击常规的上传按钮(那个向右的箭头)。而是点击
项目->使用编程器上传。IDE会调用avrdude,通过USBasp将程序(包括Bootloader)一并烧录到芯片中。 - 观察结果:烧录过程会在下方控制台输出详细信息。成功后,你应该能看到板载LED开始闪烁。
注意事项:
使用编程器上传这个操作会擦除芯片的整个Flash,包括之前可能存在的Bootloader,然后写入新的程序。而工具->烧录引导程序仅烧录Bootloader区域。在本步骤中,因为我们选择了Bootloader: Yes (UART0),所以编译出的程序镜像已经包含了Bootloader代码,一次性完成。
4.2 验证串口通信与Bootloader
现在Bootloader已经就位,它监听在UART0(即PE1-Rx, PE0-Tx)。我们来测试一下。
- 编写串口测试程序:
void setup() { Serial.begin(9600); // 初始化串口0,波特率9600 } void loop() { Serial.println("Hello from AVR128!"); delay(1000); } - 连接USB转TTL模块:
- TX->PE1 (Arduino Pin 1, Rx)
- RX->PE0 (Arduino Pin 0, Tx)
- 5V->VCC
- GND->GND切记:模块的TX要接板子的RX,模块的RX要接板子的TX。
- 再次通过USBasp烧录:使用
项目->使用编程器上传,将上述串口测试程序烧录进去。 - 打开串口监视器:在IDE中选择USB转TTL模块对应的端口,设置波特率为9600。按下板子的复位按钮,你应该能在监视器中看到每秒输出的“Hello from AVR128!”信息。
至此,你已经完成了最基础的系统搭建。但每次上传都要接编程器太麻烦,接下来我们实现像Arduino一样的“一键上传”。
5. 实现自动复位:解放双手的关键一步
Arduino Uno能一键上传,是因为其USB转串口芯片的DTR引脚通过一个电容连接到MCU的复位引脚。当IDE开始上传数据时,会触发DTR信号,从而自动复位MCU进入Bootloader模式。我们的光板没有这个电路,需要手动添加。
5.1 手动复位上传法
在烧录好Bootloader后,你可以尝试用串口上传:
- IDE设置:
编程器改为AVR ISP(这是指通过串口使用Bootloader),端口选择你的USB转TTL模块。 - 点击上传按钮,当编译开始、进度条走到“上传”阶段时,迅速按下并按住板上的复位按钮。
- 等待编译完成(下方控制台显示“正在上传”时),立即松开复位按钮。
如果时机把握得好,上传会成功。但这非常依赖手感,且失败率高。
5.2 搭建自动复位电路(强烈推荐)
为了实现可靠的一键上传,我们需要利用USB转TTL模块的DTR引脚。
- 原理:DTR信号在串口通信开始时会有一个短暂的低电平脉冲。我们需要用一个电容将这个脉冲“延长”,使其达到足以让ATmega128识别为有效复位信号的长度。
- 电路连接:
- 将USB转TTL模块的DTR引脚,通过一个100nF(0.1uF)的陶瓷电容,连接到开发板ISP接口的RST引脚。
- 同时,确保USB转TTL模块和开发板共地。
- 为什么是100nF?这是一个经验值。原始Arduino Uno使用的就是100nF电容。但对于不同的MCU、不同的时钟和复位电路设计,所需的复位脉冲宽度可能不同。ATmega128在8MHz下,其最小复位脉冲宽度要求很低,100nF通常足够。如果发现自动复位不稳定(时而成功时而失败),可以尝试增大电容值,例如并联两个100nF变成200nF,或者使用一个470nF的电容。电容不宜过大,否则会导致复位信号过长,影响正常启动。
- 操作:连接好电容后,在IDE中点击上传,你会发现无需手动复位,程序就能自动上传成功。开发板会在上传结束后自动运行新程序。
避坑指南:如果你按照上述连接后自动复位无效,请按以下步骤排查:
- 确认DTR信号:有些劣质或简易的USB转TTL模块可能没有引出DTR引脚,或者该引脚功能不正常。用万用表测量,在上传开始时,DTR引脚电压应从高电平(约3.3V/5V)跳变为低电平(0V)再恢复。
- 检查电容极性:陶瓷电容无极性,但如果是电解电容,正极接DTR,负极接RST。
- 检查接线:确认DTR、电容、RST三者串联连接,没有虚焊或接触不良。
- 调整电容值:如前述,尝试更换为更大(如220nF)或更小(如47nF)的电容进行试验。
6. 低功耗特性初探与实践
AVR128光板的设计初衷之一就是低功耗。移除不必要的稳压器、LED等部件,本身就减少了静态功耗。结合ATmega128强大的睡眠模式,可以构建出续航极长的设备。
6.1 功耗对比实测
我们来做一个简单的对比测量:
- Arduino Uno:在运行空循环
void loop() {}时,由于板载的ATmega16U2 USB转串口芯片、稳压器、电源指示灯等都在耗电,整体电流通常在40-50mA左右。即使让主MCU进入深度睡眠,整板功耗也很难低于20mA。 - AVR128光板:仅连接5V电源,运行空循环,实测电流约为32mA。这个功耗主要来自ATmega128芯片本身和板上的晶振、滤波电容等。
6.2 启用睡眠模式
ATmega128支持多种睡眠模式,最常用的是SLEEP_MODE_PWR_DOWN(掉电模式),在此模式下,几乎所有时钟都停止,功耗降至最低。
#include <avr/sleep.h> #include <avr/power.h> void setup() { // 关闭所有未使用的模块以省电 power_all_disable(); // 关闭ADC, Timer, USART等 // 配置一个唤醒源,例如外部中断 // EICRA |= (1 << ISC00); // 设置INT0为任何逻辑变化触发 // EIMSK |= (1 << INT0); // 使能INT0中断 } void loop() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); // 进入睡眠 // 程序从这里继续执行,当被中断唤醒后 sleep_disable(); // 这里可以执行一些唤醒后的任务,例如读取传感器 // ... delay(1000); // 模拟工作 // 然后再次进入睡眠 }在掉电模式下,配合关闭所有外设(power_all_disable()),AVR128的电流消耗可以轻松降低到10微安(μA)级别。这意味着两节AA电池(约2000mAh容量)可以支撑设备工作数年。
6.3 低功耗设计要点
- 断开所有无关负载:拔掉LED跳线帽。如果使用了外部传感器,确保它们在睡眠时可以被MCU引脚切断供电或进入自身睡眠模式。
- 降低时钟频率:如果应用对速度不敏感,可以使用板载的空晶振插座焊接一个32.768kHz的钟表晶振,并通过跳线选择它。在软件中配置为使用这个低速时钟,功耗会进一步大幅下降。
- 关闭ADC:ADC模块是耗电大户,在进入睡眠前务必关闭(
power_adc_disable())。 - 配置未用引脚:将未使用的GPIO引脚设置为输出模式并输出低电平,或者设置为输入模式并启用内部上拉电阻,以防止引脚悬空产生漏电流。
7. 高级应用与故障排查
掌握了基础编程和低功耗后,你可以探索更多功能。
7.1 多串口与硬件资源利用
ATmega128拥有两个硬件USART(UART0和UART1)。这在需要同时与两个串口设备(如GPS和蓝牙模块)通信时非常有用。在Arduino环境中,可以使用Serial(对应UART0)和Serial1(对应UART1)。
void setup() { Serial.begin(9600); // UART0 Serial1.begin(115200); // UART1 } void loop() { if (Serial1.available()) { char data = Serial1.read(); Serial.print("Received from UART1: "); Serial.println(data); } }7.2 常见问题与解决方案速查表
| 问题现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| USBasp编程失败 | 1. 驱动未正确安装。 2. 接线错误或接触不良。 3. 目标板未供电或电压不对。 4. 编程器选择错误。 | 1. 在设备管理器中检查USBasp是否被识别为libusb-win32设备,或用lsusb(Linux/macOS)查看。2. 用万用表检查ISP线缆每一根线的连通性,确认VCC电压为5V。 3. 尝试为开发板单独提供5V电源。 4. 在 工具->编程器中确认选择的是USBasp。 |
| 烧录Bootloader后串口无法上传 | 1. 时钟设置不匹配。 2. Bootloader损坏。 3. 串口接线错误。 4. DTR自动复位电路未生效。 | 1.最重要!检查工具->时钟选项是否与板上跳线设置一致(如External 8 MHz)。2. 尝试用USBasp重新执行 烧录引导程序。3. 确认TX->RX, RX->TX交叉连接。 4. 尝试手动复位上传法,或检查DTR电容连接和值。 |
| 程序运行不稳定或复位 | 1. 电源噪声或电压不足。 2. 看门狗(Watchdog)未禁用或未处理。 3. 堆栈溢出。 | 1. 在VCC和GND之间并联一个100uF电解电容和一个100nF陶瓷电容进行滤波。 2. 在 setup()开头添加wdt_disable();(需#include <avr/wdt.h>)。3. 避免在函数内定义过大的局部数组,使用全局变量或动态内存需谨慎。 |
| 功耗高于预期 | 1. 未使用的模块未关闭。 2. 引脚配置不当产生漏电流。 3. 外部电路耗电。 | 1. 使用power_all_disable()并在需要时再power_xx_enable()。2. 按照6.3节配置未用引脚。 3. 断开所有外部连接,单独测量MCU核心板电流。 |
| IDE无法识别串口 | 1. USB转TTL驱动未安装。 2. 模块损坏或线缆问题。 3. 端口被其他软件占用。 | 1. 根据模块芯片型号重新安装驱动。 2. 换一个USB口或换一个模块测试。 3. 关闭所有可能占用串口的软件(如其他串口助手、Putty等)。 |
从一块看似简陋的“光板”出发,我们完成了从硬件认识到软件环境搭建,从手动烧录到实现自动上传,再到探索其低功耗特性的完整旅程。这个过程里,最宝贵的不是最终让LED闪烁起来,而是你亲手连接每一根线、理解每一个配置选项、解决每一个报错信息的实践经历。AVR128光板就像一张白纸,给了你最大的自由度和学习空间。当你下次面对一个集成度更高的商业开发板时,你会清楚地知道,在那些友好的封装之下,无非也就是电源、时钟、复位、编程接口这些基础单元在协同工作。这种从底层构建系统的能力,正是嵌入式开发者区别于纯软件应用开发者的核心价值所在。我自己的好几款低功耗传感器节点原型,都是基于这块板子搭建的,成本可控,功能足够,何乐而不为呢?如果你在复现过程中遇到任何独特的问题,不妨从电源和时钟这两个最基础的信号开始查起,八成都能找到答案。