简介
- 最近为了方便折腾硬件CTF,于是准备用Atmega328P-PU搭建Arduino最小系统
- 需要用到的器件
- 面包板 x1
- Atmega328P-PU x 1
- USB转UART x1(建议有DTR引脚的,可以用来自动Reset)
- 22pF 陶瓷电容 x2
- 16 MHz晶振
- Arduino uno或者Arduino mini x1(用于给Atmega328P-PU芯片烧录bootloader)
- 导线(杜邦线,面包板线)
- 1µF (100nF) 陶瓷电容x2(可选)
- 10 kΩ电阻(可选)
- 二极管(可选)
开始
Atmega328P-PU的引脚定义如下图所示:
Arduino最小系统电路图
接下来根据上面的电路图来构造arduino最小系统,下图为使用的配件
首先,如下图所示,将16MHz的晶振连接atmega328p的第9和第10引脚
接着,如下图所示,用两个22 pF的陶瓷电容分别连接atmega328p的8-9和8-10(其中8脚为GND)
接着,如下图所示,将二极管的正极连接atmega328p的19引脚,负极连接22引脚(GND)
接着,如下图所示,将7脚(Vcc)和8脚(GND)引出,以便后面接入电源供电
接着如下图所示,在7脚(Vcc)和8脚(GND)之间连接一个1µF(100nF)的陶瓷电容
接着如下图所示,用10kΩ的电阻将1脚(Reset)与7脚(Vcc)相连,用一个1µF电容将1脚引出(用于后面与USB转UART串口的DTR引脚相连)
如下图所示,将USB转UART的GND和Vcc分别与atmega328p的GND和Vcc相连(注意需要5v输出,如果串口输出电压不对,可以选择给atmega328p独立供电,uart与atmega328p只连GND)
接着如下图所示,将UART的Tx与atmega328p的2脚(Rx)相连,UART的Rx与atmega328p的3脚(Tx)相连
接着如下图所示,将UART的DTR引脚与上面的1µF陶瓷电容与1脚串联
最小系统的电路至此构建完毕,但是由于此时atmega328p芯片没有bootloader程序,所以不能直接跑任何东西,需要先刷入bootloader程序
下面以Arduino Uno为例(Arduino mini等其它设备也可以),为atmega328p烧录bootloader
如下图所示,将Arduino Uno的10脚直接与atmega328p的1脚相连(这里不需要串联电容),将Arduino uno的11、12、13引脚依次与atmega328p的17、18、19引脚相连
将Arduino Uno和USB转UART连接到电脑(为atmega328p供电,可以独立供电)
如下图所示,打开ArduinoIDE,选择 文件 > 示例 > ArduinoISP,打开一个示例文件
接着选择 工具 > 开发板 > Arduino Uno
接着选择 工具 > 端口 > xxxx (Arduino Uno),选中Arduino Uno设备
选择 项目 > 上传(或者左上角上传按钮上传),将ArduinoISP上传到Arduino Uno,这样就可以用Arduino Uno来当作编程器为atmega328p烧录bootloader了
接着选择 工具 > 编程器 > Arduino as ISP
最后,如下图选择 工具烧录引导程序,等待烧录完成,即可为atmega328p刷入bootloader
断开Arduino Uno与电脑连接,拔掉Arduino Uno在面包板上的线恢复至最小系统电路图状态,如下图所示
ArduinoIDE中重新选择端口,选中你的USB转UART设备(不同USB转UART设备显示不一样),如下图
选择 文件 > 示例 > Basics > Blink打开一个示例项目
选择上传,此时不出意外,即可使用USB转串口给构造的Arduino最小系统上传一个程序
最终运行效果,如下图所示,二极管将每隔一段时间亮一次
结语
- 网上搜索了很多Arduino最小系统的相关教程,折腾了挺久,这里将我个人觉得比较好的方案记录下来
- 下一篇将基于这个最小系统,来解一道硬件CTF的题