数码之家

 找回密码
 立即注册
搜索
查看: 26441|回复: 43

[AVR] atmega328P 写入 Boot Loader的那点事

    [复制链接]
发表于 2019-6-11 19:55:32 | 显示全部楼层 |阅读模式
Arduino是开源的,这很好。想当年在学校时,每当考试时,同学们在考场上都不开源给我,所以学了BASIC、汇编、FOXBASIC、VB都跟没有学似的,看到满屏的字母只能笑。


这几天忽然对atmega328P的了兴趣,有位坛友也发了不少Arduino实验的贴子,但新买来的atmega328P大部分是没有引导程序BOOT LOADER的,必须进行烧写。
下面说说如何烧写。

一、初识atmega328P集成IC

新买来的328P不做特别说明的一般都是没有引导程序BootLoader的,这就要先对328P进行Boot Loader的烧写。下面就如何烧写进行说明。

(一)328P两种封装的脚位对应情况
atmega328P-AU封装脚位

atmega328P—PU封装脚位

ARDUINO 与两种封装脚位对应关系

要注意Arduino PIN和集成块的PIN是不同的。

(二)制作一个最小系统
以AU为例参考图

atmega328P-PU的最小系统情况

atmega328P-AU封装的使用转接板接出引脚




这时开始的棚搭

后来用面包板了
328AU的最小系统情况参考:




二、使用USB编程器

关键是设置熔丝位(FUSE)和找对相应的HEX文件。
这里使用的是51单片机的下载器

安装好驱动

与ARDUINO的接线关系

熔丝位和HEX文件的设置在IDE的安装目录中的boards.txt文件中可以找到。
1.找到相应的熔丝位

在IDE安装目录中..\arduino-nightly\hardware\arduino\avr找到boards.txt文件

这个文件用写字板打开,在“##”后可以找要烧写的“开发板”型号,下面就可以看到低位熔丝、高位熔丝、扩展位、加密位及bootloader.file(HEX文件)。

这是Nano Old Bootloader 的情况:
nano.menu.cpu.atmega328old=ATmega328P (Old Bootloader)
nano.menu.cpu.atmega328old.upload.maximum_size=30720
nano.menu.cpu.atmega328old.upload.maximum_data_size=2048
nano.menu.cpu.atmega328old.upload.speed=57600
nano.menu.cpu.atmega328old.bootloader.low_fuses=0xFF
nano.menu.cpu.atmega328old.bootloader.high_fuses=0xDA
nano.menu.cpu.atmega328old.bootloader.extended_fuses=0xFD
nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
nano.menu.cpu.atmega328old.build.mcu=atmega328p


2.连接好ISP线,插好USB下载器,打开progisp,

每项操作,下面的白色窗口都有反馈的,最后的操作在最上现一行显示。

选好片

3.Fuse设置好要点“写入”,然后点“读出”,确保与写入的一样才算写入了

4.调入Flash文件。根据
nano.menu.cpu.atmega328old.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
对应的bootloader文件在IDE的安装目录中可以找到:

..\arduino-nightly\hardware\arduino\avr\bootloaders\atmega


5.检查无误后,点“自动”,窗口最下面的“状态”有提示的


当下载好后,如果在D13上接有LED,LED会闪的。(只有Nano ATmega328P (old bootloader)会闪,UNO和Nano ATmega328P是不会闪的)
三、使用arduino as ISP方式
如果手上没有下载器,可以使用正常的Arduino UNO开发板作为烧写器给单片机芯片烧写BootLoader。
在这里采用一块Arduino UNO板作为烧写器,讲一下对328P进行Arduino BootLoader 的烧写。
(一)将Arduino UNO板(上位机)变成个ISP设备。
1.将作为烧写器的ArduinoUNO板通过USB线连接到电脑,打开ArduinoIDE 。
2.选择并设置好开发板型号、处理器及COM口。(注意要选择的型号为作为上位机的Arduino 型号)

3.在工具栏选择 —〉文件->示例—〉11.Arduino ISP —〉ArduinoISP,打开ArduinoISP程序,编译(验证)、下载到UNO开发板中。

4.在工具栏选择—〉工具—〉编程器—〉Arduino as ISP

到此,上位机就成了一个ISP下载器了。
(二)连接线路
连接好上位机与下位机的线,下位机的电源和地要与上位机连接。
在ArduinoISP 程序的73、85、86、87行给出了UNO板作为ISP的接线:
D10—〉RESET
D11—〉MOSI
D12—〉MISO
D13—〉SCK
对应接线情况:

如果上位机是Nano则在reset与地接一个10UF的电容(我试过4.7100uF都可以)。网上说UNO接这个电容,其实UNO不用接的。
(三)进行烧写
在工具栏选择—〉工具—〉烧录引导程序

6.等待完成

如果是Nano ATmega328P (oldbootloader)D13上接有LED,LED会闪的。
四、验证
(一)使用CH340等,通过TXRX下载程序进行验证
1.电路连接:
目标板上的RESET通过1K电阻上拉到VCC(5V)。RESET串10UF电容,接到CH340的DTR或RTS,可以自动下载。我接的是220UF的,稳定下载
如果没有串电容,等IDE提示“上传”时,RESET对地短路一下也可。就是按一下复位键。隔壁的图


2.选择并设置好开发板型号、处理器及COM口。(注意要选择的型号为刚烧写的Arduino 型号)为了区别示例的Blink,下载了一个“SOS”

(二)使用Arduino作为ISP上传
保持上面Arduino作为ISP设备的姿势(接线不要动)。
打开验证程序
在工具栏选择—〉项目—〉使用编程器上传

也可以按着shift键,用鼠标点上传图标(右箭头)


下载成功后观察。

当然可能用下图这个验证

下面这个是双灯。一个是SOS,一个是呼吸灯,同时闪

费心作了两个板子进行实验

下面这个上位机是NANO,所以在RESET与GND之间接了一个电容,

楼下对熔丝配置的说明,网上收集的
next

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 19家元 +356 收起 理由
玛德陛下 + 20 謝謝分享
锰子 + 20 謝謝分享
佳维 + 20 謝謝分享
myhaly + 16
eros8269 + 16
aping365 + 10
福源人 + 20
人艰不拆了 + 20
newnet1234 + 20 謝謝分享
kyhwhb + 20 優秀文章

查看全部打赏

 楼主| 发表于 2019-6-11 19:56:52 | 显示全部楼层
328P熔丝配置的说明

下面是NANO的熔丝位


下面是UNO的熔丝位


熔丝位配置:熔丝位 “0” = 已编程(允许); “1” = 未编程(禁止)
熔丝低位(low fuse):

1.CKDIV8
CKDIV8位是配置mcu时钟的8分频,出厂默认是0,如果你是用16MHz(arduino uno 和 nano默认时钟)的话需要将这位改成1。

2.CKOUT
CKOUT位允许系统时钟从PORTB0输出,一般默认1就行,不用去配。

3.复位启动时间选择
SUT 1/0:  当选择不同晶振时,SUT有所不同。如果没有特殊要求推荐SUT 1/0设置复位启动时间稍长,使电源缓慢上升。默认“01”

4.CKSEL3/0:时钟源选择(默认“0100”)
CLKSEL0、CLKSEL1、CLKSEL2、CLKSEL3用于选择系统的时钟源。有五种不同类型的时钟源可供选择(每种类型还有细的划分)。芯片出厂时的默认情况为CLKSEL3..0和SUT1..0分别是“0001”和“10”。即使用内部1MHz RC振荡器,使用最长的启动延时。这保证了无论外部振荡电路是否工作,都可以进行最初的ISP下载。对于CLKSEL3..0熔丝位的改写需要十分慎重,因为一旦改写错误,会造成芯片无法启动。

Low Power Crystal Oscillator                                   1111 – 1000
Full Swing Crystal Oscillator                             0111 – 0110
Low Frequency Crystal Oscillator                      0101 – 0100
Internal 128kHz RC Oscillator                            0011
Calibrated Internal RC Oscillator                        0010
External Clock 0000 Reserved                            0001
ATMEGA328P芯片出厂默认是8MHz再8分频,最终为1MHz的时钟。
而UNO默认是用16MHz外部晶振所以 CKSEL3/0= “1111”   SUT 1/0 = “11”

熔丝高位(high fuse):

1.RSTDISBL: 复位或I/O功能选择
为硬复位功能使能端,如果置0,可以将reset端做数字IO使用,这样会造成ISP的下载编程无法进行,因为在进入ISP方式编程时前,需要将RESET引脚拉低,使芯片先进入复位状态。所以这里置1。(此位如果配成0,芯片变板砖……)

2.DWEN:调试线使能
DWEN用来激活DW调试,默认未编程。

3.SPIEN:使能串行程序和数据下载(默认“0”)
使用ISP串行方式下载编程时,应配置SPIEN熔丝位为“0”。芯片出厂时SPIEN位的状态默认为“0”,表示允许ISP串行方式下载数据。只有该位处于编程状态“0”,才可以通过AVR的SPI口进行ISP下载,如果该位被配置为未编程“1”后,ISP串行方式下载数据立即被禁止,此时只能通过并行方式或JTAG编程方式才能将SPIEN的状态重新设置为“0”,开放ISP。一般保留其状态。

4.WDTON:是否一直启用看门狗
WDTON默认为“1”,即禁止看门狗的定时器始终开启。如果该位设置为“0”后,看门狗的定时器就会始终打开,不能被内部程序控制了,这是为了防止当程序跑飞时,未知代码通过写寄存器将看门狗定时器关断而设计的。一般我们的非工业制作都不使用看门狗功能,所以这里置1即可。

5.EESAVE: 执行芯片擦除时EEPROM 的内容保留
执行擦除命令时是否保留E2PROM中的内容,默认状态为“1”,表示E2PROM中的内容同Flash中的内容一同擦除。如果该位设置为“0”,对程序进行下载前的擦除命令只会对FLASH代码区有效,而对E2PROM区无效。这对于希望在系统更新程序时,需要保留E2PROM中数据的情况下是十分有用的。

6.BOOTSZ1/0: boot区大小
这两位确定了BOOTLOADER区的大小以及其起始的首地址。默认的状态为“00”,表示BOOTLOADER区为4096字,起始首地址为0xF000。
00:1024Word
01:512Word
10:256Word
11:128Word

7.BOOTRST: 复位向量选择
决定芯片上电起动时,第一条执行指令的地址。默认状态为“1”,表示起动时从0x0000开始执行。如果BOOTRST设置为“0”,则起动时从BOOTLOADER区的起始地址处开始执行程序。BOOTLOADER区的大小由BOOTSZ1和BOOTSZ0决定,因此其首地址也随之变化。
如果你的芯片里面烧写了bootloader并想要复位后从引导区开始,就需要配置此位0。
熔丝扩展位(extended fuse):

8.BODLEVEL 2/0:BOD触发电平
使用方法:如果启动掉电检测,则检测电平由BODLEVEL决定。一旦VCC下降到触发电平以下,MCU复位;当VCC电平大于触发电平后,经过tTOUT 延时周后重新开始工作。
BODLEVEL 2/0 熔丝位              BOD VOLT
111                                             禁用BOD
110                                            1.8V
101                                            2.7V
100                                             4.3V
另:扩展熔丝位只有BODLEVEL这3位。

最后你可以到boards.txt里看一下各板子的熔丝配置就可以知道每块板子是如何工作的。

现在知道UNO和NANO的默认熔丝配置了吧
UNO = FF-DE-FD (LOW-HIGH-EXT)
NANO = FF-DA-FD (LOW-HIGH-EXT)






后续:atmega328P 写入 Boot Loader的那点事 之 互相伤害
https://www.mydigit.cn/forum.php?mod=viewthread&tid=59096

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 14家元 +271 收起 理由
锰子 + 20 謝謝分享
佳维 + 20 謝謝分享
myhaly + 18
wjhwpp + 18
人艰不拆了 + 20
萧错 + 20 優秀文章
wska + 20
ch104517745 + 20
qrut + 20 優秀文章
cushion + 20 優秀文章

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-11 20:20:45 | 显示全部楼层
高手,绝对是高手

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-11 20:34:26 | 显示全部楼层
手持筷子围观楼主折腾:lol:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-11 21:29:10 | 显示全部楼层
恭喜精华了!
高级,没玩过,学习一下
等牙膏ing

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-11 21:50:49 | 显示全部楼层
请问楼主,能不能改Arduino IDE的配置文件,然后每次点Upload刷芯片的时候都能更新熔丝位?

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 歡迎探討 好像不行吧,这样的话不小心FUSE.

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 11:47:03 | 显示全部楼层
会玩单片机就是好哈哈

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享 我也小白一个 哈哈

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 12:13:04 | 显示全部楼层
只是不知道 熔丝 真的熔了么,,烧断后还能复活?:lol:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享 只是一种叫法,就是能使位而已.

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 13:21:26 | 显示全部楼层
看不懂,火钳刘明

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 14:08:31 | 显示全部楼层
这个精华必须的

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 17:49:03 | 显示全部楼层
考场上答题如果同学开源给你,该用啥协议呢:titter: 是否应该标明出处?还是强制继续开源给别人:lol:

打赏

参与人数 2家元 +12 收起 理由
jf201006 + 2 精彩回帖 所以我开源
oscillator + 10

查看全部打赏

回复 支持 2 反对 0

使用道具 举报

发表于 2019-6-12 18:16:43 | 显示全部楼层
f@tfox 发表于 2019-6-12 17:49
考场上答题如果同学开源给你,该用啥协议呢 是否应该标明出处?还是强制继续开源给别人 ...

我觉得WTFPL很合适

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-12 21:36:44 | 显示全部楼层

Arduino是开源的:smile:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享 是的,但很多国外开源的都被墙了.

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-13 09:06:58 | 显示全部楼层
以前刷mp3的时候没有售后的bootloader 安全没有办法,膜拜大神

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-13 19:49:20 | 显示全部楼层
mitchel 发表于 2019-6-11 21:50
请问楼主,能不能改Arduino IDE的配置文件,然后每次点Upload刷芯片的时候都能更新熔丝位?
...

好像不行吧,这样的话不小心FUSE就乱了

打赏

参与人数 1家元 +10 收起 理由
人艰不拆了 + 10 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-13 20:19:18 来自手机浏览器 | 显示全部楼层
复杂的一笔啊

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-13 21:45:22 | 显示全部楼层
我就是芯片变板砖那个:cry:,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个砖
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-14 09:05:09 来自手机浏览器 | 显示全部楼层
cbcb4cb 发表于 2019-6-13 21:45
我就是芯片变板砖那个,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个 ...

imax b6的主控是328p-AU,你烧写Boot Loader了吗?现在还能写入Fuse吗?试试用外部晶振救砖

打赏

参与人数 1家元 +10 收起 理由
人艰不拆了 + 10 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-14 09:29:06 | 显示全部楼层
虽然说了那么多年电子爱好者,但一直没学习编程,51也一直没学,最近买了STM32的,计划学习起来!

看你这个好像跟那个有点类似。。。

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享 进了门就好了,祝你成功!.

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-6-14 11:50:00 | 显示全部楼层
cbcb4cb 发表于 2019-6-13 21:45
我就是芯片变板砖那个,话说还有救吗,刷imax b6刷了一次然后1602没显示且不识别,换一个再刷,又一个 ...

用外部有源晶振就能救活。我也因为那个讨厌的熔丝位搞变砖过,用有源的晶振救活了。很久不碰atmega了,太麻烦了。

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 11:55 , Processed in 0.218400 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表