实践/固件编程

ATmega328P最小系统怎么烧录?用Arduino当ISP四步避坑

固件编程 2026-10-12 22:57:43 3阅读 5讨论 举报

自己攒小车或者机器人,用Arduino Uno打样的坑我踩了不少:一块板子几十块,焊个杜邦线到处飞,最后真正干活就一颗芯片。后来抠门的方法救了我——直接买一颗ATmega328P,几块钱,焊个最小系统就能当Arduino用,既省钱又能逼自己把原理搞明白。这篇把从焊最小系统到烧bootloader的坑一次说清楚。

最小系统到底要哪几样

ATmega328P的Datasheet上讲得很清楚,裸芯片工作除了供电,关键在时钟和复位。最省事的配齐方案是四样:一颗16MHz晶振、两个22pF瓷片电容、一个10kΩ上拉电阻,外加一个10μF电解电容做供电滤波。

接线按引脚来:VCC接5V,AVCC也要接5V,GND接第8脚和第22脚,RESET通过10kΩ上拉电阻接到5V防止芯片乱复位。16MHz晶振接在PB6和PB7两端,两个22pF电容分别接地。

这里有个偷懒选项:如果你没晶振和电容,可以把芯片配成内部8MHz振荡器,那是真正意义上的最小系统,连10kΩ都能省。但8MHz和16MHz的bootloader、熔丝位都不一样,新手还是老老实实上晶振最稳。

用另一块Arduino当ISP四步烧录

新买的ATmega328P是空白的,必须先烧bootloader才能像Arduino一样刷程序。最常见的做法是拿一块现成的Arduino当烧录器,Arduino官方管这叫Arduino as ISP。

第一步,在当编程板的Arduino上先上传一份ArduinoISP示例程序(文件菜单里示例代码,选ArduinoISP)。

第二步接线,编程板的D10接目标芯片的RESET,D11接MOSI,D12接MISO,D13接SCK,另外5V接VCC、GND接GND。千万别接反,MOSI和MISO接反了烧录器根本读不到芯片。

第三步,在Arduino IDE里,Tools-Board先选目标板类型(这里选Arduino Uno),Tools-Programmer选Arduino as ISP。

第四步,点Tools-Burn Bootloader,等它跑完提示Done burning bootloader就成了。烧完那四根接D10到D13的跳线可以拆下来。

想更省事直接用USBasp

如果不想占着一块好板子,十几块的USBasp烧录器更省事。六针接口对应:MOSI接MOSI、MISO接MISO、SCK接SCK、RST接RST、VCC和GND对应。接反一样烧芯片,接之前对一遍再通电。

Windows下先用Zadig给USBasp装驱动,驱动类型选libusb-win32,装好后在avrdude所在目录敲命令行。烧bootloader的典型命令是这样:

avrdude -c usbasp -p m328p -U flash:w:optiboot_atmega328.hex

这里最关键的坑是:芯片出厂默认跑1MHz内部振荡器,USBasp默认的SCK时钟太快读不到它,报错基本都在这。解决办法很简单,命令后面加个慢速参数-B 3,把烧录时钟降下来就通了。

熔丝位这个坑必须单独讲

烧bootloader这件事,躲不开熔丝位(fuse)。它决定了芯片用外部还是内部时钟、boot区占多大、要不要brown-out检测。选错熔丝,芯片可能直接「锁死」或跑错频率,这是新手最懵的地方。

用外部16MHz晶振的话,推荐这组:低熔丝位lfuse设0xFF,高熔丝位hfuse设0xDE(512字节boot区、SPI编程使能),扩展熔丝位efuse设0x05。

如果走内部8MHz方案,低熔丝位要设成0xE2,跟16MHz完全不一样。所以IDE里选板子不能随便选,选成外部时钟而实际没晶振,接下来它就不会跑。

怎么验证烧成功

烧完别急着高兴,拿一个CH340的UART转串口模块接上验证。串口模块的跳帽记得插到5V和GND挡(对外输出5V),RX接芯片TX、TX接芯片RX,注意交叉。

打开Arduino IDE,选好Arduino Uno和对应串口,上传一段最简单的代码,串口监视器能周期打印出Hello World,就说明bootloader烧对了,这颗芯片现在就是块能用的Arduino。

到这一步,你可以把烧录线全拆了,给最小系统单独供电,它就能独立跑程序。一整套下来成本不到十块,家里的机器人就能换上「新大脑」了。

总结一句:ATmega328P最小系统不难,难的是晶振、电容、熔丝位这几处细节。把上面四步走一遍,省下的时间就值回这篇字了。

版权声明:
作者:固件烧录仔
链接:https://www.aiddithome.com/p/8dd7dd16c26fd.html
来源:固件编程
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
5条评论
第三次终于亮了
1楼 · 6小时前

成本真的划算,一颗芯片几块钱,焊个最小系统顶一块Uno,省下的钱够多买几个舵机了,适合给小车当第二块脑子。

阿伟不emo
2楼 · 6小时前

16MHz晶振+两个22pF电容这个配置我照着焊过一遍,一次就点亮了。最坑的确实是RESET那个10kΩ上拉,漏了芯片就老自己复位,查了好久。

拆机党
3楼 · 6小时前

熔丝位那段太真实了,我第一颗就是被自己烧成8MHz还死活跑不动,后来才知道选板子选成Uno默认16MHz对外,根本对不上。

阿强焊点总飞
4楼 · 6小时前

USBasp加-B 3那招救命了,出厂1MHz内部振荡器这个坑我当时卡了一晚上,SCK太快一直识别不到芯片。

调参到凌晨
5楼 · 6小时前

请问验证的时候用CH340串口模块,除了跳帽插5V那个,RX和TX是不是一定要交叉接?我怕接一样了没反应。

本文作者
固件烧录仔
固件烧录仔 实践者
最近更新:2026-10-12 22:57